| Index: src/objects.cc
|
| diff --git a/src/objects.cc b/src/objects.cc
|
| index 835de3ef77b2ceba38cc907520cab412173109a8..8ae3a204227b2cf084e9ceafef5e0c5fdfc2c811 100644
|
| --- a/src/objects.cc
|
| +++ b/src/objects.cc
|
| @@ -11,6 +11,7 @@
|
| #include "src/accessors.h"
|
| #include "src/allocation-site-scopes.h"
|
| #include "src/api.h"
|
| +#include "src/api-natives.h"
|
| #include "src/arguments.h"
|
| #include "src/base/bits.h"
|
| #include "src/base/utils/random-number-generator.h"
|
| @@ -1173,7 +1174,18 @@ MaybeHandle<Object> Object::GetPropertyWithAccessor(
|
|
|
| // Regular accessor.
|
| Handle<Object> getter(AccessorPair::cast(*structure)->getter(), isolate);
|
| - if (getter->IsCallable()) {
|
| + if (getter->IsFunctionTemplateInfo()) {
|
| + auto result = Builtins::InvokeApiFunction(
|
| + Handle<FunctionTemplateInfo>::cast(getter), receiver, 0, nullptr);
|
| + if (isolate->has_pending_exception()) {
|
| + return MaybeHandle<Object>();
|
| + }
|
| + Handle<Object> return_value;
|
| + if (result.ToHandle(&return_value)) {
|
| + return_value->VerifyApiCallResultType();
|
| + return handle(*return_value, isolate);
|
| + }
|
| + } else if (getter->IsCallable()) {
|
| // TODO(rossberg): nicer would be to cast to some JSCallable here...
|
| return Object::GetPropertyWithDefinedGetter(
|
| receiver, Handle<JSReceiver>::cast(getter));
|
| @@ -1232,7 +1244,16 @@ Maybe<bool> Object::SetPropertyWithAccessor(LookupIterator* it,
|
|
|
| // Regular accessor.
|
| Handle<Object> setter(AccessorPair::cast(*structure)->setter(), isolate);
|
| - if (setter->IsCallable()) {
|
| + if (setter->IsFunctionTemplateInfo()) {
|
| + Handle<Object> argv[] = {value};
|
| + auto result =
|
| + Builtins::InvokeApiFunction(Handle<FunctionTemplateInfo>::cast(setter),
|
| + receiver, arraysize(argv), argv);
|
| + if (isolate->has_pending_exception()) {
|
| + return Nothing<bool>();
|
| + }
|
| + return Just(true);
|
| + } else if (setter->IsCallable()) {
|
| // TODO(rossberg): nicer would be to cast to some JSCallable here...
|
| return SetPropertyWithDefinedSetter(
|
| receiver, Handle<JSReceiver>::cast(setter), value, should_throw);
|
| @@ -8945,8 +8966,10 @@ MaybeHandle<Object> JSObject::DefineAccessor(LookupIterator* it,
|
| }
|
| }
|
|
|
| - DCHECK(getter->IsCallable() || getter->IsUndefined() || getter->IsNull());
|
| - DCHECK(setter->IsCallable() || setter->IsUndefined() || setter->IsNull());
|
| + DCHECK(getter->IsCallable() || getter->IsUndefined() || getter->IsNull() ||
|
| + getter->IsFunctionTemplateInfo());
|
| + DCHECK(setter->IsCallable() || setter->IsUndefined() || setter->IsNull() ||
|
| + getter->IsFunctionTemplateInfo());
|
| // At least one of the accessors needs to be a new value.
|
| DCHECK(!getter->IsNull() || !setter->IsNull());
|
| if (!getter->IsNull()) {
|
| @@ -10858,6 +10881,12 @@ Handle<AccessorPair> AccessorPair::Copy(Handle<AccessorPair> pair) {
|
|
|
| Object* AccessorPair::GetComponent(AccessorComponent component) {
|
| Object* accessor = get(component);
|
| + if (accessor->IsFunctionTemplateInfo()) {
|
| + auto function = i::ApiNatives::InstantiateFunction(
|
| + handle(FunctionTemplateInfo::cast(accessor)));
|
| + set(component, *function.ToHandleChecked());
|
| + accessor = get(component);
|
| + }
|
| return accessor->IsTheHole() ? GetHeap()->undefined_value() : accessor;
|
| }
|
|
|
|
|