Expose v8::Function::GetDisplayName to public API.
BUG=chromium:17356 R=mstarzinger@chromium.org, yurys@chromium.org, yangguo@chromium.org, yurys Committed: https://code.google.com/p/v8/source/detail?r=17324 Review URL: https://codereview.chromium.org/26709011 Patch from Andrey Adaikin <aandrey@chromium.org>. git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@17340 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
a333094165
commit
8385804c55
@ -2478,6 +2478,12 @@ class V8_EXPORT Function : public Object {
|
||||
*/
|
||||
Handle<Value> GetInferredName() const;
|
||||
|
||||
/**
|
||||
* User-defined name assigned to the "displayName" property of this function.
|
||||
* Used to facilitate debugging and profiling of JavaScript code.
|
||||
*/
|
||||
Handle<Value> GetDisplayName() const;
|
||||
|
||||
/**
|
||||
* Returns zero based line number of function body and
|
||||
* kLineOffsetNotFound if no information available.
|
||||
|
23
src/api.cc
23
src/api.cc
@ -4110,6 +4110,29 @@ Handle<Value> Function::GetInferredName() const {
|
||||
}
|
||||
|
||||
|
||||
Handle<Value> Function::GetDisplayName() const {
|
||||
i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
|
||||
ON_BAILOUT(isolate, "v8::Function::GetDisplayName()",
|
||||
return ToApiHandle<Primitive>(
|
||||
isolate->factory()->undefined_value()));
|
||||
ENTER_V8(isolate);
|
||||
i::Handle<i::JSFunction> func = Utils::OpenHandle(this);
|
||||
i::Handle<i::String> property_name =
|
||||
isolate->factory()->InternalizeOneByteString(
|
||||
STATIC_ASCII_VECTOR("displayName"));
|
||||
i::LookupResult lookup(isolate);
|
||||
func->LookupRealNamedProperty(*property_name, &lookup);
|
||||
if (lookup.IsFound()) {
|
||||
i::Object* value = lookup.GetLazyValue();
|
||||
if (value && value->IsString()) {
|
||||
i::String* name = i::String::cast(value);
|
||||
if (name->length() > 0) return Utils::ToLocal(i::Handle<i::String>(name));
|
||||
}
|
||||
}
|
||||
return ToApiHandle<Primitive>(isolate->factory()->undefined_value());
|
||||
}
|
||||
|
||||
|
||||
ScriptOrigin Function::GetScriptOrigin() const {
|
||||
i::Handle<i::JSFunction> func = Utils::OpenHandle(this);
|
||||
if (func->shared()->script()->IsScript()) {
|
||||
|
@ -17504,6 +17504,70 @@ THREADED_TEST(FunctionGetInferredName) {
|
||||
}
|
||||
|
||||
|
||||
THREADED_TEST(FunctionGetDisplayName) {
|
||||
LocalContext env;
|
||||
v8::HandleScope scope(env->GetIsolate());
|
||||
const char* code = "var error = false;"
|
||||
"function a() { this.x = 1; };"
|
||||
"a.displayName = 'display_a';"
|
||||
"var b = (function() {"
|
||||
" var f = function() { this.x = 2; };"
|
||||
" f.displayName = 'display_b';"
|
||||
" return f;"
|
||||
"})();"
|
||||
"var c = function() {};"
|
||||
"c.__defineGetter__('displayName', function() {"
|
||||
" error = true;"
|
||||
" throw new Error();"
|
||||
"});"
|
||||
"function d() {};"
|
||||
"d.__defineGetter__('displayName', function() {"
|
||||
" error = true;"
|
||||
" return 'wrong_display_name';"
|
||||
"});"
|
||||
"function e() {};"
|
||||
"e.displayName = 'wrong_display_name';"
|
||||
"e.__defineSetter__('displayName', function() {"
|
||||
" error = true;"
|
||||
" throw new Error();"
|
||||
"});"
|
||||
"function f() {};"
|
||||
"f.displayName = { 'foo': 6, toString: function() {"
|
||||
" error = true;"
|
||||
" return 'wrong_display_name';"
|
||||
"}};"
|
||||
"var g = function() {"
|
||||
" arguments.callee.displayName = 'set_in_runtime';"
|
||||
"}; g();"
|
||||
;
|
||||
v8::ScriptOrigin origin = v8::ScriptOrigin(v8::String::New("test"));
|
||||
v8::Script::Compile(v8::String::New(code), &origin)->Run();
|
||||
v8::Local<v8::Value> error = env->Global()->Get(v8::String::New("error"));
|
||||
v8::Local<v8::Function> a = v8::Local<v8::Function>::Cast(
|
||||
env->Global()->Get(v8::String::New("a")));
|
||||
v8::Local<v8::Function> b = v8::Local<v8::Function>::Cast(
|
||||
env->Global()->Get(v8::String::New("b")));
|
||||
v8::Local<v8::Function> c = v8::Local<v8::Function>::Cast(
|
||||
env->Global()->Get(v8::String::New("c")));
|
||||
v8::Local<v8::Function> d = v8::Local<v8::Function>::Cast(
|
||||
env->Global()->Get(v8::String::New("d")));
|
||||
v8::Local<v8::Function> e = v8::Local<v8::Function>::Cast(
|
||||
env->Global()->Get(v8::String::New("e")));
|
||||
v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast(
|
||||
env->Global()->Get(v8::String::New("f")));
|
||||
v8::Local<v8::Function> g = v8::Local<v8::Function>::Cast(
|
||||
env->Global()->Get(v8::String::New("g")));
|
||||
CHECK_EQ(false, error->BooleanValue());
|
||||
CHECK_EQ("display_a", *v8::String::Utf8Value(a->GetDisplayName()));
|
||||
CHECK_EQ("display_b", *v8::String::Utf8Value(b->GetDisplayName()));
|
||||
CHECK(c->GetDisplayName()->IsUndefined());
|
||||
CHECK(d->GetDisplayName()->IsUndefined());
|
||||
CHECK(e->GetDisplayName()->IsUndefined());
|
||||
CHECK(f->GetDisplayName()->IsUndefined());
|
||||
CHECK_EQ("set_in_runtime", *v8::String::Utf8Value(g->GetDisplayName()));
|
||||
}
|
||||
|
||||
|
||||
THREADED_TEST(ScriptLineNumber) {
|
||||
LocalContext env;
|
||||
v8::HandleScope scope(env->GetIsolate());
|
||||
|
Loading…
Reference in New Issue
Block a user