Index: src/runtime.cc |
diff --git a/src/runtime.cc b/src/runtime.cc |
index 8d84fdace2562f4f6f834940706f298bfdf481a5..89d49fe78cdf73c6da7d600c5ebb66ea37d313a4 100644 |
--- a/src/runtime.cc |
+++ b/src/runtime.cc |
@@ -5726,6 +5726,22 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_GetPropertyNamesFast) { |
} |
+// Returns true if inherited accessors have been copied down |
+// to obj from proto's function template. |
+static bool IsInheritedApiFunctionOf(JSObject *obj, Object *proto) { |
+ Object *constructor = HeapObject::cast(proto)->map()->constructor(); |
+ if (!constructor->IsJSFunction()) { |
jochen (gone - plz use gerrit)
2013/12/17 15:00:53
nit. v8 style is if (...) return false; (in one li
|
+ return false; |
+ } |
+ JSFunction *constructor_fun = JSFunction::cast(constructor); |
+ if (!constructor_fun->shared()->IsApiFunction()) { |
+ return false; |
+ } |
+ return constructor_fun->shared()-> |
jochen (gone - plz use gerrit)
2013/12/17 15:00:53
nit the -> should go on the next line
|
+ get_api_func_data()->IsTemplateFor(obj); |
+} |
+ |
+ |
// Find the length of the prototype chain that is to to handled as one. If a |
// prototype object is hidden it is to be viewed as part of the the object it |
// is prototype for. |
@@ -5733,7 +5749,8 @@ static int LocalPrototypeChainLength(JSObject* obj) { |
int count = 1; |
Object* proto = obj->GetPrototype(); |
while (proto->IsJSObject() && |
- JSObject::cast(proto)->map()->is_hidden_prototype()) { |
+ JSObject::cast(proto)->map()->is_hidden_prototype() && |
+ !IsInheritedApiFunctionOf(obj, proto)) { |
count++; |
proto = JSObject::cast(proto)->GetPrototype(); |
} |