OLD | NEW |
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 14283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
14294 // This is the source string inside the eval which has the call to baz. | 14294 // This is the source string inside the eval which has the call to baz. |
14295 checkStackFrame(NULL, "", 1, 1, is_eval, false, stackTrace->GetFrame(2)); | 14295 checkStackFrame(NULL, "", 1, 1, is_eval, false, stackTrace->GetFrame(2)); |
14296 // The last frame is an anonymous function which has the initial eval call. | 14296 // The last frame is an anonymous function which has the initial eval call. |
14297 checkStackFrame(origin, "", 10, 1, false, false, stackTrace->GetFrame(3)); | 14297 checkStackFrame(origin, "", 10, 1, false, false, stackTrace->GetFrame(3)); |
14298 | 14298 |
14299 CHECK(stackTrace->AsArray()->IsArray()); | 14299 CHECK(stackTrace->AsArray()->IsArray()); |
14300 } | 14300 } |
14301 } | 14301 } |
14302 | 14302 |
14303 | 14303 |
| 14304 void ChangeNewlines(int kind, char* dest, size_t dest_len, const char* source) { |
| 14305 if (kind == 0) { |
| 14306 for (size_t i = 0; i <= strlen(source); i++) { |
| 14307 dest[i] = source[i]; |
| 14308 } |
| 14309 } else { |
| 14310 for (size_t i = 0; i <= strlen(source); i++) { |
| 14311 char c = source[i]; |
| 14312 if (c == '\n') { |
| 14313 if (kind == 1) { |
| 14314 *dest++ = '\r'; |
| 14315 *dest++ = '\n'; |
| 14316 } else { |
| 14317 // UTF-8 version of 0x2028 newline. |
| 14318 *dest++ = '\xe2'; |
| 14319 *dest++ = '\x80'; |
| 14320 *dest++ = '\xa8'; |
| 14321 } |
| 14322 } else { |
| 14323 *dest++ = c; |
| 14324 } |
| 14325 } |
| 14326 } |
| 14327 } |
| 14328 |
| 14329 |
14304 // Tests the C++ StackTrace API. | 14330 // Tests the C++ StackTrace API. |
14305 // TODO(3074796): Reenable this as a THREADED_TEST once it passes. | 14331 // TODO(3074796): Reenable this as a THREADED_TEST once it passes. |
14306 // THREADED_TEST(CaptureStackTrace) { | 14332 // THREADED_TEST(CaptureStackTrace) { |
14307 TEST(CaptureStackTrace) { | 14333 TEST(CaptureStackTrace) { |
14308 v8::Isolate* isolate = CcTest::isolate(); | 14334 v8::Isolate* isolate = CcTest::isolate(); |
14309 v8::HandleScope scope(isolate); | 14335 v8::HandleScope scope(isolate); |
14310 v8::Handle<v8::String> origin = | 14336 v8::Handle<v8::String> origin = |
14311 v8::String::NewFromUtf8(isolate, "capture-stack-trace-test"); | 14337 v8::String::NewFromUtf8(isolate, "capture-stack-trace-test"); |
14312 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); | 14338 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |
14313 templ->Set(v8_str("AnalyzeStackInNativeCode"), | 14339 templ->Set(v8_str("AnalyzeStackInNativeCode"), |
14314 v8::FunctionTemplate::New(isolate, AnalyzeStackInNativeCode)); | 14340 v8::FunctionTemplate::New(isolate, AnalyzeStackInNativeCode)); |
14315 LocalContext context(0, templ); | 14341 LocalContext context(0, templ); |
14316 | 14342 |
14317 // Test getting OVERVIEW information. Should ignore information that is not | 14343 for (int i = 0; i < 3; i++) { |
14318 // script name, function name, line number, and column offset. | 14344 // Test getting OVERVIEW information. Should ignore information that is not |
14319 const char *overview_source = | 14345 // script name, function name, line number, and column offset. |
14320 "function bar() {\n" | 14346 const char* overview_source = |
14321 " var y; AnalyzeStackInNativeCode(1);\n" | 14347 "function bar() {\n" |
14322 "}\n" | 14348 " var y; AnalyzeStackInNativeCode(1);\n" |
14323 "function foo() {\n" | 14349 "}\n" |
14324 "\n" | 14350 "function foo() {\n" |
14325 " bar();\n" | 14351 "\n" |
14326 "}\n" | 14352 " bar();\n" |
14327 "var x;eval('new foo();');"; | 14353 "}\n" |
14328 v8::Handle<v8::String> overview_src = | 14354 "var x;eval('new foo();');"; |
14329 v8::String::NewFromUtf8(isolate, overview_source); | 14355 size_t munged_length = strlen(overview_source) * 3 + 1; |
14330 v8::ScriptCompiler::Source script_source(overview_src, | 14356 char* overview_munged_source = new char[munged_length]; |
14331 v8::ScriptOrigin(origin)); | 14357 ChangeNewlines(i, overview_munged_source, munged_length, overview_source); |
14332 v8::Handle<Value> overview_result( | |
14333 v8::ScriptCompiler::CompileUnbound(isolate, &script_source) | |
14334 ->BindToCurrentContext() | |
14335 ->Run()); | |
14336 CHECK(!overview_result.IsEmpty()); | |
14337 CHECK(overview_result->IsObject()); | |
14338 | 14358 |
14339 // Test getting DETAILED information. | 14359 v8::Handle<v8::String> overview_src = |
14340 const char *detailed_source = | 14360 v8::String::NewFromUtf8(isolate, overview_munged_source); |
14341 "function bat() {AnalyzeStackInNativeCode(2);\n" | 14361 delete[] overview_munged_source; |
14342 "}\n" | 14362 v8::ScriptCompiler::Source script_source(overview_src, |
14343 "\n" | 14363 v8::ScriptOrigin(origin)); |
14344 "function baz() {\n" | 14364 v8::Handle<Value> overview_result( |
14345 " bat();\n" | 14365 v8::ScriptCompiler::CompileUnbound(isolate, &script_source) |
14346 "}\n" | 14366 ->BindToCurrentContext() |
14347 "eval('new baz();');"; | 14367 ->Run()); |
14348 v8::Handle<v8::String> detailed_src = | 14368 CHECK(!overview_result.IsEmpty()); |
14349 v8::String::NewFromUtf8(isolate, detailed_source); | 14369 CHECK(overview_result->IsObject()); |
14350 // Make the script using a non-zero line and column offset. | 14370 |
14351 v8::Handle<v8::Integer> line_offset = v8::Integer::New(isolate, 3); | 14371 // Test getting DETAILED information. |
14352 v8::Handle<v8::Integer> column_offset = v8::Integer::New(isolate, 5); | 14372 const char* detailed_source = |
14353 v8::ScriptOrigin detailed_origin(origin, line_offset, column_offset); | 14373 "function bat() {AnalyzeStackInNativeCode(2);\n" |
14354 v8::ScriptCompiler::Source script_source2(detailed_src, detailed_origin); | 14374 "}\n" |
14355 v8::Handle<v8::UnboundScript> detailed_script( | 14375 "\n" |
14356 v8::ScriptCompiler::CompileUnbound(isolate, &script_source2)); | 14376 "function baz() {\n" |
14357 v8::Handle<Value> detailed_result( | 14377 " bat();\n" |
14358 detailed_script->BindToCurrentContext()->Run()); | 14378 "}\n" |
14359 CHECK(!detailed_result.IsEmpty()); | 14379 "eval('new baz();');"; |
14360 CHECK(detailed_result->IsObject()); | 14380 munged_length = strlen(detailed_source) * 3 + 1; |
| 14381 char* detailed_munged_source = new char[munged_length]; |
| 14382 ChangeNewlines(i, detailed_munged_source, munged_length, detailed_source); |
| 14383 v8::Handle<v8::String> detailed_src = |
| 14384 v8::String::NewFromUtf8(isolate, detailed_munged_source); |
| 14385 delete[] detailed_munged_source; |
| 14386 // Make the script using a non-zero line and column offset. |
| 14387 v8::Handle<v8::Integer> line_offset = v8::Integer::New(isolate, 3); |
| 14388 v8::Handle<v8::Integer> column_offset = v8::Integer::New(isolate, 5); |
| 14389 v8::ScriptOrigin detailed_origin(origin, line_offset, column_offset); |
| 14390 v8::ScriptCompiler::Source script_source2(detailed_src, detailed_origin); |
| 14391 v8::Handle<v8::UnboundScript> detailed_script( |
| 14392 v8::ScriptCompiler::CompileUnbound(isolate, &script_source2)); |
| 14393 v8::Handle<Value> detailed_result( |
| 14394 detailed_script->BindToCurrentContext()->Run()); |
| 14395 CHECK(!detailed_result.IsEmpty()); |
| 14396 CHECK(detailed_result->IsObject()); |
| 14397 } |
14361 } | 14398 } |
14362 | 14399 |
14363 | 14400 |
14364 static void StackTraceForUncaughtExceptionListener( | 14401 static void StackTraceForUncaughtExceptionListener( |
14365 v8::Handle<v8::Message> message, | 14402 v8::Handle<v8::Message> message, |
14366 v8::Handle<Value>) { | 14403 v8::Handle<Value>) { |
14367 report_count++; | 14404 report_count++; |
14368 v8::Handle<v8::StackTrace> stack_trace = message->GetStackTrace(); | 14405 v8::Handle<v8::StackTrace> stack_trace = message->GetStackTrace(); |
14369 CHECK_EQ(2, stack_trace->GetFrameCount()); | 14406 CHECK_EQ(2, stack_trace->GetFrameCount()); |
14370 checkStackFrame("origin", "foo", 2, 3, false, false, | 14407 checkStackFrame("origin", "foo", 2, 3, false, false, |
(...skipping 7046 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
21417 CHECK_EQ(2U, set->Size()); | 21454 CHECK_EQ(2U, set->Size()); |
21418 | 21455 |
21419 v8::Local<v8::Array> keys = set->AsArray(); | 21456 v8::Local<v8::Array> keys = set->AsArray(); |
21420 CHECK_EQ(2U, keys->Length()); | 21457 CHECK_EQ(2U, keys->Length()); |
21421 CHECK_EQ(1, keys->Get(0).As<v8::Int32>()->Value()); | 21458 CHECK_EQ(1, keys->Get(0).As<v8::Int32>()->Value()); |
21422 CHECK_EQ(2, keys->Get(1).As<v8::Int32>()->Value()); | 21459 CHECK_EQ(2, keys->Get(1).As<v8::Int32>()->Value()); |
21423 | 21460 |
21424 set = v8::Set::FromArray(env.local(), keys).ToLocalChecked(); | 21461 set = v8::Set::FromArray(env.local(), keys).ToLocalChecked(); |
21425 CHECK_EQ(2U, set->Size()); | 21462 CHECK_EQ(2U, set->Size()); |
21426 } | 21463 } |
OLD | NEW |