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(); |