Index: src/accessors.cc |
diff --git a/src/accessors.cc b/src/accessors.cc |
index 9da6141c5b16832ef86aa09e16e84c323de9835e..1bc9221a20c5c973c020bfea7f90cd0a46ce4316 100644 |
--- a/src/accessors.cc |
+++ b/src/accessors.cc |
@@ -42,15 +42,11 @@ namespace internal { |
template <class C> |
-static C* FindInPrototypeChain(Object* obj, bool* found_it) { |
- ASSERT(!*found_it); |
- Heap* heap = HEAP; |
- while (!Is<C>(obj)) { |
- if (obj == heap->null_value()) return NULL; |
- obj = obj->GetPrototype(); |
+static C* FindInstanceOf(Object* obj) { |
+ for (Object* cur = obj; !cur->IsNull(); cur = cur->GetPrototype()) { |
+ if (Is<C>(cur)) return C::cast(cur); |
} |
- *found_it = true; |
- return C::cast(obj); |
+ return NULL; |
} |
@@ -81,10 +77,8 @@ MaybeObject* Accessors::ReadOnlySetAccessor(JSObject*, Object* value, void*) { |
MaybeObject* Accessors::ArrayGetLength(Object* object, void*) { |
// Traverse the prototype chain until we reach an array. |
- bool found_it = false; |
- JSArray* holder = FindInPrototypeChain<JSArray>(object, &found_it); |
- if (!found_it) return Smi::FromInt(0); |
- return holder->length(); |
+ JSArray* holder = FindInstanceOf<JSArray>(object); |
+ return holder == NULL ? Smi::FromInt(0) : holder->length(); |
} |
@@ -448,15 +442,12 @@ const AccessorDescriptor Accessors::ScriptEvalFromFunctionName = { |
MaybeObject* Accessors::FunctionGetPrototype(Object* object, void*) { |
Heap* heap = Isolate::Current()->heap(); |
- bool found_it = false; |
- JSFunction* function = FindInPrototypeChain<JSFunction>(object, &found_it); |
- if (!found_it) return heap->undefined_value(); |
+ JSFunction* function = FindInstanceOf<JSFunction>(object); |
+ if (function == NULL) return heap->undefined_value(); |
while (!function->should_have_prototype()) { |
- found_it = false; |
- function = FindInPrototypeChain<JSFunction>(object->GetPrototype(), |
- &found_it); |
+ function = FindInstanceOf<JSFunction>(function->GetPrototype()); |
// There has to be one because we hit the getter. |
- ASSERT(found_it); |
+ ASSERT(function != NULL); |
} |
if (!function->has_prototype()) { |
@@ -477,9 +468,8 @@ MaybeObject* Accessors::FunctionSetPrototype(JSObject* object, |
Object* value, |
void*) { |
Heap* heap = object->GetHeap(); |
- bool found_it = false; |
- JSFunction* function = FindInPrototypeChain<JSFunction>(object, &found_it); |
- if (!found_it) return heap->undefined_value(); |
+ JSFunction* function = FindInstanceOf<JSFunction>(object); |
+ if (function == NULL) return heap->undefined_value(); |
if (!function->should_have_prototype()) { |
// Since we hit this accessor, object will have no prototype property. |
return object->SetLocalPropertyIgnoreAttributes(heap->prototype_symbol(), |
@@ -509,22 +499,20 @@ const AccessorDescriptor Accessors::FunctionPrototype = { |
MaybeObject* Accessors::FunctionGetLength(Object* object, void*) { |
- bool found_it = false; |
- JSFunction* function = FindInPrototypeChain<JSFunction>(object, &found_it); |
- if (!found_it) return Smi::FromInt(0); |
+ JSFunction* function = FindInstanceOf<JSFunction>(object); |
+ if (function == NULL) return Smi::FromInt(0); |
// Check if already compiled. |
- if (!function->shared()->is_compiled()) { |
- // If the function isn't compiled yet, the length is not computed |
- // correctly yet. Compile it now and return the right length. |
- HandleScope scope; |
- Handle<JSFunction> handle(function); |
- if (!JSFunction::CompileLazy(handle, KEEP_EXCEPTION)) { |
- return Failure::Exception(); |
- } |
- return Smi::FromInt(handle->shared()->length()); |
- } else { |
+ if (function->shared()->is_compiled()) { |
return Smi::FromInt(function->shared()->length()); |
} |
+ // If the function isn't compiled yet, the length is not computed correctly |
+ // yet. Compile it now and return the right length. |
+ HandleScope scope; |
+ Handle<JSFunction> handle(function); |
+ if (JSFunction::CompileLazy(handle, KEEP_EXCEPTION)) { |
+ return Smi::FromInt(handle->shared()->length()); |
+ } |
+ return Failure::Exception(); |
} |
@@ -541,10 +529,8 @@ const AccessorDescriptor Accessors::FunctionLength = { |
MaybeObject* Accessors::FunctionGetName(Object* object, void*) { |
- bool found_it = false; |
- JSFunction* holder = FindInPrototypeChain<JSFunction>(object, &found_it); |
- if (!found_it) return HEAP->undefined_value(); |
- return holder->shared()->name(); |
+ JSFunction* holder = FindInstanceOf<JSFunction>(object); |
+ return holder == NULL ? HEAP->undefined_value() : holder->shared()->name(); |
} |
@@ -589,9 +575,8 @@ static MaybeObject* ConstructArgumentsObjectForInlinedFunction( |
MaybeObject* Accessors::FunctionGetArguments(Object* object, void*) { |
Isolate* isolate = Isolate::Current(); |
HandleScope scope(isolate); |
- bool found_it = false; |
- JSFunction* holder = FindInPrototypeChain<JSFunction>(object, &found_it); |
- if (!found_it) return isolate->heap()->undefined_value(); |
+ JSFunction* holder = FindInstanceOf<JSFunction>(object); |
+ if (holder == NULL) return isolate->heap()->undefined_value(); |
Handle<JSFunction> function(holder, isolate); |
if (function->shared()->native()) return isolate->heap()->null_value(); |
@@ -727,9 +712,8 @@ MaybeObject* Accessors::FunctionGetCaller(Object* object, void*) { |
Isolate* isolate = Isolate::Current(); |
HandleScope scope(isolate); |
AssertNoAllocation no_alloc; |
- bool found_it = false; |
- JSFunction* holder = FindInPrototypeChain<JSFunction>(object, &found_it); |
- if (!found_it) return isolate->heap()->undefined_value(); |
+ JSFunction* holder = FindInstanceOf<JSFunction>(object); |
+ if (holder == NULL) return isolate->heap()->undefined_value(); |
if (holder->shared()->native()) return isolate->heap()->null_value(); |
Handle<JSFunction> function(holder, isolate); |