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 12354 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
12365 // Evaluate a piece of JavaScript in the context of a stack frame for | 12365 // Evaluate a piece of JavaScript in the context of a stack frame for |
12366 // debugging. This is done by creating a new context which in its extension | 12366 // debugging. This is done by creating a new context which in its extension |
12367 // part has all the parameters and locals of the function on the stack frame | 12367 // part has all the parameters and locals of the function on the stack frame |
12368 // as well as a materialized arguments object. As this context replaces | 12368 // as well as a materialized arguments object. As this context replaces |
12369 // the context of the function on the stack frame a new (empty) function | 12369 // the context of the function on the stack frame a new (empty) function |
12370 // is created as well to be used as the closure for the context. | 12370 // is created as well to be used as the closure for the context. |
12371 // This closure as replacements for the one on the stack frame presenting | 12371 // This closure as replacements for the one on the stack frame presenting |
12372 // the same view of the values of parameters and local variables as if the | 12372 // the same view of the values of parameters and local variables as if the |
12373 // piece of JavaScript was evaluated at the point where the function on the | 12373 // piece of JavaScript was evaluated at the point where the function on the |
12374 // stack frame is currently stopped when we compile and run the (direct) eval. | 12374 // stack frame is currently stopped when we compile and run the (direct) eval. |
12375 // Returns array of | |
12376 // #0: evaluate result | |
12377 // #1: local variables scope materizalized as object before evaluation | |
12378 // #2: local variables scope materizalized as object after evaluation | |
12379 // Since user expression only reaches (and modifies) copies of local variables, | |
12380 // those copies are returned to the caller to allow it track the changes and | |
Yang
2013/06/25 11:15:01
do you mean "... to allow tracking the changes..."
Peter Rybin
2013/06/25 12:22:41
Yes. Done.
| |
12381 // manually update the actual variables. | |
12375 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugEvaluate) { | 12382 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugEvaluate) { |
12376 HandleScope scope(isolate); | 12383 HandleScope scope(isolate); |
12377 | 12384 |
12378 // Check the execution state and decode arguments frame and source to be | 12385 // Check the execution state and decode arguments frame and source to be |
12379 // evaluated. | 12386 // evaluated. |
12380 ASSERT(args.length() == 6); | 12387 ASSERT(args.length() == 6); |
12381 Object* check_result; | 12388 Object* check_result; |
12382 { MaybeObject* maybe_result = Runtime_CheckExecutionState( | 12389 { MaybeObject* maybe_result = Runtime_CheckExecutionState( |
12383 RUNTIME_ARGUMENTS(isolate, args)); | 12390 RUNTIME_ARGUMENTS(isolate, args)); |
12384 if (!maybe_result->ToObject(&check_result)) return maybe_result; | 12391 if (!maybe_result->ToObject(&check_result)) return maybe_result; |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
12464 frame, | 12471 frame, |
12465 inlined_jsframe_index); | 12472 inlined_jsframe_index); |
12466 if (context.is_null()) { | 12473 if (context.is_null()) { |
12467 ASSERT(isolate->has_pending_exception()); | 12474 ASSERT(isolate->has_pending_exception()); |
12468 MaybeObject* exception = isolate->pending_exception(); | 12475 MaybeObject* exception = isolate->pending_exception(); |
12469 isolate->clear_pending_exception(); | 12476 isolate->clear_pending_exception(); |
12470 return exception; | 12477 return exception; |
12471 } | 12478 } |
12472 | 12479 |
12473 Handle<Object> receiver(frame->receiver(), isolate); | 12480 Handle<Object> receiver(frame->receiver(), isolate); |
12474 return DebugEvaluate(isolate, context, context_extension, receiver, source); | 12481 Object* evaluate_result_object; |
12482 { MaybeObject* maybe_result = | |
12483 DebugEvaluate(isolate, context, context_extension, receiver, source); | |
12484 if (!maybe_result->ToObject(&evaluate_result_object)) return maybe_result; | |
12485 } | |
12486 Handle<Object> evaluate_result(evaluate_result_object, isolate); | |
12487 | |
12488 Handle<JSObject> local_scope_after = MaterializeLocalScopeWithFrameInspector( | |
12489 isolate, frame, &frame_inspector); | |
12490 | |
12491 Handle<FixedArray> resultArray = | |
12492 isolate->factory()->NewFixedArray(3); | |
12493 resultArray->set(0, *evaluate_result); | |
12494 resultArray->set(2, *local_scope); | |
12495 resultArray->set(1, *local_scope_after); | |
12496 | |
12497 return *(isolate->factory()->NewJSArrayWithElements(resultArray)); | |
12475 } | 12498 } |
12476 | 12499 |
12477 | 12500 |
12478 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugEvaluateGlobal) { | 12501 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugEvaluateGlobal) { |
12479 HandleScope scope(isolate); | 12502 HandleScope scope(isolate); |
12480 | 12503 |
12481 // Check the execution state and decode arguments frame and source to be | 12504 // Check the execution state and decode arguments frame and source to be |
12482 // evaluated. | 12505 // evaluated. |
12483 ASSERT(args.length() == 4); | 12506 ASSERT(args.length() == 4); |
12484 Object* check_result; | 12507 Object* check_result; |
(...skipping 1362 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
13847 // Handle last resort GC and make sure to allow future allocations | 13870 // Handle last resort GC and make sure to allow future allocations |
13848 // to grow the heap without causing GCs (if possible). | 13871 // to grow the heap without causing GCs (if possible). |
13849 isolate->counters()->gc_last_resort_from_js()->Increment(); | 13872 isolate->counters()->gc_last_resort_from_js()->Increment(); |
13850 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags, | 13873 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags, |
13851 "Runtime::PerformGC"); | 13874 "Runtime::PerformGC"); |
13852 } | 13875 } |
13853 } | 13876 } |
13854 | 13877 |
13855 | 13878 |
13856 } } // namespace v8::internal | 13879 } } // namespace v8::internal |
OLD | NEW |