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; |
} |