diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2018-01-31 16:33:43 +0100 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2018-02-06 16:33:22 +0000 |
commit | da51f56cc21233c2d30f0fe0d171727c3102b2e0 (patch) | |
tree | 4e579ab70ce4b19bee7984237f3ce05a96d59d83 /chromium/v8/src/builtins/builtins-proxy-gen.cc | |
parent | c8c2d1901aec01e934adf561a9fdf0cc776cdef8 (diff) | |
download | qtwebengine-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.cc | 100 |
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); |