Chromium Code Reviews| Index: src/ic.cc |
| =================================================================== |
| --- src/ic.cc (revision 184) |
| +++ src/ic.cc (working copy) |
| @@ -250,6 +250,26 @@ |
| } |
| +Object* CallIC::TryCallAsFunction(Object* object) { |
| + HandleScope scope; |
| + Handle<Object> target(object); |
| + Handle<Object> delegate = Execution::GetFunctionDelegate(target); |
| + |
| + if (delegate->IsJSFunction()) { |
| + // Patch the receiver and use the delegate as the function to |
| + // invoke. This is used for invoking objects as if they were |
| + // functions. |
| + const int argc = this->target()->arguments_count(); |
| + StackFrameLocator locator; |
| + JavaScriptFrame* frame = locator.FindJavaScriptFrame(0); |
| + int index = frame->ComputeExpressionsCount() - (argc + 1); |
| + frame->SetExpression(index, *target); |
| + } |
| + |
| + return *delegate; |
| +} |
| + |
| + |
| Object* CallIC::LoadFunction(State state, |
| Handle<Object> object, |
| Handle<String> name) { |
| @@ -259,12 +279,24 @@ |
| return TypeError("non_object_property_call", object, name); |
| } |
| + Object* result = Heap::the_hole_value(); |
| + |
| + // Check if the name is trivially convertible to an index and get |
| + // the element if so. |
| + uint32_t index; |
| + if (name->AsArrayIndex(&index)) { |
| + result = object->GetElement(index); |
| + if (result->IsJSFunction()) return result; |
| + |
| + // Try to find a suitable function delegate for the object at hand. |
| + result = TryCallAsFunction(result); |
| + if (result->IsJSFunction()) return result; |
|
Kasper Lund
2008/09/08 05:27:21
Do you really want to continue with a doing a norm
Feng Qian
2008/09/08 18:58:48
It will fail in lookup step, a comment is sufficie
|
| + } |
| + |
| // Lookup the property in the object. |
| LookupResult lookup; |
| object->Lookup(*name, &lookup); |
| - Object* result = Heap::the_hole_value(); |
| - |
| if (!lookup.IsValid()) { |
| // If the object does not have the requested property, check which |
| // exception we need to throw. |
| @@ -328,23 +360,9 @@ |
| } |
| // Try to find a suitable function delegate for the object at hand. |
| - HandleScope scope; |
| - Handle<Object> target(result); |
| - Handle<Object> delegate = Execution::GetFunctionDelegate(target); |
| - |
| - if (delegate->IsJSFunction()) { |
| - // Patch the receiver and use the delegate as the function to |
| - // invoke. This is used for invoking objects as if they were |
| - // functions. |
| - const int argc = this->target()->arguments_count(); |
| - StackFrameLocator locator; |
| - JavaScriptFrame* frame = locator.FindJavaScriptFrame(0); |
| - int index = frame->ComputeExpressionsCount() - (argc + 1); |
| - frame->SetExpression(index, *target); |
| - return *delegate; |
| - } else { |
| - return TypeError("property_not_function", object, name); |
| - } |
| + result = TryCallAsFunction(result); |
| + return result->IsJSFunction() ? |
| + result : TypeError("property_not_function", object, name); |
|
Kasper Lund
2008/09/08 05:27:21
Isn't this usually indented with 4 spaces? I can't
Feng Qian
2008/09/08 18:58:48
Done.
|
| } |