Chromium Code Reviews| Index: src/api.cc |
| diff --git a/src/api.cc b/src/api.cc |
| index aee9e3a469eae454a9fdc7b241142050044a730a..499050d73b24dc98627b651e53561cdd15e5c25a 100644 |
| --- a/src/api.cc |
| +++ b/src/api.cc |
| @@ -128,6 +128,18 @@ namespace v8 { |
| } while (false) |
| +static i::Handle<i::JSFunction> GetOriginalFunctionFromBound( |
| + i::Handle<i::JSFunction> bound_function) { |
| + i::Handle<i::FixedArray> bound_args = i::Handle<i::FixedArray>( |
| + i::FixedArray::cast(bound_function->function_bindings())); |
| + i::Handle<i::Object> orig_function( |
| + i::JSReceiver::cast(bound_args->get( |
| + i::JSFunction::kBoundFunctionIndex)), |
| + i::Isolate::Current()); |
| + return i::Handle<i::JSFunction>::cast(orig_function); |
| +} |
| + |
| + |
| // --- E x c e p t i o n B e h a v i o r --- |
| @@ -4207,6 +4219,9 @@ void Function::SetName(v8::Handle<v8::String> name) { |
| Handle<Value> Function::GetName() const { |
| i::Handle<i::JSFunction> func = Utils::OpenHandle(this); |
| + if (func->shared()->bound()) { |
|
yurys
2013/12/09 12:17:16
We should add Function::GetBoundFunction() instead
Alexandra Mikhaylova
2013/12/12 12:41:14
Done.
|
| + func = GetOriginalFunctionFromBound(func); |
| + } |
| return Utils::ToLocal(i::Handle<i::Object>(func->shared()->name(), |
| func->GetIsolate())); |
| } |
| @@ -4214,6 +4229,9 @@ Handle<Value> Function::GetName() const { |
| Handle<Value> Function::GetInferredName() const { |
| i::Handle<i::JSFunction> func = Utils::OpenHandle(this); |
| + if (func->shared()->bound()) { |
| + func = GetOriginalFunctionFromBound(func); |
| + } |
| return Utils::ToLocal(i::Handle<i::Object>(func->shared()->inferred_name(), |
| func->GetIsolate())); |
| } |
| @@ -4226,6 +4244,9 @@ Handle<Value> Function::GetDisplayName() const { |
| isolate->factory()->undefined_value())); |
| ENTER_V8(isolate); |
| i::Handle<i::JSFunction> func = Utils::OpenHandle(this); |
| + if (func->shared()->bound()) { |
| + func = GetOriginalFunctionFromBound(func); |
| + } |
| i::Handle<i::String> property_name = |
| isolate->factory()->InternalizeOneByteString( |
| STATIC_ASCII_VECTOR("displayName")); |
| @@ -4244,6 +4265,9 @@ Handle<Value> Function::GetDisplayName() const { |
| ScriptOrigin Function::GetScriptOrigin() const { |
| i::Handle<i::JSFunction> func = Utils::OpenHandle(this); |
| + if (func->shared()->bound()) { |
| + func = GetOriginalFunctionFromBound(func); |
| + } |
| if (func->shared()->script()->IsScript()) { |
| i::Handle<i::Script> script(i::Script::cast(func->shared()->script())); |
| i::Handle<i::Object> scriptName = GetScriptNameOrSourceURL(script); |
| @@ -4262,6 +4286,9 @@ const int Function::kLineOffsetNotFound = -1; |
| int Function::GetScriptLineNumber() const { |
| i::Handle<i::JSFunction> func = Utils::OpenHandle(this); |
| + if (func->shared()->bound()) { |
| + func = GetOriginalFunctionFromBound(func); |
| + } |
| if (func->shared()->script()->IsScript()) { |
| i::Handle<i::Script> script(i::Script::cast(func->shared()->script())); |
| return i::GetScriptLineNumber(script, func->shared()->start_position()); |
| @@ -4272,6 +4299,9 @@ int Function::GetScriptLineNumber() const { |
| int Function::GetScriptColumnNumber() const { |
| i::Handle<i::JSFunction> func = Utils::OpenHandle(this); |
| + if (func->shared()->bound()) { |
| + func = GetOriginalFunctionFromBound(func); |
| + } |
| if (func->shared()->script()->IsScript()) { |
| i::Handle<i::Script> script(i::Script::cast(func->shared()->script())); |
| return i::GetScriptColumnNumber(script, func->shared()->start_position()); |
| @@ -4299,6 +4329,9 @@ Handle<Value> Function::GetScriptId() const { |
| int Function::ScriptId() const { |
| i::Handle<i::JSFunction> func = Utils::OpenHandle(this); |
| + if (func->shared()->bound()) { |
| + func = GetOriginalFunctionFromBound(func); |
| + } |
| if (!func->shared()->script()->IsScript()) return v8::Script::kNoScriptId; |
| i::Handle<i::Script> script(i::Script::cast(func->shared()->script())); |
| return script->id()->value(); |