| 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 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 64 // Script::CompilationType in objects.h. | 64 // Script::CompilationType in objects.h. |
| 65 Debug.ScriptCompilationType = { Host: 0, | 65 Debug.ScriptCompilationType = { Host: 0, |
| 66 Eval: 1, | 66 Eval: 1, |
| 67 JSON: 2 }; | 67 JSON: 2 }; |
| 68 | 68 |
| 69 // The different script break point types. | 69 // The different script break point types. |
| 70 Debug.ScriptBreakPointType = { ScriptId: 0, | 70 Debug.ScriptBreakPointType = { ScriptId: 0, |
| 71 ScriptName: 1, | 71 ScriptName: 1, |
| 72 ScriptRegExp: 2 }; | 72 ScriptRegExp: 2 }; |
| 73 | 73 |
| 74 // The different types of breakpoint position alignments. | |
| 75 // Must match BreakPositionAlignment in debug.h. | |
| 76 Debug.BreakPositionAlignment = { | |
| 77 Statement: 0, | |
| 78 BreakPosition: 1 | |
| 79 }; | |
| 80 | |
| 81 function ScriptTypeFlag(type) { | 74 function ScriptTypeFlag(type) { |
| 82 return (1 << type); | 75 return (1 << type); |
| 83 } | 76 } |
| 84 | 77 |
| 85 // Globals. | 78 // Globals. |
| 86 var next_response_seq = 0; | 79 var next_response_seq = 0; |
| 87 var next_break_point_number = 1; | 80 var next_break_point_number = 1; |
| 88 var break_points = []; | 81 var break_points = []; |
| 89 var script_break_points = []; | 82 var script_break_points = []; |
| 90 var debugger_flags = { | 83 var debugger_flags = { |
| (...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 251 // the break point is triggered and supposed to break execution. | 244 // the break point is triggered and supposed to break execution. |
| 252 function IsBreakPointTriggered(break_id, break_point) { | 245 function IsBreakPointTriggered(break_id, break_point) { |
| 253 return break_point.isTriggered(MakeExecutionState(break_id)); | 246 return break_point.isTriggered(MakeExecutionState(break_id)); |
| 254 } | 247 } |
| 255 | 248 |
| 256 | 249 |
| 257 // Object representing a script break point. The script is referenced by its | 250 // Object representing a script break point. The script is referenced by its |
| 258 // script name or script id and the break point is represented as line and | 251 // script name or script id and the break point is represented as line and |
| 259 // column. | 252 // column. |
| 260 function ScriptBreakPoint(type, script_id_or_name, opt_line, opt_column, | 253 function ScriptBreakPoint(type, script_id_or_name, opt_line, opt_column, |
| 261 opt_groupId, opt_position_alignment) { | 254 opt_groupId) { |
| 262 this.type_ = type; | 255 this.type_ = type; |
| 263 if (type == Debug.ScriptBreakPointType.ScriptId) { | 256 if (type == Debug.ScriptBreakPointType.ScriptId) { |
| 264 this.script_id_ = script_id_or_name; | 257 this.script_id_ = script_id_or_name; |
| 265 } else if (type == Debug.ScriptBreakPointType.ScriptName) { | 258 } else if (type == Debug.ScriptBreakPointType.ScriptName) { |
| 266 this.script_name_ = script_id_or_name; | 259 this.script_name_ = script_id_or_name; |
| 267 } else if (type == Debug.ScriptBreakPointType.ScriptRegExp) { | 260 } else if (type == Debug.ScriptBreakPointType.ScriptRegExp) { |
| 268 this.script_regexp_object_ = new RegExp(script_id_or_name); | 261 this.script_regexp_object_ = new RegExp(script_id_or_name); |
| 269 } else { | 262 } else { |
| 270 throw new Error("Unexpected breakpoint type " + type); | 263 throw new Error("Unexpected breakpoint type " + type); |
| 271 } | 264 } |
| 272 this.line_ = opt_line || 0; | 265 this.line_ = opt_line || 0; |
| 273 this.column_ = opt_column; | 266 this.column_ = opt_column; |
| 274 this.groupId_ = opt_groupId; | 267 this.groupId_ = opt_groupId; |
| 275 this.position_alignment_ = IS_UNDEFINED(opt_position_alignment) | |
| 276 ? Debug.BreakPositionAlignment.Statement : opt_position_alignment; | |
| 277 this.hit_count_ = 0; | 268 this.hit_count_ = 0; |
| 278 this.active_ = true; | 269 this.active_ = true; |
| 279 this.condition_ = null; | 270 this.condition_ = null; |
| 280 this.ignoreCount_ = 0; | 271 this.ignoreCount_ = 0; |
| 281 this.break_points_ = []; | 272 this.break_points_ = []; |
| 282 } | 273 } |
| 283 | 274 |
| 284 | 275 |
| 285 //Creates a clone of script breakpoint that is linked to another script. | 276 //Creates a clone of script breakpoint that is linked to another script. |
| 286 ScriptBreakPoint.prototype.cloneForOtherScript = function (other_script) { | 277 ScriptBreakPoint.prototype.cloneForOtherScript = function (other_script) { |
| 287 var copy = new ScriptBreakPoint(Debug.ScriptBreakPointType.ScriptId, | 278 var copy = new ScriptBreakPoint(Debug.ScriptBreakPointType.ScriptId, |
| 288 other_script.id, this.line_, this.column_, this.groupId_, | 279 other_script.id, this.line_, this.column_, this.groupId_); |
| 289 this.position_alignment_); | |
| 290 copy.number_ = next_break_point_number++; | 280 copy.number_ = next_break_point_number++; |
| 291 script_break_points.push(copy); | 281 script_break_points.push(copy); |
| 292 | 282 |
| 293 copy.hit_count_ = this.hit_count_; | 283 copy.hit_count_ = this.hit_count_; |
| 294 copy.active_ = this.active_; | 284 copy.active_ = this.active_; |
| 295 copy.condition_ = this.condition_; | 285 copy.condition_ = this.condition_; |
| 296 copy.ignoreCount_ = this.ignoreCount_; | 286 copy.ignoreCount_ = this.ignoreCount_; |
| 297 return copy; | 287 return copy; |
| 298 }; | 288 }; |
| 299 | 289 |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 446 // Convert the line and column into an absolute position within the script. | 436 // Convert the line and column into an absolute position within the script. |
| 447 var position = Debug.findScriptSourcePosition(script, this.line(), column); | 437 var position = Debug.findScriptSourcePosition(script, this.line(), column); |
| 448 | 438 |
| 449 // If the position is not found in the script (the script might be shorter | 439 // If the position is not found in the script (the script might be shorter |
| 450 // than it used to be) just ignore it. | 440 // than it used to be) just ignore it. |
| 451 if (position === null) return; | 441 if (position === null) return; |
| 452 | 442 |
| 453 // Create a break point object and set the break point. | 443 // Create a break point object and set the break point. |
| 454 break_point = MakeBreakPoint(position, this); | 444 break_point = MakeBreakPoint(position, this); |
| 455 break_point.setIgnoreCount(this.ignoreCount()); | 445 break_point.setIgnoreCount(this.ignoreCount()); |
| 456 var actual_position = %SetScriptBreakPoint(script, position, | 446 var actual_position = %SetScriptBreakPoint(script, position, break_point); |
| 457 this.position_alignment_, | |
| 458 break_point); | |
| 459 if (IS_UNDEFINED(actual_position)) { | 447 if (IS_UNDEFINED(actual_position)) { |
| 460 actual_position = position; | 448 actual_position = position; |
| 461 } | 449 } |
| 462 var actual_location = script.locationFromPosition(actual_position, true); | 450 var actual_location = script.locationFromPosition(actual_position, true); |
| 463 break_point.actual_location = { line: actual_location.line, | 451 break_point.actual_location = { line: actual_location.line, |
| 464 column: actual_location.column, | 452 column: actual_location.column, |
| 465 script_id: script.id }; | 453 script_id: script.id }; |
| 466 this.break_points_.push(break_point); | 454 this.break_points_.push(break_point); |
| 467 return break_point; | 455 return break_point; |
| 468 }; | 456 }; |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 514 throw new Error('Parameters have wrong types.'); | 502 throw new Error('Parameters have wrong types.'); |
| 515 } | 503 } |
| 516 %SetDebugEventListener(listener, opt_data); | 504 %SetDebugEventListener(listener, opt_data); |
| 517 }; | 505 }; |
| 518 | 506 |
| 519 | 507 |
| 520 Debug.breakExecution = function(f) { | 508 Debug.breakExecution = function(f) { |
| 521 %Break(); | 509 %Break(); |
| 522 }; | 510 }; |
| 523 | 511 |
| 524 Debug.breakLocations = function(f, opt_position_aligment) { | 512 Debug.breakLocations = function(f) { |
| 525 if (!IS_FUNCTION(f)) throw new Error('Parameters have wrong types.'); | 513 if (!IS_FUNCTION(f)) throw new Error('Parameters have wrong types.'); |
| 526 var position_aligment = IS_UNDEFINED(opt_position_aligment) | 514 return %GetBreakLocations(f); |
| 527 ? Debug.BreakPositionAlignment.Statement : opt_position_aligment; | |
| 528 return %GetBreakLocations(f, position_aligment); | |
| 529 }; | 515 }; |
| 530 | 516 |
| 531 // Returns a Script object. If the parameter is a function the return value | 517 // Returns a Script object. If the parameter is a function the return value |
| 532 // is the script in which the function is defined. If the parameter is a string | 518 // is the script in which the function is defined. If the parameter is a string |
| 533 // the return value is the script for which the script name has that string | 519 // the return value is the script for which the script name has that string |
| 534 // value. If it is a regexp and there is a unique script whose name matches | 520 // value. If it is a regexp and there is a unique script whose name matches |
| 535 // we return that, otherwise undefined. | 521 // we return that, otherwise undefined. |
| 536 Debug.findScript = function(func_or_script_name) { | 522 Debug.findScript = function(func_or_script_name) { |
| 537 if (IS_FUNCTION(func_or_script_name)) { | 523 if (IS_FUNCTION(func_or_script_name)) { |
| 538 return %FunctionGetScript(func_or_script_name); | 524 return %FunctionGetScript(func_or_script_name); |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 681 break_point.actual_location = { line: actual_location.line, | 667 break_point.actual_location = { line: actual_location.line, |
| 682 column: actual_location.column, | 668 column: actual_location.column, |
| 683 script_id: script.id }; | 669 script_id: script.id }; |
| 684 break_point.setCondition(opt_condition); | 670 break_point.setCondition(opt_condition); |
| 685 return break_point.number(); | 671 return break_point.number(); |
| 686 } | 672 } |
| 687 }; | 673 }; |
| 688 | 674 |
| 689 | 675 |
| 690 Debug.setBreakPointByScriptIdAndPosition = function(script_id, position, | 676 Debug.setBreakPointByScriptIdAndPosition = function(script_id, position, |
| 691 condition, enabled, | 677 condition, enabled) |
| 692 opt_position_alignment) | |
| 693 { | 678 { |
| 694 break_point = MakeBreakPoint(position); | 679 break_point = MakeBreakPoint(position); |
| 695 break_point.setCondition(condition); | 680 break_point.setCondition(condition); |
| 696 if (!enabled) { | 681 if (!enabled) { |
| 697 break_point.disable(); | 682 break_point.disable(); |
| 698 } | 683 } |
| 699 var scripts = this.scripts(); | 684 var scripts = this.scripts(); |
| 700 var position_alignment = IS_UNDEFINED(opt_position_alignment) | |
| 701 ? Debug.BreakPositionAlignment.Statement : opt_position_alignment; | |
| 702 for (var i = 0; i < scripts.length; i++) { | 685 for (var i = 0; i < scripts.length; i++) { |
| 703 if (script_id == scripts[i].id) { | 686 if (script_id == scripts[i].id) { |
| 704 break_point.actual_position = %SetScriptBreakPoint(scripts[i], position, | 687 break_point.actual_position = %SetScriptBreakPoint(scripts[i], position, |
| 705 position_alignment, break_point); | 688 break_point); |
| 706 break; | 689 break; |
| 707 } | 690 } |
| 708 } | 691 } |
| 709 return break_point; | 692 return break_point; |
| 710 }; | 693 }; |
| 711 | 694 |
| 712 | 695 |
| 713 Debug.enableBreakPoint = function(break_point_number) { | 696 Debug.enableBreakPoint = function(break_point_number) { |
| 714 var break_point = this.findBreakPoint(break_point_number, false); | 697 var break_point = this.findBreakPoint(break_point_number, false); |
| 715 // Only enable if the breakpoint hasn't been deleted: | 698 // Only enable if the breakpoint hasn't been deleted: |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 790 } | 773 } |
| 791 } | 774 } |
| 792 return script_break_point; | 775 return script_break_point; |
| 793 }; | 776 }; |
| 794 | 777 |
| 795 | 778 |
| 796 // Sets a breakpoint in a script identified through id or name at the | 779 // Sets a breakpoint in a script identified through id or name at the |
| 797 // specified source line and column within that line. | 780 // specified source line and column within that line. |
| 798 Debug.setScriptBreakPoint = function(type, script_id_or_name, | 781 Debug.setScriptBreakPoint = function(type, script_id_or_name, |
| 799 opt_line, opt_column, opt_condition, | 782 opt_line, opt_column, opt_condition, |
| 800 opt_groupId, opt_position_alignment) { | 783 opt_groupId) { |
| 801 // Create script break point object. | 784 // Create script break point object. |
| 802 var script_break_point = | 785 var script_break_point = |
| 803 new ScriptBreakPoint(type, script_id_or_name, opt_line, opt_column, | 786 new ScriptBreakPoint(type, script_id_or_name, opt_line, opt_column, |
| 804 opt_groupId, opt_position_alignment); | 787 opt_groupId); |
| 805 | 788 |
| 806 // Assign number to the new script break point and add it. | 789 // Assign number to the new script break point and add it. |
| 807 script_break_point.number_ = next_break_point_number++; | 790 script_break_point.number_ = next_break_point_number++; |
| 808 script_break_point.setCondition(opt_condition); | 791 script_break_point.setCondition(opt_condition); |
| 809 script_break_points.push(script_break_point); | 792 script_break_points.push(script_break_point); |
| 810 | 793 |
| 811 // Run through all scripts to see if this script break point matches any | 794 // Run through all scripts to see if this script break point matches any |
| 812 // loaded scripts. | 795 // loaded scripts. |
| 813 var scripts = this.scripts(); | 796 var scripts = this.scripts(); |
| 814 for (var i = 0; i < scripts.length; i++) { | 797 for (var i = 0; i < scripts.length; i++) { |
| 815 if (script_break_point.matchesScript(scripts[i])) { | 798 if (script_break_point.matchesScript(scripts[i])) { |
| 816 script_break_point.set(scripts[i]); | 799 script_break_point.set(scripts[i]); |
| 817 } | 800 } |
| 818 } | 801 } |
| 819 | 802 |
| 820 return script_break_point.number(); | 803 return script_break_point.number(); |
| 821 }; | 804 }; |
| 822 | 805 |
| 823 | 806 |
| 824 Debug.setScriptBreakPointById = function(script_id, | 807 Debug.setScriptBreakPointById = function(script_id, |
| 825 opt_line, opt_column, | 808 opt_line, opt_column, |
| 826 opt_condition, opt_groupId, | 809 opt_condition, opt_groupId) { |
| 827 opt_position_alignment) { | |
| 828 return this.setScriptBreakPoint(Debug.ScriptBreakPointType.ScriptId, | 810 return this.setScriptBreakPoint(Debug.ScriptBreakPointType.ScriptId, |
| 829 script_id, opt_line, opt_column, | 811 script_id, opt_line, opt_column, |
| 830 opt_condition, opt_groupId, | 812 opt_condition, opt_groupId); |
| 831 opt_position_alignment); | |
| 832 }; | 813 }; |
| 833 | 814 |
| 834 | 815 |
| 835 Debug.setScriptBreakPointByName = function(script_name, | 816 Debug.setScriptBreakPointByName = function(script_name, |
| 836 opt_line, opt_column, | 817 opt_line, opt_column, |
| 837 opt_condition, opt_groupId) { | 818 opt_condition, opt_groupId) { |
| 838 return this.setScriptBreakPoint(Debug.ScriptBreakPointType.ScriptName, | 819 return this.setScriptBreakPoint(Debug.ScriptBreakPointType.ScriptName, |
| 839 script_name, opt_line, opt_column, | 820 script_name, opt_line, opt_column, |
| 840 opt_condition, opt_groupId); | 821 opt_condition, opt_groupId); |
| 841 }; | 822 }; |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 905 }; | 886 }; |
| 906 | 887 |
| 907 Debug.clearBreakOnUncaughtException = function() { | 888 Debug.clearBreakOnUncaughtException = function() { |
| 908 return %ChangeBreakOnException(Debug.ExceptionBreak.Uncaught, false); | 889 return %ChangeBreakOnException(Debug.ExceptionBreak.Uncaught, false); |
| 909 }; | 890 }; |
| 910 | 891 |
| 911 Debug.isBreakOnUncaughtException = function() { | 892 Debug.isBreakOnUncaughtException = function() { |
| 912 return !!%IsBreakOnException(Debug.ExceptionBreak.Uncaught); | 893 return !!%IsBreakOnException(Debug.ExceptionBreak.Uncaught); |
| 913 }; | 894 }; |
| 914 | 895 |
| 915 Debug.showBreakPoints = function(f, full, opt_position_alignment) { | 896 Debug.showBreakPoints = function(f, full) { |
| 916 if (!IS_FUNCTION(f)) throw new Error('Parameters have wrong types.'); | 897 if (!IS_FUNCTION(f)) throw new Error('Parameters have wrong types.'); |
| 917 var source = full ? this.scriptSource(f) : this.source(f); | 898 var source = full ? this.scriptSource(f) : this.source(f); |
| 918 var offset = full ? this.sourcePosition(f) : 0; | 899 var offset = full ? this.sourcePosition(f) : 0; |
| 919 var locations = this.breakLocations(f, opt_position_alignment); | 900 var locations = this.breakLocations(f); |
| 920 if (!locations) return source; | 901 if (!locations) return source; |
| 921 locations.sort(function(x, y) { return x - y; }); | 902 locations.sort(function(x, y) { return x - y; }); |
| 922 var result = ""; | 903 var result = ""; |
| 923 var prev_pos = 0; | 904 var prev_pos = 0; |
| 924 var pos; | 905 var pos; |
| 925 for (var i = 0; i < locations.length; i++) { | 906 for (var i = 0; i < locations.length; i++) { |
| 926 pos = locations[i] - offset; | 907 pos = locations[i] - offset; |
| 927 result += source.slice(prev_pos, pos); | 908 result += source.slice(prev_pos, pos); |
| 928 result += "[B" + i + "]"; | 909 result += "[B" + i + "]"; |
| 929 prev_pos = pos; | 910 prev_pos = pos; |
| (...skipping 1713 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2643 | 2624 |
| 2644 default: | 2625 default: |
| 2645 json = null; | 2626 json = null; |
| 2646 } | 2627 } |
| 2647 return json; | 2628 return json; |
| 2648 } | 2629 } |
| 2649 | 2630 |
| 2650 Debug.TestApi = { | 2631 Debug.TestApi = { |
| 2651 CommandProcessorResolveValue: DebugCommandProcessor.resolveValue_ | 2632 CommandProcessorResolveValue: DebugCommandProcessor.resolveValue_ |
| 2652 }; | 2633 }; |
| OLD | NEW |