summaryrefslogtreecommitdiff
path: root/chromium/v8/src/builtins/builtins-proxy-gen.cc
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2018-01-31 16:33:43 +0100
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2018-02-06 16:33:22 +0000
commitda51f56cc21233c2d30f0fe0d171727c3102b2e0 (patch)
tree4e579ab70ce4b19bee7984237f3ce05a96d59d83 /chromium/v8/src/builtins/builtins-proxy-gen.cc
parentc8c2d1901aec01e934adf561a9fdf0cc776cdef8 (diff)
downloadqtwebengine-chromium-da51f56cc21233c2d30f0fe0d171727c3102b2e0.tar.gz
BASELINE: Update Chromium to 65.0.3525.40
Also imports missing submodules Change-Id: I36901b7c6a325cda3d2c10cedb2186c25af3b79b Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
Diffstat (limited to 'chromium/v8/src/builtins/builtins-proxy-gen.cc')
-rw-r--r--chromium/v8/src/builtins/builtins-proxy-gen.cc100
1 files changed, 100 insertions, 0 deletions
diff --git a/chromium/v8/src/builtins/builtins-proxy-gen.cc b/chromium/v8/src/builtins/builtins-proxy-gen.cc
index 2d81867d512..64e838d53ac 100644
--- a/chromium/v8/src/builtins/builtins-proxy-gen.cc
+++ b/chromium/v8/src/builtins/builtins-proxy-gen.cc
@@ -126,6 +126,106 @@ TF_BUILTIN(ProxyConstructor_ConstructStub, ProxiesCodeStubAssembler) {
ThrowTypeError(context, MessageTemplate::kProxyHandlerOrTargetRevoked);
}
+Node* ProxiesCodeStubAssembler::CreateProxyRevokeFunctionContext(
+ Node* proxy, Node* native_context) {
+ Node* const context = Allocate(FixedArray::SizeFor(kProxyContextLength));
+ StoreMapNoWriteBarrier(context, Heap::kFunctionContextMapRootIndex);
+ InitializeFunctionContext(native_context, context, kProxyContextLength);
+ StoreContextElementNoWriteBarrier(context, kProxySlot, proxy);
+ return context;
+}
+
+Node* ProxiesCodeStubAssembler::AllocateProxyRevokeFunction(Node* proxy,
+ Node* context) {
+ Node* const native_context = LoadNativeContext(context);
+
+ Node* const proxy_context =
+ CreateProxyRevokeFunctionContext(proxy, native_context);
+ Node* const revoke_map = LoadContextElement(
+ native_context, Context::STRICT_FUNCTION_WITHOUT_PROTOTYPE_MAP_INDEX);
+ Node* const revoke_info =
+ LoadContextElement(native_context, Context::PROXY_REVOKE_SHARED_FUN);
+
+ return AllocateFunctionWithMapAndContext(revoke_map, revoke_info,
+ proxy_context);
+}
+
+TF_BUILTIN(ProxyRevocable, ProxiesCodeStubAssembler) {
+ Node* const target = Parameter(Descriptor::kTarget);
+ Node* const handler = Parameter(Descriptor::kHandler);
+ Node* const context = Parameter(Descriptor::kContext);
+ Node* const native_context = LoadNativeContext(context);
+
+ Label throw_proxy_non_object(this, Label::kDeferred),
+ throw_proxy_handler_or_target_revoked(this, Label::kDeferred),
+ return_create_proxy(this);
+
+ GotoIf(TaggedIsSmi(target), &throw_proxy_non_object);
+ GotoIfNot(IsJSReceiver(target), &throw_proxy_non_object);
+ GotoIfRevokedProxy(target, &throw_proxy_handler_or_target_revoked);
+
+ GotoIf(TaggedIsSmi(handler), &throw_proxy_non_object);
+ GotoIfNot(IsJSReceiver(handler), &throw_proxy_non_object);
+ GotoIfRevokedProxy(handler, &throw_proxy_handler_or_target_revoked);
+
+ Node* const proxy = AllocateProxy(target, handler, context);
+ Node* const revoke = AllocateProxyRevokeFunction(proxy, context);
+
+ Node* const result = Allocate(JSProxyRevocableResult::kSize);
+ Node* const result_map = LoadContextElement(
+ native_context, Context::PROXY_REVOCABLE_RESULT_MAP_INDEX);
+ StoreMapNoWriteBarrier(result, result_map);
+ StoreObjectFieldRoot(result, JSProxyRevocableResult::kPropertiesOrHashOffset,
+ Heap::kEmptyFixedArrayRootIndex);
+ StoreObjectFieldRoot(result, JSProxyRevocableResult::kElementsOffset,
+ Heap::kEmptyFixedArrayRootIndex);
+ StoreObjectFieldNoWriteBarrier(result, JSProxyRevocableResult::kProxyOffset,
+ proxy);
+ StoreObjectFieldNoWriteBarrier(result, JSProxyRevocableResult::kRevokeOffset,
+ revoke);
+ Return(result);
+
+ BIND(&throw_proxy_non_object);
+ ThrowTypeError(context, MessageTemplate::kProxyNonObject);
+
+ BIND(&throw_proxy_handler_or_target_revoked);
+ ThrowTypeError(context, MessageTemplate::kProxyHandlerOrTargetRevoked);
+}
+
+// Proxy Revocation Functions
+// https://tc39.github.io/ecma262/#sec-proxy-revocation-functions
+TF_BUILTIN(ProxyRevoke, ProxiesCodeStubAssembler) {
+ Node* const context = Parameter(Descriptor::kContext);
+
+ // 1. Let p be F.[[RevocableProxy]].
+ Node* const proxy_slot = IntPtrConstant(kProxySlot);
+ Node* const proxy = LoadContextElement(context, proxy_slot);
+
+ Label revoke_called(this);
+
+ // 2. If p is null, ...
+ GotoIf(IsNull(proxy), &revoke_called);
+
+ // 3. Set F.[[RevocableProxy]] to null.
+ StoreContextElement(context, proxy_slot, NullConstant());
+
+ // 4. Assert: p is a Proxy object.
+ CSA_ASSERT(this, IsJSProxy(proxy));
+
+ // 5. Set p.[[ProxyTarget]] to null.
+ StoreObjectField(proxy, JSProxy::kTargetOffset, NullConstant());
+
+ // 6. Set p.[[ProxyHandler]] to null.
+ StoreObjectField(proxy, JSProxy::kHandlerOffset, NullConstant());
+
+ // 7. Return undefined.
+ Return(UndefinedConstant());
+
+ BIND(&revoke_called);
+ // 2. ... return undefined.
+ Return(UndefinedConstant());
+}
+
TF_BUILTIN(CallProxy, ProxiesCodeStubAssembler) {
Node* argc = Parameter(Descriptor::kActualArgumentsCount);
Node* argc_ptr = ChangeInt32ToIntPtr(argc);