Chromium Code Reviews| Index: src/objects.cc |
| diff --git a/src/objects.cc b/src/objects.cc |
| index 3ddbe50f75904e7099ac25752d4c1edec6bec22e..265e20421b6da340a75143f02046b305174cc609 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)); |
| @@ -1231,7 +1243,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); |
| @@ -8999,8 +9020,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()) { |
| @@ -10912,6 +10935,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()); |
|
Toon Verwaest
2016/01/28 12:05:19
If we'd like to share the accessorpair with Functi
epertoso
2016/02/01 16:18:03
I modified JSReceiver::GetOwnPropertyDescriptor an
|
| + accessor = get(component); |
| + } |
| return accessor->IsTheHole() ? GetHeap()->undefined_value() : accessor; |
| } |