OLD | NEW |
---|---|
1 // Copyright 2007-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2007-2008 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 416 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
427 | 427 |
428 | 428 |
429 // Source for The JavaScript function which picks out the function name on the | 429 // Source for The JavaScript function which picks out the function name on the |
430 // top frame. | 430 // top frame. |
431 const char* frame_function_name_source = | 431 const char* frame_function_name_source = |
432 "function frame_function_name(exec_state) {" | 432 "function frame_function_name(exec_state) {" |
433 " return exec_state.frame(0).func().name();" | 433 " return exec_state.frame(0).func().name();" |
434 "}"; | 434 "}"; |
435 v8::Local<v8::Function> frame_function_name; | 435 v8::Local<v8::Function> frame_function_name; |
436 | 436 |
437 | |
438 // Source for The JavaScript function which returns the number of frames. | |
439 static const char* frame_count_source = | |
440 "function frame_count(exec_state) {" | |
441 " return exec_state.frameCount();" | |
442 "}"; | |
443 v8::Handle<v8::Function> frame_count; | |
444 | |
445 | |
437 // Global variable to store the last function hit - used by some tests. | 446 // Global variable to store the last function hit - used by some tests. |
438 char last_function_hit[80]; | 447 char last_function_hit[80]; |
439 | 448 |
440 // Debug event handler which counts the break points which have been hit. | 449 // Debug event handler which counts the break points which have been hit. |
441 int break_point_hit_count = 0; | 450 int break_point_hit_count = 0; |
442 static void DebugEventBreakPointHitCount(v8::DebugEvent event, | 451 static void DebugEventBreakPointHitCount(v8::DebugEvent event, |
443 v8::Handle<v8::Object> exec_state, | 452 v8::Handle<v8::Object> exec_state, |
444 v8::Handle<v8::Object> event_data, | 453 v8::Handle<v8::Object> event_data, |
445 v8::Handle<v8::Value> data) { | 454 v8::Handle<v8::Value> data) { |
455 // When hitting a debug event listener there must be a break set. | |
456 CHECK(v8::internal::Top::is_break()); | |
457 | |
446 // Count the number of breaks. | 458 // Count the number of breaks. |
447 if (event == v8::Break) { | 459 if (event == v8::Break) { |
448 break_point_hit_count++; | 460 break_point_hit_count++; |
449 if (!frame_function_name.IsEmpty()) { | 461 if (!frame_function_name.IsEmpty()) { |
450 // Get the name of the function. | 462 // Get the name of the function. |
451 const int argc = 1; | 463 const int argc = 1; |
452 v8::Handle<v8::Value> argv[argc] = { exec_state }; | 464 v8::Handle<v8::Value> argv[argc] = { exec_state }; |
453 v8::Handle<v8::Value> result = frame_function_name->Call(exec_state, | 465 v8::Handle<v8::Value> result = frame_function_name->Call(exec_state, |
454 argc, argv); | 466 argc, argv); |
455 if (result->IsUndefined()) { | 467 if (result->IsUndefined()) { |
456 last_function_hit[0] = '\0'; | 468 last_function_hit[0] = '\0'; |
457 } else { | 469 } else { |
458 CHECK(result->IsString()); | 470 CHECK(result->IsString()); |
459 v8::Handle<v8::String> function_name(result->ToString()); | 471 v8::Handle<v8::String> function_name(result->ToString()); |
460 function_name->WriteAscii(last_function_hit); | 472 function_name->WriteAscii(last_function_hit); |
461 } | 473 } |
462 } | 474 } |
463 } | 475 } |
464 } | 476 } |
465 | 477 |
466 | 478 |
467 // Debug event handler which counts a number of events. | 479 // Debug event handler which counts a number of events and collects the stack |
480 // height is there is a function compiled for that. | |
Mads Ager (chromium)
2008/12/11 07:56:54
is there -> if there
Søren Thygesen Gjesse
2008/12/11 08:04:49
Done.
| |
468 int exception_hit_count = 0; | 481 int exception_hit_count = 0; |
469 int uncaught_exception_hit_count = 0; | 482 int uncaught_exception_hit_count = 0; |
483 int last_js_stack_height = -1; | |
470 | 484 |
471 static void DebugEventCounterClear() { | 485 static void DebugEventCounterClear() { |
472 break_point_hit_count = 0; | 486 break_point_hit_count = 0; |
473 exception_hit_count = 0; | 487 exception_hit_count = 0; |
474 uncaught_exception_hit_count = 0; | 488 uncaught_exception_hit_count = 0; |
475 } | 489 } |
476 | 490 |
477 static void DebugEventCounter(v8::DebugEvent event, | 491 static void DebugEventCounter(v8::DebugEvent event, |
478 v8::Handle<v8::Object> exec_state, | 492 v8::Handle<v8::Object> exec_state, |
479 v8::Handle<v8::Object> event_data, | 493 v8::Handle<v8::Object> event_data, |
480 v8::Handle<v8::Value> data) { | 494 v8::Handle<v8::Value> data) { |
495 // When hitting a debug event listener there must be a break set. | |
496 CHECK(v8::internal::Top::is_break()); | |
497 | |
481 // Count the number of breaks. | 498 // Count the number of breaks. |
482 if (event == v8::Break) { | 499 if (event == v8::Break) { |
483 break_point_hit_count++; | 500 break_point_hit_count++; |
484 } else if (event == v8::Exception) { | 501 } else if (event == v8::Exception) { |
485 exception_hit_count++; | 502 exception_hit_count++; |
486 | 503 |
487 // Check whether the exception was uncaught. | 504 // Check whether the exception was uncaught. |
488 v8::Local<v8::String> fun_name = v8::String::New("uncaught"); | 505 v8::Local<v8::String> fun_name = v8::String::New("uncaught"); |
489 v8::Local<v8::Function> fun = | 506 v8::Local<v8::Function> fun = |
490 v8::Function::Cast(*event_data->Get(fun_name)); | 507 v8::Function::Cast(*event_data->Get(fun_name)); |
491 v8::Local<v8::Value> result = *fun->Call(event_data, 0, NULL); | 508 v8::Local<v8::Value> result = *fun->Call(event_data, 0, NULL); |
492 if (result->IsTrue()) { | 509 if (result->IsTrue()) { |
493 uncaught_exception_hit_count++; | 510 uncaught_exception_hit_count++; |
494 } | 511 } |
495 } | 512 } |
513 | |
514 // Collect the JavsScript stack height if the function frame_count is | |
515 // compiled. | |
516 if (!frame_count.IsEmpty()) { | |
517 static const int kArgc = 1; | |
518 v8::Handle<v8::Value> argv[kArgc] = { exec_state }; | |
519 // Using exec_state as receiver is just to have a receiver. | |
520 v8::Handle<v8::Value> result = frame_count->Call(exec_state, kArgc, argv); | |
521 last_js_stack_height = result->Int32Value(); | |
522 } | |
496 } | 523 } |
497 | 524 |
498 | 525 |
499 // Debug event handler which evaluates a number of expressions when a break | 526 // Debug event handler which evaluates a number of expressions when a break |
500 // point is hit. Each evaluated expression is compared with an expected value. | 527 // point is hit. Each evaluated expression is compared with an expected value. |
501 // For this debug event handler to work the following two global varaibles | 528 // For this debug event handler to work the following two global varaibles |
502 // must be initialized. | 529 // must be initialized. |
503 // checks: An array of expressions and expected results | 530 // checks: An array of expressions and expected results |
504 // evaluate_check_function: A JavaScript function (see below) | 531 // evaluate_check_function: A JavaScript function (see below) |
505 | 532 |
(...skipping 10 matching lines...) Expand all Loading... | |
516 "function evaluate_check(exec_state, expr, expected) {" | 543 "function evaluate_check(exec_state, expr, expected) {" |
517 " return exec_state.frame(0).evaluate(expr).value() === expected;" | 544 " return exec_state.frame(0).evaluate(expr).value() === expected;" |
518 "}"; | 545 "}"; |
519 v8::Local<v8::Function> evaluate_check_function; | 546 v8::Local<v8::Function> evaluate_check_function; |
520 | 547 |
521 // The actual debug event described by the longer comment above. | 548 // The actual debug event described by the longer comment above. |
522 static void DebugEventEvaluate(v8::DebugEvent event, | 549 static void DebugEventEvaluate(v8::DebugEvent event, |
523 v8::Handle<v8::Object> exec_state, | 550 v8::Handle<v8::Object> exec_state, |
524 v8::Handle<v8::Object> event_data, | 551 v8::Handle<v8::Object> event_data, |
525 v8::Handle<v8::Value> data) { | 552 v8::Handle<v8::Value> data) { |
553 // When hitting a debug event listener there must be a break set. | |
554 CHECK(v8::internal::Top::is_break()); | |
555 | |
526 if (event == v8::Break) { | 556 if (event == v8::Break) { |
527 for (int i = 0; checks[i].expr != NULL; i++) { | 557 for (int i = 0; checks[i].expr != NULL; i++) { |
528 const int argc = 3; | 558 const int argc = 3; |
529 v8::Handle<v8::Value> argv[argc] = { exec_state, | 559 v8::Handle<v8::Value> argv[argc] = { exec_state, |
530 v8::String::New(checks[i].expr), | 560 v8::String::New(checks[i].expr), |
531 checks[i].expected }; | 561 checks[i].expected }; |
532 v8::Handle<v8::Value> result = | 562 v8::Handle<v8::Value> result = |
533 evaluate_check_function->Call(exec_state, argc, argv); | 563 evaluate_check_function->Call(exec_state, argc, argv); |
534 if (!result->IsTrue()) { | 564 if (!result->IsTrue()) { |
535 v8::String::AsciiValue ascii(checks[i].expected->ToString()); | 565 v8::String::AsciiValue ascii(checks[i].expected->ToString()); |
536 V8_Fatal(__FILE__, __LINE__, "%s != %s", checks[i].expr, *ascii); | 566 V8_Fatal(__FILE__, __LINE__, "%s != %s", checks[i].expr, *ascii); |
537 } | 567 } |
538 } | 568 } |
539 } | 569 } |
540 } | 570 } |
541 | 571 |
542 | 572 |
543 // This debug event listener removes a breakpoint in a function | 573 // This debug event listener removes a breakpoint in a function |
544 int debug_event_remove_break_point = 0; | 574 int debug_event_remove_break_point = 0; |
545 static void DebugEventRemoveBreakPoint(v8::DebugEvent event, | 575 static void DebugEventRemoveBreakPoint(v8::DebugEvent event, |
546 v8::Handle<v8::Object> exec_state, | 576 v8::Handle<v8::Object> exec_state, |
547 v8::Handle<v8::Object> event_data, | 577 v8::Handle<v8::Object> event_data, |
548 v8::Handle<v8::Value> data) { | 578 v8::Handle<v8::Value> data) { |
579 // When hitting a debug event listener there must be a break set. | |
580 CHECK(v8::internal::Top::is_break()); | |
581 | |
549 if (event == v8::Break) { | 582 if (event == v8::Break) { |
550 break_point_hit_count++; | 583 break_point_hit_count++; |
551 v8::Handle<v8::Function> fun = v8::Handle<v8::Function>::Cast(data); | 584 v8::Handle<v8::Function> fun = v8::Handle<v8::Function>::Cast(data); |
552 ClearBreakPoint(debug_event_remove_break_point); | 585 ClearBreakPoint(debug_event_remove_break_point); |
553 } | 586 } |
554 } | 587 } |
555 | 588 |
556 | 589 |
557 // Debug event handler which counts break points hit and performs a step | 590 // Debug event handler which counts break points hit and performs a step |
558 // afterwards. | 591 // afterwards. |
559 StepAction step_action = StepIn; // Step action to perform when stepping. | 592 StepAction step_action = StepIn; // Step action to perform when stepping. |
560 static void DebugEventStep(v8::DebugEvent event, | 593 static void DebugEventStep(v8::DebugEvent event, |
561 v8::Handle<v8::Object> exec_state, | 594 v8::Handle<v8::Object> exec_state, |
562 v8::Handle<v8::Object> event_data, | 595 v8::Handle<v8::Object> event_data, |
563 v8::Handle<v8::Value> data) { | 596 v8::Handle<v8::Value> data) { |
597 // When hitting a debug event listener there must be a break set. | |
598 CHECK(v8::internal::Top::is_break()); | |
599 | |
564 if (event == v8::Break) { | 600 if (event == v8::Break) { |
565 break_point_hit_count++; | 601 break_point_hit_count++; |
566 PrepareStep(step_action); | 602 PrepareStep(step_action); |
567 } | 603 } |
568 } | 604 } |
569 | 605 |
570 | 606 |
571 // Debug event handler which counts break points hit and performs a step | 607 // Debug event handler which counts break points hit and performs a step |
572 // afterwards. For each call the expected function is checked. | 608 // afterwards. For each call the expected function is checked. |
573 // For this debug event handler to work the following two global varaibles | 609 // For this debug event handler to work the following two global varaibles |
574 // must be initialized. | 610 // must be initialized. |
575 // expected_step_sequence: An array of the expected function call sequence. | 611 // expected_step_sequence: An array of the expected function call sequence. |
576 // frame_function_name: A JavaScript function (see below). | 612 // frame_function_name: A JavaScript function (see below). |
577 | 613 |
578 // String containing the expected function call sequence. Note: this only works | 614 // String containing the expected function call sequence. Note: this only works |
579 // if functions have name length of one. | 615 // if functions have name length of one. |
580 const char* expected_step_sequence = NULL; | 616 const char* expected_step_sequence = NULL; |
581 | 617 |
582 // The actual debug event described by the longer comment above. | 618 // The actual debug event described by the longer comment above. |
583 static void DebugEventStepSequence(v8::DebugEvent event, | 619 static void DebugEventStepSequence(v8::DebugEvent event, |
584 v8::Handle<v8::Object> exec_state, | 620 v8::Handle<v8::Object> exec_state, |
585 v8::Handle<v8::Object> event_data, | 621 v8::Handle<v8::Object> event_data, |
586 v8::Handle<v8::Value> data) { | 622 v8::Handle<v8::Value> data) { |
623 // When hitting a debug event listener there must be a break set. | |
624 CHECK(v8::internal::Top::is_break()); | |
625 | |
587 if (event == v8::Break || event == v8::Exception) { | 626 if (event == v8::Break || event == v8::Exception) { |
588 // Check that the current function is the expected. | 627 // Check that the current function is the expected. |
589 CHECK(break_point_hit_count < | 628 CHECK(break_point_hit_count < |
590 static_cast<int>(strlen(expected_step_sequence))); | 629 static_cast<int>(strlen(expected_step_sequence))); |
591 const int argc = 1; | 630 const int argc = 1; |
592 v8::Handle<v8::Value> argv[argc] = { exec_state }; | 631 v8::Handle<v8::Value> argv[argc] = { exec_state }; |
593 v8::Handle<v8::Value> result = frame_function_name->Call(exec_state, | 632 v8::Handle<v8::Value> result = frame_function_name->Call(exec_state, |
594 argc, argv); | 633 argc, argv); |
595 CHECK(result->IsString()); | 634 CHECK(result->IsString()); |
596 v8::String::AsciiValue function_name(result->ToString()); | 635 v8::String::AsciiValue function_name(result->ToString()); |
597 CHECK_EQ(1, strlen(*function_name)); | 636 CHECK_EQ(1, strlen(*function_name)); |
598 CHECK_EQ((*function_name)[0], | 637 CHECK_EQ((*function_name)[0], |
599 expected_step_sequence[break_point_hit_count]); | 638 expected_step_sequence[break_point_hit_count]); |
600 | 639 |
601 // Perform step. | 640 // Perform step. |
602 break_point_hit_count++; | 641 break_point_hit_count++; |
603 PrepareStep(step_action); | 642 PrepareStep(step_action); |
604 } | 643 } |
605 } | 644 } |
606 | 645 |
607 | 646 |
608 // Debug event handler which performs a garbage collection. | 647 // Debug event handler which performs a garbage collection. |
609 static void DebugEventBreakPointCollectGarbage( | 648 static void DebugEventBreakPointCollectGarbage( |
610 v8::DebugEvent event, | 649 v8::DebugEvent event, |
611 v8::Handle<v8::Object> exec_state, | 650 v8::Handle<v8::Object> exec_state, |
612 v8::Handle<v8::Object> event_data, | 651 v8::Handle<v8::Object> event_data, |
613 v8::Handle<v8::Value> data) { | 652 v8::Handle<v8::Value> data) { |
653 // When hitting a debug event listener there must be a break set. | |
654 CHECK(v8::internal::Top::is_break()); | |
655 | |
614 // Perform a garbage collection when break point is hit and continue. Based | 656 // Perform a garbage collection when break point is hit and continue. Based |
615 // on the number of break points hit either scavenge or mark compact | 657 // on the number of break points hit either scavenge or mark compact |
616 // collector is used. | 658 // collector is used. |
617 if (event == v8::Break) { | 659 if (event == v8::Break) { |
618 break_point_hit_count++; | 660 break_point_hit_count++; |
619 if (break_point_hit_count % 2 == 0) { | 661 if (break_point_hit_count % 2 == 0) { |
620 // Scavenge. | 662 // Scavenge. |
621 Heap::CollectGarbage(0, v8::internal::NEW_SPACE); | 663 Heap::CollectGarbage(0, v8::internal::NEW_SPACE); |
622 } else { | 664 } else { |
623 // Mark sweep (and perhaps compact). | 665 // Mark sweep (and perhaps compact). |
624 Heap::CollectAllGarbage(); | 666 Heap::CollectAllGarbage(); |
625 } | 667 } |
626 } | 668 } |
627 } | 669 } |
628 | 670 |
629 | 671 |
630 // Debug event handler which re-issues a debug break and calls the garbage | 672 // Debug event handler which re-issues a debug break and calls the garbage |
631 // collector to have the heap verified. | 673 // collector to have the heap verified. |
632 static void DebugEventBreak(v8::DebugEvent event, | 674 static void DebugEventBreak(v8::DebugEvent event, |
633 v8::Handle<v8::Object> exec_state, | 675 v8::Handle<v8::Object> exec_state, |
634 v8::Handle<v8::Object> event_data, | 676 v8::Handle<v8::Object> event_data, |
635 v8::Handle<v8::Value> data) { | 677 v8::Handle<v8::Value> data) { |
678 // When hitting a debug event listener there must be a break set. | |
679 CHECK(v8::internal::Top::is_break()); | |
680 | |
636 if (event == v8::Break) { | 681 if (event == v8::Break) { |
637 // Count the number of breaks. | 682 // Count the number of breaks. |
638 break_point_hit_count++; | 683 break_point_hit_count++; |
639 | 684 |
640 // Run the garbage collector to enforce heap verification if option | 685 // Run the garbage collector to enforce heap verification if option |
641 // --verify-heap is set. | 686 // --verify-heap is set. |
642 Heap::CollectGarbage(0, v8::internal::NEW_SPACE); | 687 Heap::CollectGarbage(0, v8::internal::NEW_SPACE); |
643 | 688 |
644 // Set the break flag again to come back here as soon as possible. | 689 // Set the break flag again to come back here as soon as possible. |
645 v8::Debug::DebugBreak(); | 690 v8::Debug::DebugBreak(); |
(...skipping 1511 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2157 | 2202 |
2158 // Without stepping only active break points are hit. | 2203 // Without stepping only active break points are hit. |
2159 CHECK_EQ(1, break_point_hit_count); | 2204 CHECK_EQ(1, break_point_hit_count); |
2160 | 2205 |
2161 v8::Debug::RemoveDebugEventListener(DebugEventBreakPointHitCount); | 2206 v8::Debug::RemoveDebugEventListener(DebugEventBreakPointHitCount); |
2162 } | 2207 } |
2163 | 2208 |
2164 | 2209 |
2165 // Test break on exceptions. For each exception break combination the number | 2210 // Test break on exceptions. For each exception break combination the number |
2166 // of debug event exception callbacks and message callbacks are collected. The | 2211 // of debug event exception callbacks and message callbacks are collected. The |
2167 // number of debug event exception callbacks are cused to check that the | 2212 // number of debug event exception callbacks are used to check that the |
2168 // debugger is called correctly and the number of message callbacks is used to | 2213 // debugger is called correctly and the number of message callbacks is used to |
2169 // check that uncaught exceptions are still returned even if there is a break | 2214 // check that uncaught exceptions are still returned even if there is a break |
2170 // for them. | 2215 // for them. |
2171 TEST(BreakOnException) { | 2216 TEST(BreakOnException) { |
2172 v8::HandleScope scope; | 2217 v8::HandleScope scope; |
2173 DebugLocalContext env; | 2218 DebugLocalContext env; |
2174 env.ExposeDebug(); | 2219 env.ExposeDebug(); |
2175 | 2220 |
2176 v8::internal::Top::TraceException(false); | 2221 v8::internal::Top::TraceException(false); |
2177 | 2222 |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2302 notCaught->Call(env->Global(), 0, NULL); | 2347 notCaught->Call(env->Global(), 0, NULL); |
2303 CHECK_EQ(2, exception_hit_count); | 2348 CHECK_EQ(2, exception_hit_count); |
2304 CHECK_EQ(1, uncaught_exception_hit_count); | 2349 CHECK_EQ(1, uncaught_exception_hit_count); |
2305 CHECK_EQ(1, message_callback_count); | 2350 CHECK_EQ(1, message_callback_count); |
2306 | 2351 |
2307 v8::Debug::RemoveDebugEventListener(DebugEventCounter); | 2352 v8::Debug::RemoveDebugEventListener(DebugEventCounter); |
2308 v8::V8::RemoveMessageListeners(MessageCallbackCount); | 2353 v8::V8::RemoveMessageListeners(MessageCallbackCount); |
2309 } | 2354 } |
2310 | 2355 |
2311 | 2356 |
2357 // Test break on exception from compiler errors. When compiling using using | |
Mads Ager (chromium)
2008/12/11 07:56:54
using using -> using
Søren Thygesen Gjesse
2008/12/11 08:04:49
Done.
| |
2358 // v8::Script::Compile there is no JavaScript stack whereas when compiling using | |
2359 // eval there are JavaScript frames. | |
2360 TEST(BreakOnCompileException) { | |
2361 v8::HandleScope scope; | |
2362 DebugLocalContext env; | |
2363 | |
2364 v8::internal::Top::TraceException(false); | |
2365 | |
2366 // Create a function for checking the function when hitting a break point. | |
2367 frame_count = CompileFunction(&env, frame_count_source, "frame_count"); | |
2368 | |
2369 v8::V8::AddMessageListener(MessageCallbackCount); | |
2370 v8::Debug::AddDebugEventListener(DebugEventCounter); | |
2371 | |
2372 DebugEventCounterClear(); | |
2373 MessageCallbackCountClear(); | |
2374 | |
2375 // Check initial state. | |
2376 CHECK_EQ(0, exception_hit_count); | |
2377 CHECK_EQ(0, uncaught_exception_hit_count); | |
2378 CHECK_EQ(0, message_callback_count); | |
2379 CHECK_EQ(-1, last_js_stack_height); | |
2380 | |
2381 // Throws SyntaxError: Unexpected end of input | |
2382 v8::Script::Compile(v8::String::New("+++")); | |
2383 CHECK_EQ(1, exception_hit_count); | |
2384 CHECK_EQ(1, uncaught_exception_hit_count); | |
2385 CHECK_EQ(1, message_callback_count); | |
2386 CHECK_EQ(0, last_js_stack_height); // No JavaScript stack. | |
2387 | |
2388 // Throws SyntaxError: Unexpected identifier | |
2389 v8::Script::Compile(v8::String::New("x x")); | |
2390 CHECK_EQ(2, exception_hit_count); | |
2391 CHECK_EQ(2, uncaught_exception_hit_count); | |
2392 CHECK_EQ(2, message_callback_count); | |
2393 CHECK_EQ(0, last_js_stack_height); // No JavaScript stack. | |
2394 | |
2395 // Throws SyntaxError: Unexpected end of input | |
2396 v8::Script::Compile(v8::String::New("eval('+++')"))->Run(); | |
2397 CHECK_EQ(3, exception_hit_count); | |
2398 CHECK_EQ(3, uncaught_exception_hit_count); | |
2399 CHECK_EQ(3, message_callback_count); | |
2400 CHECK_EQ(1, last_js_stack_height); | |
2401 | |
2402 // Throws SyntaxError: Unexpected identifier | |
2403 v8::Script::Compile(v8::String::New("eval('x x')"))->Run(); | |
2404 CHECK_EQ(4, exception_hit_count); | |
2405 CHECK_EQ(4, uncaught_exception_hit_count); | |
2406 CHECK_EQ(4, message_callback_count); | |
2407 CHECK_EQ(1, last_js_stack_height); | |
2408 } | |
2409 | |
2410 | |
2312 TEST(StepWithException) { | 2411 TEST(StepWithException) { |
2313 v8::HandleScope scope; | 2412 v8::HandleScope scope; |
2314 DebugLocalContext env; | 2413 DebugLocalContext env; |
2315 | 2414 |
2316 // Create a function for checking the function when hitting a break point. | 2415 // Create a function for checking the function when hitting a break point. |
2317 frame_function_name = CompileFunction(&env, | 2416 frame_function_name = CompileFunction(&env, |
2318 frame_function_name_source, | 2417 frame_function_name_source, |
2319 "frame_function_name"); | 2418 "frame_function_name"); |
2320 | 2419 |
2321 // Register a debug event listener which steps and counts. | 2420 // Register a debug event listener which steps and counts. |
(...skipping 839 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3161 | 3260 |
3162 | 3261 |
3163 TEST(SendCommandToUninitializedVM) { | 3262 TEST(SendCommandToUninitializedVM) { |
3164 const char* dummy_command = "{}"; | 3263 const char* dummy_command = "{}"; |
3165 uint16_t dummy_buffer[80]; | 3264 uint16_t dummy_buffer[80]; |
3166 int dummy_length = AsciiToUtf16(dummy_command, dummy_buffer); | 3265 int dummy_length = AsciiToUtf16(dummy_command, dummy_buffer); |
3167 v8::Debug::SendCommand(dummy_buffer, dummy_length); | 3266 v8::Debug::SendCommand(dummy_buffer, dummy_length); |
3168 } | 3267 } |
3169 | 3268 |
3170 | 3269 |
3171 // Source for The JavaScript function which returns the number of frames. | |
3172 static const char* frame_count_source = | |
3173 "function frame_count(exec_state) {" | |
3174 " return exec_state.frameCount();" | |
3175 "}"; | |
3176 v8::Handle<v8::Function> frame_count; | |
3177 | |
3178 | |
3179 // Source for a JavaScript function which returns the source line for the top | 3270 // Source for a JavaScript function which returns the source line for the top |
3180 // frame. | 3271 // frame. |
3181 static const char* frame_source_line_source = | 3272 static const char* frame_source_line_source = |
3182 "function frame_source_line(exec_state) {" | 3273 "function frame_source_line(exec_state) {" |
3183 " return exec_state.frame(0).sourceLine();" | 3274 " return exec_state.frame(0).sourceLine();" |
3184 "}"; | 3275 "}"; |
3185 v8::Handle<v8::Function> frame_source_line; | 3276 v8::Handle<v8::Function> frame_source_line; |
3186 | 3277 |
3187 | 3278 |
3188 // Source for a JavaScript function which returns the data parameter of a | 3279 // Source for a JavaScript function which returns the data parameter of a |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3311 " CheckSourceLine(2)\n" | 3402 " CheckSourceLine(2)\n" |
3312 " CheckSourceLine(3)\n" | 3403 " CheckSourceLine(3)\n" |
3313 "}; f()"))->Run(); | 3404 "}; f()"))->Run(); |
3314 | 3405 |
3315 // Test that a parameter can be passed to a function called in the debugger. | 3406 // Test that a parameter can be passed to a function called in the debugger. |
3316 v8::Script::Compile(v8::String::New("CheckDataParameter()"))->Run(); | 3407 v8::Script::Compile(v8::String::New("CheckDataParameter()"))->Run(); |
3317 | 3408 |
3318 // Test that a function with closure can be run in the debugger. | 3409 // Test that a function with closure can be run in the debugger. |
3319 v8::Script::Compile(v8::String::New("CheckClosure()"))->Run(); | 3410 v8::Script::Compile(v8::String::New("CheckClosure()"))->Run(); |
3320 } | 3411 } |
OLD | NEW |