OLD | NEW |
1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-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 815 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
826 return this.break_points_hit_; | 826 return this.break_points_hit_; |
827 }; | 827 }; |
828 | 828 |
829 | 829 |
830 BreakEvent.prototype.toJSONProtocol = function() { | 830 BreakEvent.prototype.toJSONProtocol = function() { |
831 var o = { seq: next_response_seq++, | 831 var o = { seq: next_response_seq++, |
832 type: "event", | 832 type: "event", |
833 event: "break", | 833 event: "break", |
834 body: { invocationText: this.exec_state_.frame(0).invocationText(), | 834 body: { invocationText: this.exec_state_.frame(0).invocationText(), |
835 } | 835 } |
836 } | 836 }; |
837 | 837 |
838 // Add script related information to the event if available. | 838 // Add script related information to the event if available. |
839 var script = this.func().script(); | 839 var script = this.func().script(); |
840 if (script) { | 840 if (script) { |
841 o.body.sourceLine = this.sourceLine(), | 841 o.body.sourceLine = this.sourceLine(), |
842 o.body.sourceColumn = this.sourceColumn(), | 842 o.body.sourceColumn = this.sourceColumn(), |
843 o.body.sourceLineText = this.sourceLineText(), | 843 o.body.sourceLineText = this.sourceLineText(), |
844 o.body.script = MakeScriptObject_(script, false); | 844 o.body.script = MakeScriptObject_(script, false); |
845 } | 845 } |
846 | 846 |
847 // Add an Array of break points hit if any. | 847 // Add an Array of break points hit if any. |
848 if (this.breakPointsHit()) { | 848 if (this.breakPointsHit()) { |
849 o.body.breakpoints = []; | 849 o.body.breakpoints = []; |
850 for (var i = 0; i < this.breakPointsHit().length; i++) { | 850 for (var i = 0; i < this.breakPointsHit().length; i++) { |
851 // Find the break point number. For break points originating from a | 851 // Find the break point number. For break points originating from a |
852 // script break point supply the script break point number. | 852 // script break point supply the script break point number. |
853 var breakpoint = this.breakPointsHit()[i]; | 853 var breakpoint = this.breakPointsHit()[i]; |
854 var script_break_point = breakpoint.script_break_point(); | 854 var script_break_point = breakpoint.script_break_point(); |
855 var number; | 855 var number; |
856 if (script_break_point) { | 856 if (script_break_point) { |
857 number = script_break_point.number(); | 857 number = script_break_point.number(); |
858 } else { | 858 } else { |
859 number = breakpoint.number(); | 859 number = breakpoint.number(); |
860 } | 860 } |
861 o.body.breakpoints.push(number); | 861 o.body.breakpoints.push(number); |
862 } | 862 } |
863 } | 863 } |
864 | 864 return JSON.stringify(ObjectToProtocolObject_(o)); |
865 return SimpleObjectToJSON_(o); | |
866 }; | 865 }; |
867 | 866 |
868 | 867 |
869 function MakeExceptionEvent(exec_state, exception, uncaught) { | 868 function MakeExceptionEvent(exec_state, exception, uncaught) { |
870 return new ExceptionEvent(exec_state, exception, uncaught); | 869 return new ExceptionEvent(exec_state, exception, uncaught); |
871 } | 870 } |
872 | 871 |
873 | 872 |
874 function ExceptionEvent(exec_state, exception, uncaught) { | 873 function ExceptionEvent(exec_state, exception, uncaught) { |
875 this.exec_state_ = exec_state; | 874 this.exec_state_ = exec_state; |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
916 ExceptionEvent.prototype.sourceLineText = function() { | 915 ExceptionEvent.prototype.sourceLineText = function() { |
917 return this.exec_state_.frame(0).sourceLineText(); | 916 return this.exec_state_.frame(0).sourceLineText(); |
918 }; | 917 }; |
919 | 918 |
920 | 919 |
921 ExceptionEvent.prototype.toJSONProtocol = function() { | 920 ExceptionEvent.prototype.toJSONProtocol = function() { |
922 var o = new ProtocolMessage(); | 921 var o = new ProtocolMessage(); |
923 o.event = "exception"; | 922 o.event = "exception"; |
924 o.body = { uncaught: this.uncaught_, | 923 o.body = { uncaught: this.uncaught_, |
925 exception: MakeMirror(this.exception_) | 924 exception: MakeMirror(this.exception_) |
926 } | 925 }; |
927 | 926 |
928 // Exceptions might happen whithout any JavaScript frames. | 927 // Exceptions might happen whithout any JavaScript frames. |
929 if (this.exec_state_.frameCount() > 0) { | 928 if (this.exec_state_.frameCount() > 0) { |
930 o.body.sourceLine = this.sourceLine(); | 929 o.body.sourceLine = this.sourceLine(); |
931 o.body.sourceColumn = this.sourceColumn(); | 930 o.body.sourceColumn = this.sourceColumn(); |
932 o.body.sourceLineText = this.sourceLineText(); | 931 o.body.sourceLineText = this.sourceLineText(); |
933 | 932 |
934 // Add script information to the event if available. | 933 // Add script information to the event if available. |
935 var script = this.func().script(); | 934 var script = this.func().script(); |
936 if (script) { | 935 if (script) { |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1072 | 1071 |
1073 | 1072 |
1074 ProtocolMessage.prototype.failed = function(message) { | 1073 ProtocolMessage.prototype.failed = function(message) { |
1075 this.success = false; | 1074 this.success = false; |
1076 this.message = message; | 1075 this.message = message; |
1077 } | 1076 } |
1078 | 1077 |
1079 | 1078 |
1080 ProtocolMessage.prototype.toJSONProtocol = function() { | 1079 ProtocolMessage.prototype.toJSONProtocol = function() { |
1081 // Encode the protocol header. | 1080 // Encode the protocol header. |
1082 var json = '{'; | 1081 var json = {}; |
1083 json += '"seq":' + this.seq; | 1082 json.seq= this.seq; |
1084 if (this.request_seq) { | 1083 if (this.request_seq) { |
1085 json += ',"request_seq":' + this.request_seq; | 1084 json.request_seq = this.request_seq; |
1086 } | 1085 } |
1087 json += ',"type":"' + this.type + '"'; | 1086 json.type = this.type; |
1088 if (this.event) { | 1087 if (this.event) { |
1089 json += ',"event":' + StringToJSON_(this.event); | 1088 json.event = this.event; |
1090 } | 1089 } |
1091 if (this.command) { | 1090 if (this.command) { |
1092 json += ',"command":' + StringToJSON_(this.command); | 1091 json.command = this.command; |
1093 } | 1092 } |
1094 if (this.success) { | 1093 if (this.success) { |
1095 json += ',"success":' + this.success; | 1094 json.success = this.success; |
1096 } else { | 1095 } else { |
1097 json += ',"success":false'; | 1096 json.success = false; |
1098 } | 1097 } |
1099 if (this.body) { | 1098 if (this.body) { |
1100 json += ',"body":'; | |
1101 // Encode the body part. | 1099 // Encode the body part. |
| 1100 var bodyJson; |
1102 var serializer = MakeMirrorSerializer(true, this.options_); | 1101 var serializer = MakeMirrorSerializer(true, this.options_); |
1103 if (this.body instanceof Mirror) { | 1102 if (this.body instanceof Mirror) { |
1104 json += serializer.serializeValue(this.body); | 1103 bodyJson = serializer.serializeValue(this.body); |
1105 } else if (this.body instanceof Array) { | 1104 } else if (this.body instanceof Array) { |
1106 json += '['; | 1105 bodyJson = []; |
1107 for (var i = 0; i < this.body.length; i++) { | 1106 for (var i = 0; i < this.body.length; i++) { |
1108 if (i != 0) json += ','; | |
1109 if (this.body[i] instanceof Mirror) { | 1107 if (this.body[i] instanceof Mirror) { |
1110 json += serializer.serializeValue(this.body[i]); | 1108 bodyJson.push(serializer.serializeValue(this.body[i])); |
1111 } else { | 1109 } else { |
1112 json += SimpleObjectToJSON_(this.body[i], serializer); | 1110 bodyJson.push(ObjectToProtocolObject_(this.body[i], serializer)); |
1113 } | 1111 } |
1114 } | 1112 } |
1115 json += ']'; | |
1116 } else { | 1113 } else { |
1117 json += SimpleObjectToJSON_(this.body, serializer); | 1114 bodyJson = ObjectToProtocolObject_(this.body, serializer); |
1118 } | 1115 } |
1119 json += ',"refs":'; | 1116 json.body = bodyJson; |
1120 json += serializer.serializeReferencedObjects(); | 1117 json.refs = serializer.serializeReferencedObjects(); |
1121 } | 1118 } |
1122 if (this.message) { | 1119 if (this.message) { |
1123 json += ',"message":' + StringToJSON_(this.message) ; | 1120 json.message = this.message; |
1124 } | 1121 } |
1125 if (this.running) { | 1122 if (this.running) { |
1126 json += ',"running":true'; | 1123 json.running = true; |
1127 } else { | 1124 } else { |
1128 json += ',"running":false'; | 1125 json.running = false; |
1129 } | 1126 } |
1130 json += '}'; | 1127 return JSON.stringify(json); |
1131 return json; | |
1132 } | 1128 } |
1133 | 1129 |
1134 | 1130 |
1135 DebugCommandProcessor.prototype.createResponse = function(request) { | 1131 DebugCommandProcessor.prototype.createResponse = function(request) { |
1136 return new ProtocolMessage(request); | 1132 return new ProtocolMessage(request); |
1137 }; | 1133 }; |
1138 | 1134 |
1139 | 1135 |
1140 DebugCommandProcessor.prototype.processDebugJSONRequest = function(json_request)
{ | 1136 DebugCommandProcessor.prototype.processDebugJSONRequest = function(json_request)
{ |
1141 var request; // Current request. | 1137 var request; // Current request. |
(...skipping 650 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1792 var result = ""; | 1788 var result = ""; |
1793 result += "0x" + NumberToHex8Str(cframe_value.address); | 1789 result += "0x" + NumberToHex8Str(cframe_value.address); |
1794 if (!IS_UNDEFINED(cframe_value.text)) { | 1790 if (!IS_UNDEFINED(cframe_value.text)) { |
1795 result += " " + cframe_value.text; | 1791 result += " " + cframe_value.text; |
1796 } | 1792 } |
1797 return result; | 1793 return result; |
1798 } | 1794 } |
1799 | 1795 |
1800 | 1796 |
1801 /** | 1797 /** |
1802 * Convert an Object to its JSON representation (see http://www.json.org/). | 1798 * Convert an Object to its debugger protocol representation. The representation |
1803 * This implementation simply runs through all string property names and adds | 1799 * may be serilized to a JSON object using JSON.stringify(). |
1804 * each property to the JSON representation for some predefined types. For type | 1800 * This implementation simply runs through all string property names, converts |
1805 * "object" the function calls itself recursively unless the object has the | 1801 * each property value to a protocol value and adds the property to the result |
1806 * function property "toJSONProtocol" in which case that is used. This is not | 1802 * object. For type "object" the function will be called recursively. Note that |
1807 * a general implementation but sufficient for the debugger. Note that circular | 1803 * circular structures will cause infinite recursion. |
1808 * structures will cause infinite recursion. | 1804 * @param {Object} object The object to format as protocol object. |
1809 * @param {Object} object The object to format as JSON | |
1810 * @param {MirrorSerializer} mirror_serializer The serializer to use if any | 1805 * @param {MirrorSerializer} mirror_serializer The serializer to use if any |
1811 * mirror objects are encountered. | 1806 * mirror objects are encountered. |
1812 * @return {string} JSON formatted object value | 1807 * @return {Object} Protocol object value. |
1813 */ | 1808 */ |
1814 function SimpleObjectToJSON_(object, mirror_serializer) { | 1809 function ObjectToProtocolObject_(object, mirror_serializer) { |
1815 var content = []; | 1810 var content = {}; |
1816 for (var key in object) { | 1811 for (var key in object) { |
1817 // Only consider string keys. | 1812 // Only consider string keys. |
1818 if (typeof key == 'string') { | 1813 if (typeof key == 'string') { |
1819 var property_value = object[key]; | |
1820 | |
1821 // Format the value based on its type. | 1814 // Format the value based on its type. |
1822 var property_value_json; | 1815 var property_value_json = ValueToProtocolValue_(object[key], |
1823 switch (typeof property_value) { | 1816 mirror_serializer); |
1824 case 'object': | |
1825 if (property_value instanceof Mirror) { | |
1826 property_value_json = mirror_serializer.serializeValue(property_valu
e); | |
1827 } else if (typeof property_value.toJSONProtocol == 'function') { | |
1828 property_value_json = property_value.toJSONProtocol(true) | |
1829 } else if (IS_ARRAY(property_value)){ | |
1830 property_value_json = SimpleArrayToJSON_(property_value, mirror_seri
alizer); | |
1831 } else { | |
1832 property_value_json = SimpleObjectToJSON_(property_value, mirror_ser
ializer); | |
1833 } | |
1834 break; | |
1835 | |
1836 case 'boolean': | |
1837 property_value_json = BooleanToJSON_(property_value); | |
1838 break; | |
1839 | |
1840 case 'number': | |
1841 property_value_json = NumberToJSON_(property_value); | |
1842 break; | |
1843 | |
1844 case 'string': | |
1845 property_value_json = StringToJSON_(property_value); | |
1846 break; | |
1847 | |
1848 default: | |
1849 property_value_json = null; | |
1850 } | |
1851 | |
1852 // Add the property if relevant. | 1817 // Add the property if relevant. |
1853 if (property_value_json) { | 1818 if (!IS_UNDEFINED(property_value_json)) { |
1854 content.push(StringToJSON_(key) + ':' + property_value_json); | 1819 content[key] = property_value_json; |
1855 } | 1820 } |
1856 } | 1821 } |
1857 } | 1822 } |
1858 | 1823 |
1859 // Make JSON object representation. | 1824 return content; |
1860 return '{' + content.join(',') + '}'; | |
1861 } | 1825 } |
1862 | 1826 |
| 1827 |
1863 /** | 1828 /** |
1864 * Convert an array to its JSON representation. This is a VERY simple | 1829 * Convert an array to its debugger protocol representation. It will convert |
1865 * implementation just to support what is needed for the debugger. | 1830 * each array element to a protocol value. |
1866 * @param {Array} array The array to format as JSON | 1831 * @param {Array} array The array to format as protocol array. |
1867 * @param {MirrorSerializer} mirror_serializer The serializer to use if any | 1832 * @param {MirrorSerializer} mirror_serializer The serializer to use if any |
1868 * mirror objects are encountered. | 1833 * mirror objects are encountered. |
1869 * @return {string} JSON formatted array value | 1834 * @return {Array} Protocol array value. |
1870 */ | 1835 */ |
1871 function SimpleArrayToJSON_(array, mirror_serializer) { | 1836 function ArrayToProtocolArray_(array, mirror_serializer) { |
1872 // Make JSON array representation. | 1837 var json = []; |
1873 var json = '['; | |
1874 for (var i = 0; i < array.length; i++) { | 1838 for (var i = 0; i < array.length; i++) { |
1875 if (i != 0) { | 1839 json.push(ValueToProtocolValue_(array[i], mirror_serializer)); |
1876 json += ','; | |
1877 } | |
1878 var elem = array[i]; | |
1879 if (elem instanceof Mirror) { | |
1880 json += mirror_serializer.serializeValue(elem); | |
1881 } else if (IS_OBJECT(elem)) { | |
1882 json += SimpleObjectToJSON_(elem); | |
1883 } else if (IS_BOOLEAN(elem)) { | |
1884 json += BooleanToJSON_(elem); | |
1885 } else if (IS_NUMBER(elem)) { | |
1886 json += NumberToJSON_(elem); | |
1887 } else if (IS_STRING(elem)) { | |
1888 json += StringToJSON_(elem); | |
1889 } else { | |
1890 json += elem; | |
1891 } | |
1892 } | 1840 } |
1893 json += ']'; | |
1894 return json; | 1841 return json; |
1895 } | 1842 } |
| 1843 |
| 1844 |
| 1845 /** |
| 1846 * Convert a value to its debugger protocol representation. |
| 1847 * @param {*} value The value to format as protocol value. |
| 1848 * @param {MirrorSerializer} mirror_serializer The serializer to use if any |
| 1849 * mirror objects are encountered. |
| 1850 * @return {*} Protocol value. |
| 1851 */ |
| 1852 function ValueToProtocolValue_(value, mirror_serializer) { |
| 1853 // Format the value based on its type. |
| 1854 var json; |
| 1855 switch (typeof value) { |
| 1856 case 'object': |
| 1857 if (value instanceof Mirror) { |
| 1858 json = mirror_serializer.serializeValue(value); |
| 1859 } else if (IS_ARRAY(value)){ |
| 1860 json = ArrayToProtocolArray_(value, mirror_serializer); |
| 1861 } else { |
| 1862 json = ObjectToProtocolObject_(value, mirror_serializer); |
| 1863 } |
| 1864 break; |
| 1865 |
| 1866 case 'boolean': |
| 1867 case 'string': |
| 1868 case 'number': |
| 1869 json = value; |
| 1870 break |
| 1871 |
| 1872 default: |
| 1873 json = null; |
| 1874 } |
| 1875 return json; |
| 1876 } |
OLD | NEW |