5 #include "src/builtins/builtins-proxy-gen.h" 6 #include "src/builtins/builtins-utils-gen.h" 7 #include "src/builtins/builtins-utils.h" 8 #include "src/builtins/builtins.h" 10 #include "src/counters.h" 11 #include "src/objects-inl.h" 16 void ProxiesCodeStubAssembler::GotoIfRevokedProxy(Node*
object,
17 Label* if_proxy_revoked) {
18 Label proxy_not_revoked(
this);
19 GotoIfNot(IsJSProxy(
object), &proxy_not_revoked);
20 Branch(IsJSReceiver(CAST(LoadObjectField(
object, JSProxy::kHandlerOffset))),
21 &proxy_not_revoked, if_proxy_revoked);
22 BIND(&proxy_not_revoked);
25 Node* ProxiesCodeStubAssembler::AllocateProxy(Node* target, Node* handler,
27 VARIABLE(map, MachineRepresentation::kTagged);
29 Label callable_target(
this), constructor_target(
this), none_target(
this),
32 Node* nativeContext = LoadNativeContext(context);
34 Branch(IsCallable(target), &callable_target, &none_target);
36 BIND(&callable_target);
40 GotoIf(IsConstructor(target), &constructor_target);
42 LoadContextElement(nativeContext, Context::PROXY_CALLABLE_MAP_INDEX));
45 BIND(&constructor_target);
47 map.Bind(LoadContextElement(nativeContext,
48 Context::PROXY_CONSTRUCTOR_MAP_INDEX));
53 map.Bind(LoadContextElement(nativeContext, Context::PROXY_MAP_INDEX));
58 Node* proxy = Allocate(JSProxy::kSize);
59 StoreMapNoWriteBarrier(proxy, map.value());
60 StoreObjectFieldRoot(proxy, JSProxy::kPropertiesOrHashOffset,
61 RootIndex::kEmptyPropertyDictionary);
62 StoreObjectFieldNoWriteBarrier(proxy, JSProxy::kTargetOffset, target);
63 StoreObjectFieldNoWriteBarrier(proxy, JSProxy::kHandlerOffset, handler);
68 Node* ProxiesCodeStubAssembler::AllocateJSArrayForCodeStubArguments(
69 Node* context, CodeStubArguments& args, Node* argc, ParameterMode mode) {
70 Comment(
"AllocateJSArrayForCodeStubArguments");
72 Label if_empty_array(
this), allocate_js_array(
this);
74 VARIABLE(elements, MachineRepresentation::kTagged);
76 TNode<Smi> length = ParameterToTagged(argc, mode);
77 GotoIf(SmiEqual(length, SmiConstant(0)), &if_empty_array);
79 Label if_large_object(
this, Label::kDeferred);
80 Node* allocated_elements = AllocateFixedArray(PACKED_ELEMENTS, argc, mode,
81 kAllowLargeObjectAllocation);
82 elements.Bind(allocated_elements);
84 VARIABLE(index, MachineType::PointerRepresentation(),
85 IntPtrConstant(FixedArrayBase::kHeaderSize - kHeapObjectTag));
86 VariableList list({&index}, zone());
88 GotoIf(SmiGreaterThan(length, SmiConstant(FixedArray::kMaxRegularLength)),
90 args.ForEach(list, [=, &index](Node* arg) {
91 StoreNoWriteBarrier(MachineRepresentation::kTagged, allocated_elements,
93 Increment(&index, kPointerSize);
95 Goto(&allocate_js_array);
97 BIND(&if_large_object);
99 args.ForEach(list, [=, &index](Node* arg) {
100 Store(allocated_elements, index.value(), arg);
101 Increment(&index, kPointerSize);
103 Goto(&allocate_js_array);
107 BIND(&if_empty_array);
109 elements.Bind(EmptyFixedArrayConstant());
110 Goto(&allocate_js_array);
113 BIND(&allocate_js_array);
115 Node* native_context = LoadNativeContext(context);
116 TNode<Map> array_map =
117 LoadJSArrayElementsMap(PACKED_ELEMENTS, native_context);
118 TNode<JSArray> array =
119 AllocateUninitializedJSArrayWithoutElements(array_map, length);
120 StoreObjectFieldNoWriteBarrier(array, JSObject::kElementsOffset,
126 Node* ProxiesCodeStubAssembler::CreateProxyRevokeFunctionContext(
127 Node* proxy, Node* native_context) {
128 Node*
const context = Allocate(FixedArray::SizeFor(kProxyContextLength));
129 StoreMapNoWriteBarrier(context, RootIndex::kFunctionContextMap);
130 InitializeFunctionContext(native_context, context, kProxyContextLength);
131 StoreContextElementNoWriteBarrier(context, kProxySlot, proxy);
135 Node* ProxiesCodeStubAssembler::AllocateProxyRevokeFunction(Node* proxy,
137 Node*
const native_context = LoadNativeContext(context);
139 Node*
const proxy_context =
140 CreateProxyRevokeFunctionContext(proxy, native_context);
141 Node*
const revoke_map = LoadContextElement(
142 native_context, Context::STRICT_FUNCTION_WITHOUT_PROTOTYPE_MAP_INDEX);
143 Node*
const revoke_info =
144 LoadContextElement(native_context, Context::PROXY_REVOKE_SHARED_FUN);
146 return AllocateFunctionWithMapAndContext(revoke_map, revoke_info,
151 TF_BUILTIN(ProxyConstructor, ProxiesCodeStubAssembler) {
152 Node* context = Parameter(Descriptor::kContext);
155 Node* new_target = Parameter(Descriptor::kJSNewTarget);
156 Label throwtypeerror(
this, Label::kDeferred), createproxy(
this);
157 Branch(IsUndefined(new_target), &throwtypeerror, &createproxy);
159 BIND(&throwtypeerror);
161 ThrowTypeError(context, MessageTemplate::kConstructorNotFunction,
"Proxy");
168 Node* target = Parameter(Descriptor::kTarget);
169 Node* handler = Parameter(Descriptor::kHandler);
177 Label throw_proxy_non_object(
this, Label::kDeferred),
178 throw_proxy_handler_or_target_revoked(
this, Label::kDeferred),
179 return_create_proxy(
this);
181 GotoIf(TaggedIsSmi(target), &throw_proxy_non_object);
182 GotoIfNot(IsJSReceiver(target), &throw_proxy_non_object);
183 GotoIfRevokedProxy(target, &throw_proxy_handler_or_target_revoked);
185 GotoIf(TaggedIsSmi(handler), &throw_proxy_non_object);
186 GotoIfNot(IsJSReceiver(handler), &throw_proxy_non_object);
187 GotoIfRevokedProxy(handler, &throw_proxy_handler_or_target_revoked);
199 Return(AllocateProxy(target, handler, context));
201 BIND(&throw_proxy_non_object);
202 ThrowTypeError(context, MessageTemplate::kProxyNonObject);
204 BIND(&throw_proxy_handler_or_target_revoked);
205 ThrowTypeError(context, MessageTemplate::kProxyHandlerOrTargetRevoked);
209 TF_BUILTIN(ProxyRevocable, ProxiesCodeStubAssembler) {
210 Node*
const target = Parameter(Descriptor::kTarget);
211 Node*
const handler = Parameter(Descriptor::kHandler);
212 Node*
const context = Parameter(Descriptor::kContext);
213 Node*
const native_context = LoadNativeContext(context);
215 Label throw_proxy_non_object(
this, Label::kDeferred),
216 throw_proxy_handler_or_target_revoked(
this, Label::kDeferred),
217 return_create_proxy(
this);
219 GotoIf(TaggedIsSmi(target), &throw_proxy_non_object);
220 GotoIfNot(IsJSReceiver(target), &throw_proxy_non_object);
221 GotoIfRevokedProxy(target, &throw_proxy_handler_or_target_revoked);
223 GotoIf(TaggedIsSmi(handler), &throw_proxy_non_object);
224 GotoIfNot(IsJSReceiver(handler), &throw_proxy_non_object);
225 GotoIfRevokedProxy(handler, &throw_proxy_handler_or_target_revoked);
227 Node*
const proxy = AllocateProxy(target, handler, context);
228 Node*
const revoke = AllocateProxyRevokeFunction(proxy, context);
230 Node*
const result = Allocate(JSProxyRevocableResult::kSize);
231 Node*
const result_map = LoadContextElement(
232 native_context, Context::PROXY_REVOCABLE_RESULT_MAP_INDEX);
233 StoreMapNoWriteBarrier(result, result_map);
234 StoreObjectFieldRoot(result, JSProxyRevocableResult::kPropertiesOrHashOffset,
235 RootIndex::kEmptyFixedArray);
236 StoreObjectFieldRoot(result, JSProxyRevocableResult::kElementsOffset,
237 RootIndex::kEmptyFixedArray);
238 StoreObjectFieldNoWriteBarrier(result, JSProxyRevocableResult::kProxyOffset,
240 StoreObjectFieldNoWriteBarrier(result, JSProxyRevocableResult::kRevokeOffset,
244 BIND(&throw_proxy_non_object);
245 ThrowTypeError(context, MessageTemplate::kProxyNonObject);
247 BIND(&throw_proxy_handler_or_target_revoked);
248 ThrowTypeError(context, MessageTemplate::kProxyHandlerOrTargetRevoked);
253 TF_BUILTIN(ProxyRevoke, ProxiesCodeStubAssembler) {
254 Node*
const context = Parameter(Descriptor::kContext);
257 Node*
const proxy_slot = IntPtrConstant(kProxySlot);
258 Node*
const proxy = LoadContextElement(context, proxy_slot);
260 Label revoke_called(
this);
263 GotoIf(IsNull(proxy), &revoke_called);
266 StoreContextElement(context, proxy_slot, NullConstant());
269 CSA_ASSERT(
this, IsJSProxy(proxy));
272 StoreObjectField(proxy, JSProxy::kTargetOffset, NullConstant());
275 StoreObjectField(proxy, JSProxy::kHandlerOffset, NullConstant());
278 Return(UndefinedConstant());
280 BIND(&revoke_called);
282 Return(UndefinedConstant());
285 TF_BUILTIN(CallProxy, ProxiesCodeStubAssembler) {
286 Node* argc = Parameter(Descriptor::kActualArgumentsCount);
287 Node* argc_ptr = ChangeInt32ToIntPtr(argc);
288 Node* proxy = Parameter(Descriptor::kFunction);
289 Node* context = Parameter(Descriptor::kContext);
291 CSA_ASSERT(
this, IsJSProxy(proxy));
292 CSA_ASSERT(
this, IsCallable(proxy));
294 PerformStackCheck(CAST(context));
296 Label throw_proxy_handler_revoked(
this, Label::kDeferred),
297 trap_undefined(
this);
300 Node* handler = LoadObjectField(proxy, JSProxy::kHandlerOffset);
303 CSA_ASSERT(
this, IsNullOrJSReceiver(handler));
304 GotoIfNot(IsJSReceiver(handler), &throw_proxy_handler_revoked);
307 CSA_ASSERT(
this, IsJSReceiver(handler));
310 Node* target = LoadObjectField(proxy, JSProxy::kTargetOffset);
314 Handle<Name> trap_name = factory()->apply_string();
315 Node* trap = GetMethod(context, handler, trap_name, &trap_undefined);
317 CodeStubArguments args(
this, argc_ptr);
318 Node* receiver = args.GetReceiver();
321 Node* array = AllocateJSArrayForCodeStubArguments(context, args, argc_ptr,
325 Node* result = CallJS(CodeFactory::Call(isolate()), context, trap, handler,
326 target, receiver, array);
327 args.PopAndReturn(result);
329 BIND(&trap_undefined);
332 TailCallStub(CodeFactory::Call(isolate()), context, target, argc);
335 BIND(&throw_proxy_handler_revoked);
336 { ThrowTypeError(context, MessageTemplate::kProxyRevoked,
"apply"); }
339 TF_BUILTIN(ConstructProxy, ProxiesCodeStubAssembler) {
340 Node* argc = Parameter(Descriptor::kActualArgumentsCount);
341 Node* argc_ptr = ChangeInt32ToIntPtr(argc);
342 Node* proxy = Parameter(Descriptor::kTarget);
343 Node* new_target = Parameter(Descriptor::kNewTarget);
344 Node* context = Parameter(Descriptor::kContext);
346 CSA_ASSERT(
this, IsJSProxy(proxy));
347 CSA_ASSERT(
this, IsCallable(proxy));
349 Label throw_proxy_handler_revoked(
this, Label::kDeferred),
350 trap_undefined(
this), not_an_object(
this, Label::kDeferred);
353 Node* handler = LoadObjectField(proxy, JSProxy::kHandlerOffset);
356 CSA_ASSERT(
this, IsNullOrJSReceiver(handler));
357 GotoIfNot(IsJSReceiver(handler), &throw_proxy_handler_revoked);
360 CSA_ASSERT(
this, IsJSReceiver(handler));
363 Node* target = LoadObjectField(proxy, JSProxy::kTargetOffset);
367 Handle<Name> trap_name = factory()->construct_string();
368 Node* trap = GetMethod(context, handler, trap_name, &trap_undefined);
370 CodeStubArguments args(
this, argc_ptr);
373 Node* array = AllocateJSArrayForCodeStubArguments(context, args, argc_ptr,
377 Node* new_obj = CallJS(CodeFactory::Call(isolate()), context, trap, handler,
378 target, array, new_target);
381 GotoIf(TaggedIsSmi(new_obj), ¬_an_object);
382 GotoIfNot(IsJSReceiver(new_obj), ¬_an_object);
385 args.PopAndReturn(new_obj);
387 BIND(¬_an_object);
389 ThrowTypeError(context, MessageTemplate::kProxyConstructNonObject, new_obj);
392 BIND(&trap_undefined);
395 CSA_ASSERT(
this, IsConstructor(target));
398 TailCallStub(CodeFactory::Construct(isolate()), context, target, new_target,
402 BIND(&throw_proxy_handler_revoked);
403 { ThrowTypeError(context, MessageTemplate::kProxyRevoked,
"construct"); }
406 TF_BUILTIN(ProxyHasProperty, ProxiesCodeStubAssembler) {
407 Node* context = Parameter(Descriptor::kContext);
408 Node* proxy = Parameter(Descriptor::kProxy);
409 Node* name = Parameter(Descriptor::kName);
411 CSA_ASSERT(
this, IsJSProxy(proxy));
413 PerformStackCheck(CAST(context));
416 CSA_ASSERT(
this, IsName(name));
417 CSA_ASSERT(
this, Word32Equal(IsPrivateSymbol(name), Int32Constant(0)));
419 Label throw_proxy_handler_revoked(
this, Label::kDeferred),
420 trap_undefined(
this),
421 if_try_get_own_property_bailout(
this, Label::kDeferred),
422 trap_not_callable(
this, Label::kDeferred), return_true(
this),
423 return_false(
this), check_target_desc(
this);
426 Node* handler = LoadObjectField(proxy, JSProxy::kHandlerOffset);
430 GotoIfNot(IsJSReceiver(handler), &throw_proxy_handler_revoked);
433 Node* target = LoadObjectField(proxy, JSProxy::kTargetOffset);
437 Handle<Name> trap_name = factory()->has_string();
438 Node* trap = GetMethod(context, handler, trap_name, &trap_undefined);
440 GotoIf(TaggedIsSmi(trap), &trap_not_callable);
441 GotoIfNot(IsCallable(trap), &trap_not_callable);
445 BranchIfToBooleanIsTrue(CallJS(CodeFactory::Call(isolate()), context, trap,
446 handler, target, name),
447 &return_true, &check_target_desc);
449 BIND(&check_target_desc);
452 CheckHasTrapResult(context, target, proxy, name, &return_false,
453 &if_try_get_own_property_bailout);
456 BIND(&if_try_get_own_property_bailout);
458 CallRuntime(Runtime::kCheckProxyHasTrap, context, name, target);
459 Return(FalseConstant());
462 BIND(&trap_undefined);
465 TailCallBuiltin(Builtins::kHasProperty, context, target, name);
469 Return(FalseConstant());
472 Return(TrueConstant());
474 BIND(&throw_proxy_handler_revoked);
475 ThrowTypeError(context, MessageTemplate::kProxyRevoked,
"has");
477 BIND(&trap_not_callable);
478 ThrowTypeError(context, MessageTemplate::kPropertyNotFunction, trap,
479 StringConstant(
"has"), proxy);
482 TF_BUILTIN(ProxyGetProperty, ProxiesCodeStubAssembler) {
483 Node* context = Parameter(Descriptor::kContext);
484 Node* proxy = Parameter(Descriptor::kProxy);
485 Node* name = Parameter(Descriptor::kName);
486 Node* receiver = Parameter(Descriptor::kReceiverValue);
487 Node* on_non_existent = Parameter(Descriptor::kOnNonExistent);
489 CSA_ASSERT(
this, IsJSProxy(proxy));
492 CSA_ASSERT(
this, TaggedIsNotSmi(name));
493 CSA_ASSERT(
this, IsName(name));
494 CSA_ASSERT(
this, Word32Equal(IsPrivateSymbol(name), Int32Constant(0)));
496 Label throw_proxy_handler_revoked(
this, Label::kDeferred),
497 trap_undefined(
this);
500 Node* handler = LoadObjectField(proxy, JSProxy::kHandlerOffset);
503 GotoIf(IsNull(handler), &throw_proxy_handler_revoked);
506 CSA_ASSERT(
this, IsJSReceiver(handler));
509 Node* target = LoadObjectField(proxy, JSProxy::kTargetOffset);
513 Handle<Name> trap_name = factory()->get_string();
514 Node* trap = GetMethod(context, handler, trap_name, &trap_undefined);
517 Node* trap_result = CallJS(
518 CodeFactory::Call(isolate(), ConvertReceiverMode::kNotNullOrUndefined),
519 context, trap, handler, target, name, receiver);
522 Label return_result(
this);
523 CheckGetSetTrapResult(context, target, proxy, name, trap_result,
524 &return_result, JSProxy::kGet);
526 BIND(&return_result);
532 BIND(&trap_undefined);
536 Return(CallRuntime(Runtime::kGetPropertyWithReceiver, context, target, name,
537 receiver, on_non_existent));
540 BIND(&throw_proxy_handler_revoked);
541 ThrowTypeError(context, MessageTemplate::kProxyRevoked,
"get");
544 TF_BUILTIN(ProxySetProperty, ProxiesCodeStubAssembler) {
545 Node* context = Parameter(Descriptor::kContext);
546 Node* proxy = Parameter(Descriptor::kProxy);
547 Node* name = Parameter(Descriptor::kName);
548 Node* value = Parameter(Descriptor::kValue);
549 Node* receiver = Parameter(Descriptor::kReceiverValue);
550 TNode<Smi> language_mode = CAST(Parameter(Descriptor::kLanguageMode));
552 CSA_ASSERT(
this, IsJSProxy(proxy));
555 CSA_ASSERT(
this, TaggedIsNotSmi(name));
556 CSA_ASSERT(
this, IsName(name));
558 Label throw_proxy_handler_revoked(
this, Label::kDeferred),
559 trap_undefined(
this), failure(
this, Label::kDeferred),
560 continue_checks(
this), success(
this),
561 private_symbol(
this, Label::kDeferred);
563 GotoIf(IsPrivateSymbol(name), &private_symbol);
566 Node* handler = LoadObjectField(proxy, JSProxy::kHandlerOffset);
569 GotoIfNot(IsJSReceiver(handler), &throw_proxy_handler_revoked);
572 CSA_ASSERT(
this, IsJSReceiver(handler));
575 Node* target = LoadObjectField(proxy, JSProxy::kTargetOffset);
579 Handle<Name> set_string = factory()->set_string();
580 Node* trap = GetMethod(context, handler, set_string, &trap_undefined);
585 BranchIfToBooleanIsTrue(
586 CallJS(CodeFactory::Call(isolate(),
587 ConvertReceiverMode::kNotNullOrUndefined),
588 context, trap, handler, target, name, value, receiver),
589 &continue_checks, &failure);
591 BIND(&continue_checks);
594 Label return_result(
this);
595 CheckGetSetTrapResult(context, target, proxy, name, value, &success,
601 Label if_throw(
this, Label::kDeferred);
602 Branch(SmiEqual(language_mode, SmiConstant(LanguageMode::kStrict)),
603 &if_throw, &success);
606 ThrowTypeError(context, MessageTemplate::kProxyTrapReturnedFalsishFor,
607 HeapConstant(set_string), name);
614 BIND(&private_symbol);
616 Label failure(
this), throw_error(
this, Label::kDeferred);
618 Branch(SmiEqual(language_mode, SmiConstant(LanguageMode::kStrict)),
619 &throw_error, &failure);
622 Return(UndefinedConstant());
625 ThrowTypeError(context, MessageTemplate::kProxyPrivate);
628 BIND(&trap_undefined);
631 CallRuntime(Runtime::kSetPropertyWithReceiver, context, target, name, value,
632 receiver, language_mode);
636 BIND(&throw_proxy_handler_revoked);
637 ThrowTypeError(context, MessageTemplate::kProxyRevoked,
"set");
640 void ProxiesCodeStubAssembler::CheckGetSetTrapResult(
641 Node* context, Node* target, Node* proxy, Node* name, Node* trap_result,
642 Label* check_passed, JSProxy::AccessKind access_kind) {
643 Node* map = LoadMap(target);
644 VARIABLE(var_value, MachineRepresentation::kTagged);
645 VARIABLE(var_details, MachineRepresentation::kWord32);
646 VARIABLE(var_raw_value, MachineRepresentation::kTagged);
648 Label if_found_value(
this), check_in_runtime(
this, Label::kDeferred);
650 Node* instance_type = LoadInstanceType(target);
651 TryGetOwnProperty(context, target, target, map, instance_type, name,
652 &if_found_value, &var_value, &var_details, &var_raw_value,
653 check_passed, &check_in_runtime, kReturnAccessorPair);
655 BIND(&if_found_value);
657 Label throw_non_configurable_data(
this, Label::kDeferred),
658 throw_non_configurable_accessor(
this, Label::kDeferred),
659 check_accessor(
this), check_data(
this);
663 GotoIfNot(IsSetWord32(var_details.value(),
664 PropertyDetails::kAttributesDontDeleteMask),
669 BranchIfAccessorPair(var_raw_value.value(), &check_accessor, &check_data);
673 Node* read_only = IsSetWord32(var_details.value(),
674 PropertyDetails::kAttributesReadOnlyMask);
675 GotoIfNot(read_only, check_passed);
679 BranchIfSameValue(trap_result, var_value.value(), check_passed,
680 &throw_non_configurable_data);
683 BIND(&check_accessor);
685 Node* accessor_pair = var_raw_value.value();
687 if (access_kind == JSProxy::kGet) {
688 Label continue_check(
this, Label::kDeferred);
692 LoadObjectField(accessor_pair, AccessorPair::kGetterOffset);
695 GotoIf(IsUndefined(getter), &continue_check);
696 GotoIf(IsNull(getter), &continue_check);
700 BIND(&continue_check);
701 GotoIfNot(IsUndefined(trap_result), &throw_non_configurable_accessor);
706 LoadObjectField(accessor_pair, AccessorPair::kSetterOffset);
707 GotoIf(IsUndefined(setter), &throw_non_configurable_accessor);
708 GotoIf(IsNull(setter), &throw_non_configurable_accessor);
713 BIND(&check_in_runtime);
715 CallRuntime(Runtime::kCheckProxyGetSetTrapResult, context, name, target,
716 trap_result, SmiConstant(access_kind));
720 BIND(&throw_non_configurable_data);
722 if (access_kind == JSProxy::kGet) {
723 ThrowTypeError(context, MessageTemplate::kProxyGetNonConfigurableData,
724 name, var_value.value(), trap_result);
726 ThrowTypeError(context, MessageTemplate::kProxySetFrozenData, name);
730 BIND(&throw_non_configurable_accessor);
732 if (access_kind == JSProxy::kGet) {
733 ThrowTypeError(context,
734 MessageTemplate::kProxyGetNonConfigurableAccessor, name,
737 ThrowTypeError(context, MessageTemplate::kProxySetFrozenAccessor, name);
743 void ProxiesCodeStubAssembler::CheckHasTrapResult(Node* context, Node* target,
744 Node* proxy, Node* name,
747 Node* target_map = LoadMap(target);
748 VARIABLE(var_value, MachineRepresentation::kTagged);
749 VARIABLE(var_details, MachineRepresentation::kWord32);
750 VARIABLE(var_raw_value, MachineRepresentation::kTagged);
752 Label if_found_value(
this, Label::kDeferred),
753 throw_non_configurable(
this, Label::kDeferred),
754 throw_non_extensible(
this, Label::kDeferred);
757 Node* instance_type = LoadInstanceType(target);
758 TryGetOwnProperty(context, target, target, target_map, instance_type, name,
759 &if_found_value, &var_value, &var_details, &var_raw_value,
760 check_passed, if_bailout, kReturnAccessorPair);
763 BIND(&if_found_value);
767 Node* non_configurable = IsSetWord32(
768 var_details.value(), PropertyDetails::kAttributesDontDeleteMask);
769 GotoIf(non_configurable, &throw_non_configurable);
772 Node* target_extensible = IsExtensibleMap(target_map);
775 GotoIfNot(target_extensible, &throw_non_extensible);
779 BIND(&throw_non_configurable);
780 { ThrowTypeError(context, MessageTemplate::kProxyHasNonConfigurable, name); }
782 BIND(&throw_non_extensible);
783 { ThrowTypeError(context, MessageTemplate::kProxyHasNonExtensible, name); }