Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(547)

Side by Side Diff: test/cctest/test-api.cc

Issue 1449473005: [V8] Unify get function name for debugging purpose (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/runtime/runtime-debug.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 14454 matching lines...) Expand 10 before | Expand all | Expand 10 after
14465 CHECK_EQ(is_eval, frame->IsEval()); 14465 CHECK_EQ(is_eval, frame->IsEval());
14466 CHECK_EQ(is_constructor, frame->IsConstructor()); 14466 CHECK_EQ(is_constructor, frame->IsConstructor());
14467 } 14467 }
14468 14468
14469 14469
14470 void AnalyzeStackInNativeCode(const v8::FunctionCallbackInfo<v8::Value>& args) { 14470 void AnalyzeStackInNativeCode(const v8::FunctionCallbackInfo<v8::Value>& args) {
14471 v8::HandleScope scope(args.GetIsolate()); 14471 v8::HandleScope scope(args.GetIsolate());
14472 const char* origin = "capture-stack-trace-test"; 14472 const char* origin = "capture-stack-trace-test";
14473 const int kOverviewTest = 1; 14473 const int kOverviewTest = 1;
14474 const int kDetailedTest = 2; 14474 const int kDetailedTest = 2;
14475 const int kFunctionName = 3;
14476 const int kDisplayName = 4;
14477 const int kFunctionNameAndDisplayName = 5;
14478 const int kDisplayNameIsNotString = 6;
14479 const int kFunctionNameIsNotString = 7;
14475 14480
14476 DCHECK(args.Length() == 1); 14481 DCHECK(args.Length() == 1);
14477 14482
14478 int testGroup = args[0]->Int32Value(); 14483 int testGroup = args[0]->Int32Value();
14479 if (testGroup == kOverviewTest) { 14484 if (testGroup == kOverviewTest) {
14480 v8::Handle<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace( 14485 v8::Handle<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace(
14481 args.GetIsolate(), 10, v8::StackTrace::kOverview); 14486 args.GetIsolate(), 10, v8::StackTrace::kOverview);
14482 CHECK_EQ(4, stackTrace->GetFrameCount()); 14487 CHECK_EQ(4, stackTrace->GetFrameCount());
14483 checkStackFrame(origin, "bar", 2, 10, false, false, 14488 checkStackFrame(origin, "bar", 2, 10, false, false,
14484 stackTrace->GetFrame(0)); 14489 stackTrace->GetFrame(0));
(...skipping 13 matching lines...) Expand all
14498 stackTrace->GetFrame(0)); 14503 stackTrace->GetFrame(0));
14499 checkStackFrame(origin, "baz", 8, 3, false, true, 14504 checkStackFrame(origin, "baz", 8, 3, false, true,
14500 stackTrace->GetFrame(1)); 14505 stackTrace->GetFrame(1));
14501 bool is_eval = true; 14506 bool is_eval = true;
14502 // This is the source string inside the eval which has the call to baz. 14507 // This is the source string inside the eval which has the call to baz.
14503 checkStackFrame(NULL, "", 1, 1, is_eval, false, stackTrace->GetFrame(2)); 14508 checkStackFrame(NULL, "", 1, 1, is_eval, false, stackTrace->GetFrame(2));
14504 // The last frame is an anonymous function which has the initial eval call. 14509 // The last frame is an anonymous function which has the initial eval call.
14505 checkStackFrame(origin, "", 10, 1, false, false, stackTrace->GetFrame(3)); 14510 checkStackFrame(origin, "", 10, 1, false, false, stackTrace->GetFrame(3));
14506 14511
14507 CHECK(stackTrace->AsArray()->IsArray()); 14512 CHECK(stackTrace->AsArray()->IsArray());
14513 } else if (testGroup == kFunctionName) {
14514 v8::Handle<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace(
14515 args.GetIsolate(), 5, v8::StackTrace::kOverview);
14516 CHECK_EQ(3, stackTrace->GetFrameCount());
14517 checkStackFrame(origin, "function.name", 2, 24, false, false,
14518 stackTrace->GetFrame(0));
14519 } else if (testGroup == kDisplayName) {
14520 v8::Handle<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace(
14521 args.GetIsolate(), 5, v8::StackTrace::kOverview);
14522 CHECK_EQ(3, stackTrace->GetFrameCount());
14523 checkStackFrame(origin, "function.displayName", 2, 24, false, false,
14524 stackTrace->GetFrame(0));
14525 } else if (testGroup == kFunctionNameAndDisplayName) {
14526 v8::Handle<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace(
14527 args.GetIsolate(), 5, v8::StackTrace::kOverview);
14528 CHECK_EQ(3, stackTrace->GetFrameCount());
14529 checkStackFrame(origin, "function.displayName", 2, 24, false, false,
14530 stackTrace->GetFrame(0));
14531 } else if (testGroup == kDisplayNameIsNotString) {
14532 v8::Handle<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace(
14533 args.GetIsolate(), 5, v8::StackTrace::kOverview);
14534 CHECK_EQ(3, stackTrace->GetFrameCount());
14535 checkStackFrame(origin, "function.name", 2, 24, false, false,
14536 stackTrace->GetFrame(0));
14537 } else if (testGroup == kFunctionNameIsNotString) {
14538 v8::Handle<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace(
14539 args.GetIsolate(), 5, v8::StackTrace::kOverview);
14540 CHECK_EQ(3, stackTrace->GetFrameCount());
14541 checkStackFrame(origin, "f", 2, 24, false, false, stackTrace->GetFrame(0));
14508 } 14542 }
14509 } 14543 }
14510 14544
14511 14545
14512 // Tests the C++ StackTrace API. 14546 // Tests the C++ StackTrace API.
14513 // TODO(3074796): Reenable this as a THREADED_TEST once it passes. 14547 // TODO(3074796): Reenable this as a THREADED_TEST once it passes.
14514 // THREADED_TEST(CaptureStackTrace) { 14548 // THREADED_TEST(CaptureStackTrace) {
14515 TEST(CaptureStackTrace) { 14549 TEST(CaptureStackTrace) {
14516 v8::Isolate* isolate = CcTest::isolate(); 14550 v8::Isolate* isolate = CcTest::isolate();
14517 v8::HandleScope scope(isolate); 14551 v8::HandleScope scope(isolate);
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
14559 v8::Handle<v8::Integer> line_offset = v8::Integer::New(isolate, 3); 14593 v8::Handle<v8::Integer> line_offset = v8::Integer::New(isolate, 3);
14560 v8::Handle<v8::Integer> column_offset = v8::Integer::New(isolate, 5); 14594 v8::Handle<v8::Integer> column_offset = v8::Integer::New(isolate, 5);
14561 v8::ScriptOrigin detailed_origin(origin, line_offset, column_offset); 14595 v8::ScriptOrigin detailed_origin(origin, line_offset, column_offset);
14562 v8::ScriptCompiler::Source script_source2(detailed_src, detailed_origin); 14596 v8::ScriptCompiler::Source script_source2(detailed_src, detailed_origin);
14563 v8::Handle<v8::UnboundScript> detailed_script( 14597 v8::Handle<v8::UnboundScript> detailed_script(
14564 v8::ScriptCompiler::CompileUnbound(isolate, &script_source2)); 14598 v8::ScriptCompiler::CompileUnbound(isolate, &script_source2));
14565 v8::Handle<Value> detailed_result( 14599 v8::Handle<Value> detailed_result(
14566 detailed_script->BindToCurrentContext()->Run()); 14600 detailed_script->BindToCurrentContext()->Run());
14567 CHECK(!detailed_result.IsEmpty()); 14601 CHECK(!detailed_result.IsEmpty());
14568 CHECK(detailed_result->IsObject()); 14602 CHECK(detailed_result->IsObject());
14603
14604 // Test using function.name and function.displayName in stack trace
14605 const char* function_name_source =
14606 "function bar(function_name, display_name, testGroup) {\n"
14607 " var f = function() { AnalyzeStackInNativeCode(testGroup); };\n"
14608 " if (function_name) {\n"
14609 " Object.defineProperty(f, 'name', { value: function_name });\n"
14610 " }\n"
14611 " if (display_name) {\n"
14612 " f.displayName = display_name;"
14613 " }\n"
14614 " f()\n"
14615 "}\n"
14616 "bar('function.name', undefined, 3);\n"
14617 "bar(undefined, 'function.displayName', 4);\n"
14618 "bar('function.name', 'function.displayName', 5);\n"
14619 "bar('function.name', 239, 6);\n"
14620 "bar(239, undefined, 7);\n";
14621 v8::Handle<v8::String> function_name_src =
14622 v8::String::NewFromUtf8(isolate, function_name_source);
14623 v8::ScriptCompiler::Source script_source3(function_name_src,
14624 v8::ScriptOrigin(origin));
14625 v8::Handle<Value> function_name_result(
14626 v8::ScriptCompiler::CompileUnbound(isolate, &script_source3)
14627 ->BindToCurrentContext()
14628 ->Run());
14629 CHECK(!function_name_result.IsEmpty());
14569 } 14630 }
14570 14631
14571 14632
14572 static void StackTraceForUncaughtExceptionListener( 14633 static void StackTraceForUncaughtExceptionListener(
14573 v8::Handle<v8::Message> message, 14634 v8::Handle<v8::Message> message,
14574 v8::Handle<Value>) { 14635 v8::Handle<Value>) {
14575 report_count++; 14636 report_count++;
14576 v8::Handle<v8::StackTrace> stack_trace = message->GetStackTrace(); 14637 v8::Handle<v8::StackTrace> stack_trace = message->GetStackTrace();
14577 CHECK_EQ(2, stack_trace->GetFrameCount()); 14638 CHECK_EQ(2, stack_trace->GetFrameCount());
14578 checkStackFrame("origin", "foo", 2, 3, false, false, 14639 checkStackFrame("origin", "foo", 2, 3, false, false,
(...skipping 1513 matching lines...) Expand 10 before | Expand all | Expand 10 after
16092 env->GetIsolate(), 16153 env->GetIsolate(),
16093 "var foo = { bar : { baz : function() {}}}; var f = foo.bar.baz;"); 16154 "var foo = { bar : { baz : function() {}}}; var f = foo.bar.baz;");
16094 v8::Script::Compile(script, &origin)->Run(); 16155 v8::Script::Compile(script, &origin)->Run();
16095 v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast( 16156 v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast(
16096 env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f"))); 16157 env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f")));
16097 CHECK_EQ(0, 16158 CHECK_EQ(0,
16098 strcmp("foo.bar.baz", *v8::String::Utf8Value(f->GetInferredName()))); 16159 strcmp("foo.bar.baz", *v8::String::Utf8Value(f->GetInferredName())));
16099 } 16160 }
16100 16161
16101 16162
16163 THREADED_TEST(FunctionGetDebugName) {
16164 LocalContext env;
16165 v8::HandleScope scope(env->GetIsolate());
16166 const char* code =
16167 "var error = false;"
16168 "function a() { this.x = 1; };"
16169 "a.displayName = 'display_a';"
16170 "var b = (function() {"
16171 " var f = function() { this.x = 2; };"
16172 " f.displayName = 'display_b';"
16173 " return f;"
16174 "})();"
16175 "var c = function() {};"
16176 "c.__defineGetter__('displayName', function() {"
16177 " error = true;"
16178 " throw new Error();"
16179 "});"
16180 "function d() {};"
16181 "d.__defineGetter__('displayName', function() {"
16182 " error = true;"
16183 " return 'wrong_display_name';"
16184 "});"
16185 "function e() {};"
16186 "e.displayName = 'wrong_display_name';"
16187 "e.__defineSetter__('displayName', function() {"
16188 " error = true;"
16189 " throw new Error();"
16190 "});"
16191 "function f() {};"
16192 "f.displayName = { 'foo': 6, toString: function() {"
16193 " error = true;"
16194 " return 'wrong_display_name';"
16195 "}};"
16196 "var g = function() {"
16197 " arguments.callee.displayName = 'set_in_runtime';"
16198 "}; g();"
16199 "var h = function() {};"
16200 "h.displayName = 'displayName';"
16201 "Object.defineProperty(h, 'name', { value: 'function.name' });"
16202 "var i = function() {};"
16203 "i.displayName = 239;"
16204 "Object.defineProperty(i, 'name', { value: 'function.name' });"
16205 "var j = function() {};"
16206 "Object.defineProperty(j, 'name', { value: 'function.name' });"
16207 "var foo = { bar : { baz : function() {}}}; var k = foo.bar.baz;";
16208 v8::ScriptOrigin origin =
16209 v8::ScriptOrigin(v8::String::NewFromUtf8(env->GetIsolate(), "test"));
16210 v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(), code), &origin)
16211 ->Run();
16212 v8::Local<v8::Value> error =
16213 env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "error"));
16214 CHECK_EQ(false, error->BooleanValue());
16215 const char* functions[] = {"a", "display_a",
16216 "b", "display_b",
16217 "c", "c",
16218 "d", "d",
16219 "e", "e",
16220 "f", "f",
16221 "g", "set_in_runtime",
16222 "h", "displayName",
16223 "i", "function.name",
16224 "j", "function.name",
16225 "k", "foo.bar.baz"};
16226 for (size_t i = 0; i < sizeof(functions) / sizeof(functions[0]) / 2; ++i) {
16227 v8::Local<v8::Function> f =
16228 v8::Local<v8::Function>::Cast(env->Global()->Get(
16229 v8::String::NewFromUtf8(env->GetIsolate(), functions[i * 2])));
16230 CHECK_EQ(0, strcmp(functions[i * 2 + 1],
16231 *v8::String::Utf8Value(f->GetDebugName())));
16232 }
16233 }
16234
16235
16102 THREADED_TEST(FunctionGetDisplayName) { 16236 THREADED_TEST(FunctionGetDisplayName) {
16103 LocalContext env; 16237 LocalContext env;
16104 v8::HandleScope scope(env->GetIsolate()); 16238 v8::HandleScope scope(env->GetIsolate());
16105 const char* code = "var error = false;" 16239 const char* code = "var error = false;"
16106 "function a() { this.x = 1; };" 16240 "function a() { this.x = 1; };"
16107 "a.displayName = 'display_a';" 16241 "a.displayName = 'display_a';"
16108 "var b = (function() {" 16242 "var b = (function() {"
16109 " var f = function() { this.x = 2; };" 16243 " var f = function() { this.x = 2; };"
16110 " f.displayName = 'display_b';" 16244 " f.displayName = 'display_b';"
16111 " return f;" 16245 " return f;"
(...skipping 5968 matching lines...) Expand 10 before | Expand all | Expand 10 after
22080 env2->Global()->Set(v8_str("obj2"), object2); 22214 env2->Global()->Set(v8_str("obj2"), object2);
22081 ExpectString("typeof obj2.values", "function"); 22215 ExpectString("typeof obj2.values", "function");
22082 CHECK_NE(*object->Get(v8_str("values")), *object2->Get(v8_str("values"))); 22216 CHECK_NE(*object->Get(v8_str("values")), *object2->Get(v8_str("values")));
22083 22217
22084 auto values2 = Local<Function>::Cast(object2->Get(v8_str("values"))); 22218 auto values2 = Local<Function>::Cast(object2->Get(v8_str("values")));
22085 auto fn2 = i::Handle<i::JSFunction>::cast(v8::Utils::OpenHandle(*values2)); 22219 auto fn2 = i::Handle<i::JSFunction>::cast(v8::Utils::OpenHandle(*values2));
22086 auto ctx2 = v8::Utils::OpenHandle(*env2.local()); 22220 auto ctx2 = v8::Utils::OpenHandle(*env2.local());
22087 CHECK_EQ(fn2->GetCreationContext(), *ctx2); 22221 CHECK_EQ(fn2->GetCreationContext(), *ctx2);
22088 } 22222 }
22089 } 22223 }
OLDNEW
« no previous file with comments | « src/runtime/runtime-debug.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698