OLD | NEW |
1 // Copyright 2008 the V8 project authors. All rights reserved. | 1 // Copyright 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 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
255 case 'frame': | 255 case 'frame': |
256 case 'f': | 256 case 'f': |
257 this.request_ = this.frameCommandToJSONRequest_(args); | 257 this.request_ = this.frameCommandToJSONRequest_(args); |
258 break; | 258 break; |
259 | 259 |
260 case 'print': | 260 case 'print': |
261 case 'p': | 261 case 'p': |
262 this.request_ = this.printCommandToJSONRequest_(args); | 262 this.request_ = this.printCommandToJSONRequest_(args); |
263 break; | 263 break; |
264 | 264 |
| 265 case 'dir': |
| 266 this.request_ = this.dirCommandToJSONRequest_(args); |
| 267 break; |
| 268 |
265 case 'source': | 269 case 'source': |
266 this.request_ = this.sourceCommandToJSONRequest_(args); | 270 this.request_ = this.sourceCommandToJSONRequest_(args); |
267 break; | 271 break; |
268 | 272 |
269 case 'scripts': | 273 case 'scripts': |
270 this.request_ = this.scriptsCommandToJSONRequest_(args); | 274 this.request_ = this.scriptsCommandToJSONRequest_(args); |
271 break; | 275 break; |
272 | 276 |
273 case 'break': | 277 case 'break': |
274 case 'b': | 278 case 'b': |
275 this.request_ = this.breakCommandToJSONRequest_(args); | 279 this.request_ = this.breakCommandToJSONRequest_(args); |
276 break; | 280 break; |
277 | 281 |
278 case 'clear': | 282 case 'clear': |
279 this.request_ = this.clearCommandToJSONRequest_(args); | 283 this.request_ = this.clearCommandToJSONRequest_(args); |
280 break; | 284 break; |
281 | 285 |
282 case 'help': | 286 case 'help': |
283 case '?': | 287 case '?': |
284 this.helpCommand_(args); | 288 this.helpCommand_(args); |
285 // Return null to indicate no JSON to send (command handled internally). | 289 // Return null to indicate no JSON to send (command handled internally). |
286 this.request_ = void 0; | 290 this.request_ = void 0; |
287 break; | 291 break; |
288 | 292 |
289 default: | 293 default: |
290 throw new Error('Unknown command "' + cmd + '"'); | 294 throw new Error('Unknown command "' + cmd + '"'); |
291 } | 295 } |
| 296 |
| 297 last_cmd = cmd; |
292 } | 298 } |
293 | 299 |
294 DebugRequest.prototype.JSONRequest = function() { | 300 DebugRequest.prototype.JSONRequest = function() { |
295 return this.request_; | 301 return this.request_; |
296 } | 302 } |
297 | 303 |
298 | 304 |
299 function RequestPacket(command) { | 305 function RequestPacket(command) { |
300 this.seq = 0; | 306 this.seq = 0; |
301 this.type = 'request'; | 307 this.type = 'request'; |
(...skipping 21 matching lines...) Expand all Loading... |
323 json += '}'; | 329 json += '}'; |
324 return json; | 330 return json; |
325 } | 331 } |
326 | 332 |
327 | 333 |
328 DebugRequest.prototype.createRequest = function(command) { | 334 DebugRequest.prototype.createRequest = function(command) { |
329 return new RequestPacket(command); | 335 return new RequestPacket(command); |
330 }; | 336 }; |
331 | 337 |
332 | 338 |
| 339 // Create a JSON request for the evaluation command. |
| 340 DebugRequest.prototype.makeEvaluateJSONRequest_ = function(expression) { |
| 341 // Check if the expression is a handle id in the form #<handle>#. |
| 342 var handle_match = expression.match(/^#([0-9]*)#$/); |
| 343 if (handle_match) { |
| 344 // Build an evaluate request. |
| 345 var request = this.createRequest('lookup'); |
| 346 request.arguments = {}; |
| 347 request.arguments.handle = parseInt(handle_match[1]); |
| 348 return request.toJSONProtocol(); |
| 349 } else { |
| 350 // Build an evaluate request. |
| 351 var request = this.createRequest('evaluate'); |
| 352 request.arguments = {}; |
| 353 request.arguments.expression = expression; |
| 354 return request.toJSONProtocol(); |
| 355 } |
| 356 }; |
| 357 |
| 358 |
| 359 |
333 // Create a JSON request for the continue command. | 360 // Create a JSON request for the continue command. |
334 DebugRequest.prototype.continueCommandToJSONRequest_ = function(args) { | 361 DebugRequest.prototype.continueCommandToJSONRequest_ = function(args) { |
335 var request = this.createRequest('continue'); | 362 var request = this.createRequest('continue'); |
336 return request.toJSONProtocol(); | 363 return request.toJSONProtocol(); |
337 }; | 364 }; |
338 | 365 |
339 | 366 |
340 // Create a JSON request for the step command. | 367 // Create a JSON request for the step command. |
341 DebugRequest.prototype.stepCommandToJSONRequest_ = function(args) { | 368 DebugRequest.prototype.stepCommandToJSONRequest_ = function(args) { |
342 // Requesting a step is through the continue command with additional | 369 // Requesting a step is through the continue command with additional |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
431 if (args.length > 0 && args[0].length > 0) { | 458 if (args.length > 0 && args[0].length > 0) { |
432 request.arguments = {}; | 459 request.arguments = {}; |
433 request.arguments.number = args[0]; | 460 request.arguments.number = args[0]; |
434 } | 461 } |
435 return request.toJSONProtocol(); | 462 return request.toJSONProtocol(); |
436 }; | 463 }; |
437 | 464 |
438 | 465 |
439 // Create a JSON request for the print command. | 466 // Create a JSON request for the print command. |
440 DebugRequest.prototype.printCommandToJSONRequest_ = function(args) { | 467 DebugRequest.prototype.printCommandToJSONRequest_ = function(args) { |
441 // Build a evaluate request from the text command. | 468 // Build an evaluate request from the text command. |
442 var request = this.createRequest('evaluate'); | |
443 if (args.length == 0) { | 469 if (args.length == 0) { |
444 throw new Error('Missing expression.'); | 470 throw new Error('Missing expression.'); |
445 } | 471 } |
446 | 472 return this.makeEvaluateJSONRequest_(args); |
447 request.arguments = {}; | |
448 request.arguments.expression = args; | |
449 | |
450 return request.toJSONProtocol(); | |
451 }; | 473 }; |
452 | 474 |
453 | 475 |
| 476 // Create a JSON request for the dir command. |
| 477 DebugRequest.prototype.dirCommandToJSONRequest_ = function(args) { |
| 478 // Build an evaluate request from the text command. |
| 479 if (args.length == 0) { |
| 480 throw new Error('Missing expression.'); |
| 481 } |
| 482 return this.makeEvaluateJSONRequest_(args); |
| 483 }; |
| 484 |
| 485 |
454 // Create a JSON request for the source command. | 486 // Create a JSON request for the source command. |
455 DebugRequest.prototype.sourceCommandToJSONRequest_ = function(args) { | 487 DebugRequest.prototype.sourceCommandToJSONRequest_ = function(args) { |
456 // Build a evaluate request from the text command. | 488 // Build a evaluate request from the text command. |
457 var request = this.createRequest('source'); | 489 var request = this.createRequest('source'); |
458 | 490 |
459 // Default is ten lines starting five lines before the current location. | 491 // Default is ten lines starting five lines before the current location. |
460 var from = Debug.State.currentSourceLine - 5; | 492 var from = Debug.State.currentSourceLine - 5; |
461 var lines = 10; | 493 var lines = 10; |
462 | 494 |
463 // Parse the arguments. | 495 // Parse the arguments. |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
578 print('frame <frame #>'); | 610 print('frame <frame #>'); |
579 print('step [in | next | out| min [step count]]'); | 611 print('step [in | next | out| min [step count]]'); |
580 print('print <expression>'); | 612 print('print <expression>'); |
581 print('source [from line [num lines]]'); | 613 print('source [from line [num lines]]'); |
582 print('scripts'); | 614 print('scripts'); |
583 print('continue'); | 615 print('continue'); |
584 print('help'); | 616 print('help'); |
585 } | 617 } |
586 | 618 |
587 | 619 |
| 620 function formatHandleReference_(value) { |
| 621 return '#' + value.handle() + '#'; |
| 622 } |
| 623 |
| 624 |
588 // Convert a JSON response to text for display in a text based debugger. | 625 // Convert a JSON response to text for display in a text based debugger. |
589 function DebugResponseDetails(json_response) { | 626 function DebugResponseDetails(json_response) { |
590 details = {text:'', running:false} | 627 details = {text:'', running:false} |
591 | 628 |
592 try { | 629 try { |
593 // Convert the JSON string to an object. | 630 // Convert the JSON string to an object. |
594 response = eval('(' + json_response + ')'); | 631 var response = new ProtocolPackage(json_response); |
595 | 632 |
596 if (!response.success) { | 633 if (!response.success()) { |
597 details.text = response.message; | 634 details.text = response.message(); |
598 return details; | 635 return details; |
599 } | 636 } |
600 | 637 |
601 // Get the running state. | 638 // Get the running state. |
602 details.running = response.running; | 639 details.running = response.running(); |
603 | 640 |
604 switch (response.command) { | 641 var body = response.body(); |
| 642 var result = ''; |
| 643 switch (response.command()) { |
605 case 'setbreakpoint': | 644 case 'setbreakpoint': |
606 var body = response.body; | |
607 result = 'set breakpoint #'; | 645 result = 'set breakpoint #'; |
608 result += body.breakpoint; | 646 result += body.breakpoint; |
609 details.text = result; | 647 details.text = result; |
610 break; | 648 break; |
611 | 649 |
612 case 'clearbreakpoint': | 650 case 'clearbreakpoint': |
613 var body = response.body; | |
614 result = 'cleared breakpoint #'; | 651 result = 'cleared breakpoint #'; |
615 result += body.breakpoint; | 652 result += body.breakpoint; |
616 details.text = result; | 653 details.text = result; |
617 break; | 654 break; |
618 | 655 |
619 case 'backtrace': | 656 case 'backtrace': |
620 var body = response.body; | |
621 if (body.totalFrames == 0) { | 657 if (body.totalFrames == 0) { |
622 result = '(empty stack)'; | 658 result = '(empty stack)'; |
623 } else { | 659 } else { |
624 var result = 'Frames #' + body.fromFrame + ' to #' + | 660 var result = 'Frames #' + body.fromFrame + ' to #' + |
625 (body.toFrame - 1) + ' of ' + body.totalFrames + '\n'; | 661 (body.toFrame - 1) + ' of ' + body.totalFrames + '\n'; |
626 for (i = 0; i < body.frames.length; i++) { | 662 for (i = 0; i < body.frames.length; i++) { |
627 if (i != 0) result += '\n'; | 663 if (i != 0) result += '\n'; |
628 result += body.frames[i].text; | 664 result += body.frames[i].text; |
629 } | 665 } |
630 } | 666 } |
631 details.text = result; | 667 details.text = result; |
632 break; | 668 break; |
633 | 669 |
634 case 'frame': | 670 case 'frame': |
635 details.text = SourceUnderline(response.body.sourceLineText, | 671 details.text = SourceUnderline(body.sourceLineText, |
636 response.body.column); | 672 body.column); |
637 Debug.State.currentSourceLine = response.body.line; | 673 Debug.State.currentSourceLine = body.line; |
638 Debug.State.currentFrame = response.body.index; | 674 Debug.State.currentFrame = body.index; |
639 break; | 675 break; |
640 | 676 |
641 case 'evaluate': | 677 case 'evaluate': |
642 details.text = response.body.text; | 678 case 'lookup': |
| 679 if (last_cmd == 'p' || last_cmd == 'print') { |
| 680 details.text = body.text; |
| 681 } else { |
| 682 var value = response.bodyValue(); |
| 683 if (value.isObject()) { |
| 684 result += formatHandleReference_(value); |
| 685 result += ', type: object' |
| 686 result += ', constructor '; |
| 687 var ctor = value.constructorFunctionValue(); |
| 688 result += formatHandleReference_(ctor); |
| 689 result += ', __proto__ '; |
| 690 var proto = value.protoObjectValue(); |
| 691 result += formatHandleReference_(proto); |
| 692 result += ', '; |
| 693 result += value.propertyCount(); |
| 694 result += ' properties.\n'; |
| 695 for (var i = 0; i < value.propertyCount(); i++) { |
| 696 result += ' '; |
| 697 result += value.propertyName(i); |
| 698 result += ': '; |
| 699 var property_value = value.propertyValue(i); |
| 700 if (property_value && property_value.type()) { |
| 701 result += property_value.type(); |
| 702 } else { |
| 703 result += '<no type>'; |
| 704 } |
| 705 result += ' '; |
| 706 result += formatHandleReference_(property_value); |
| 707 result += '\n'; |
| 708 } |
| 709 } else { |
| 710 result += 'type: '; |
| 711 result += value.type(); |
| 712 if (!value.isUndefined() && !value.isNull()) { |
| 713 result += ', '; |
| 714 if (value.isString()) { |
| 715 result += '"'; |
| 716 } |
| 717 result += value.value(); |
| 718 if (value.isString()) { |
| 719 result += '"'; |
| 720 } |
| 721 } |
| 722 result += '\n'; |
| 723 } |
| 724 } |
| 725 details.text = result; |
643 break; | 726 break; |
644 | 727 |
645 case 'source': | 728 case 'source': |
646 // Get the source from the response. | 729 // Get the source from the response. |
647 var source = response.body.source; | 730 var source = body.source; |
648 var from_line = response.body.fromLine + 1; | 731 var from_line = body.fromLine + 1; |
649 var lines = source.split('\n'); | 732 var lines = source.split('\n'); |
650 var maxdigits = 1 + Math.floor(log10(from_line + lines.length)); | 733 var maxdigits = 1 + Math.floor(log10(from_line + lines.length)); |
651 if (maxdigits < 3) { | 734 if (maxdigits < 3) { |
652 maxdigits = 3; | 735 maxdigits = 3; |
653 } | 736 } |
654 var result = ''; | 737 var result = ''; |
655 for (var num = 0; num < lines.length; num++) { | 738 for (var num = 0; num < lines.length; num++) { |
656 // Check if there's an extra newline at the end. | 739 // Check if there's an extra newline at the end. |
657 if (num == (lines.length - 1) && lines[num].length == 0) { | 740 if (num == (lines.length - 1) && lines[num].length == 0) { |
658 break; | 741 break; |
(...skipping 13 matching lines...) Expand all Loading... |
672 result += current_line + ': '; | 755 result += current_line + ': '; |
673 } | 756 } |
674 result += lines[num]; | 757 result += lines[num]; |
675 result += '\n'; | 758 result += '\n'; |
676 } | 759 } |
677 details.text = result; | 760 details.text = result; |
678 break; | 761 break; |
679 | 762 |
680 case 'scripts': | 763 case 'scripts': |
681 var result = ''; | 764 var result = ''; |
682 for (i = 0; i < response.body.length; i++) { | 765 for (i = 0; i < body.length; i++) { |
683 if (i != 0) result += '\n'; | 766 if (i != 0) result += '\n'; |
684 if (response.body[i].name) { | 767 if (body[i].name) { |
685 result += response.body[i].name; | 768 result += body[i].name; |
686 } else { | 769 } else { |
687 result += '[unnamed] '; | 770 result += '[unnamed] '; |
688 var sourceStart = response.body[i].sourceStart; | 771 var sourceStart = body[i].sourceStart; |
689 if (sourceStart.length > 40) { | 772 if (sourceStart.length > 40) { |
690 sourceStart = sourceStart.substring(0, 37) + '...'; | 773 sourceStart = sourceStart.substring(0, 37) + '...'; |
691 } | 774 } |
692 result += sourceStart; | 775 result += sourceStart; |
693 } | 776 } |
694 result += ' (lines: '; | 777 result += ' (lines: '; |
695 result += response.body[i].sourceLines; | 778 result += body[i].sourceLines; |
696 result += ', length: '; | 779 result += ', length: '; |
697 result += response.body[i].sourceLength; | 780 result += body[i].sourceLength; |
698 if (response.body[i].type == Debug.ScriptType.Native) { | 781 if (body[i].type == Debug.ScriptType.Native) { |
699 result += ', native'; | 782 result += ', native'; |
700 } else if (response.body[i].type == Debug.ScriptType.Extension) { | 783 } else if (body[i].type == Debug.ScriptType.Extension) { |
701 result += ', extension'; | 784 result += ', extension'; |
702 } | 785 } |
703 result += ')'; | 786 result += ')'; |
704 } | 787 } |
705 details.text = result; | 788 details.text = result; |
706 break; | 789 break; |
707 | 790 |
708 case 'continue': | 791 case 'continue': |
709 details.text = "(running)"; | 792 details.text = "(running)"; |
710 break; | 793 break; |
711 | 794 |
712 default: | 795 default: |
713 details.text = | 796 details.text = |
714 'Response for unknown command \'' + response.command + '\'' + | 797 'Response for unknown command \'' + response.command + '\'' + |
715 ' (' + json_response + ')'; | 798 ' (' + json_response + ')'; |
716 } | 799 } |
717 } catch (e) { | 800 } catch (e) { |
718 details.text = 'Error: "' + e + '" formatting response'; | 801 details.text = 'Error: "' + e + '" formatting response'; |
719 } | 802 } |
720 | 803 |
721 return details; | 804 return details; |
722 }; | 805 }; |
723 | 806 |
724 | 807 |
| 808 /** |
| 809 * Protocol packages send from the debugger. |
| 810 * @param {string} json - raw protocol packet as JSON string. |
| 811 * @constructor |
| 812 */ |
| 813 function ProtocolPackage(json) { |
| 814 this.packet_ = eval('(' + json + ')'); |
| 815 this.refs_ = []; |
| 816 if (this.packet_.refs) { |
| 817 for (var i = 0; i < this.packet_.refs.length; i++) { |
| 818 this.refs_[this.packet_.refs[i].handle] = this.packet_.refs[i]; |
| 819 } |
| 820 } |
| 821 } |
| 822 |
| 823 |
| 824 /** |
| 825 * Get the packet type. |
| 826 * @return {String} the packet type |
| 827 */ |
| 828 ProtocolPackage.prototype.type = function() { |
| 829 return this.packet_.type; |
| 830 } |
| 831 |
| 832 |
| 833 /** |
| 834 * Get the packet event. |
| 835 * @return {Object} the packet event |
| 836 */ |
| 837 ProtocolPackage.prototype.event = function() { |
| 838 return this.packet_.event; |
| 839 } |
| 840 |
| 841 |
| 842 /** |
| 843 * Get the packet request sequence. |
| 844 * @return {number} the packet request sequence |
| 845 */ |
| 846 ProtocolPackage.prototype.requestSeq = function() { |
| 847 return this.packet_.request_seq; |
| 848 } |
| 849 |
| 850 |
| 851 /** |
| 852 * Get the packet request sequence. |
| 853 * @return {number} the packet request sequence |
| 854 */ |
| 855 ProtocolPackage.prototype.running = function() { |
| 856 return this.packet_.running ? true : false; |
| 857 } |
| 858 |
| 859 |
| 860 ProtocolPackage.prototype.success = function() { |
| 861 return this.packet_.success ? true : false; |
| 862 } |
| 863 |
| 864 |
| 865 ProtocolPackage.prototype.message = function() { |
| 866 return this.packet_.message; |
| 867 } |
| 868 |
| 869 |
| 870 ProtocolPackage.prototype.command = function() { |
| 871 return this.packet_.command; |
| 872 } |
| 873 |
| 874 |
| 875 ProtocolPackage.prototype.body = function() { |
| 876 return this.packet_.body; |
| 877 } |
| 878 |
| 879 |
| 880 ProtocolPackage.prototype.bodyValue = function() { |
| 881 return new ProtocolValue(this.packet_.body, this); |
| 882 } |
| 883 |
| 884 |
| 885 ProtocolPackage.prototype.body = function() { |
| 886 return this.packet_.body; |
| 887 } |
| 888 |
| 889 |
| 890 ProtocolPackage.prototype.lookup = function(handle) { |
| 891 var value = this.refs_[handle]; |
| 892 if (value) { |
| 893 return new ProtocolValue(value, this); |
| 894 } else { |
| 895 return new ProtocolReference(handle); |
| 896 } |
| 897 } |
| 898 |
| 899 |
| 900 function ProtocolValue(value, packet) { |
| 901 this.value_ = value; |
| 902 this.packet_ = packet; |
| 903 } |
| 904 |
| 905 |
| 906 /** |
| 907 * Get the value type. |
| 908 * @return {String} the value type |
| 909 */ |
| 910 ProtocolValue.prototype.type = function() { |
| 911 return this.value_.type; |
| 912 } |
| 913 |
| 914 |
| 915 /** |
| 916 * Check is the value is a primitive value. |
| 917 * @return {boolean} true if the value is primitive |
| 918 */ |
| 919 ProtocolValue.prototype.isPrimitive = function() { |
| 920 return this.isUndefined() || this.isNull() || this.isBoolean() || |
| 921 this.isNumber() || this.isString(); |
| 922 } |
| 923 |
| 924 |
| 925 /** |
| 926 * Get the object handle. |
| 927 * @return {number} the value handle |
| 928 */ |
| 929 ProtocolValue.prototype.handle = function() { |
| 930 return this.value_.handle; |
| 931 } |
| 932 |
| 933 |
| 934 /** |
| 935 * Check is the value is undefined. |
| 936 * @return {boolean} true if the value is undefined |
| 937 */ |
| 938 ProtocolValue.prototype.isUndefined = function() { |
| 939 return this.value_.type == 'undefined'; |
| 940 } |
| 941 |
| 942 |
| 943 /** |
| 944 * Check is the value is null. |
| 945 * @return {boolean} true if the value is null |
| 946 */ |
| 947 ProtocolValue.prototype.isNull = function() { |
| 948 return this.value_.type == 'null'; |
| 949 } |
| 950 |
| 951 |
| 952 /** |
| 953 * Check is the value is a boolean. |
| 954 * @return {boolean} true if the value is a boolean |
| 955 */ |
| 956 ProtocolValue.prototype.isBoolean = function() { |
| 957 return this.value_.type == 'boolean'; |
| 958 } |
| 959 |
| 960 |
| 961 /** |
| 962 * Check is the value is a number. |
| 963 * @return {boolean} true if the value is a number |
| 964 */ |
| 965 ProtocolValue.prototype.isNumber = function() { |
| 966 return this.value_.type == 'number'; |
| 967 } |
| 968 |
| 969 |
| 970 /** |
| 971 * Check is the value is a string. |
| 972 * @return {boolean} true if the value is a string |
| 973 */ |
| 974 ProtocolValue.prototype.isString = function() { |
| 975 return this.value_.type == 'string'; |
| 976 } |
| 977 |
| 978 |
| 979 /** |
| 980 * Check is the value is an object. |
| 981 * @return {boolean} true if the value is an object |
| 982 */ |
| 983 ProtocolValue.prototype.isObject = function() { |
| 984 return this.value_.type == 'object' || this.value_.type == 'function' || |
| 985 this.value_.type == 'error' || this.value_.type == 'regexp'; |
| 986 } |
| 987 |
| 988 |
| 989 /** |
| 990 * Get the constructor function |
| 991 * @return {ProtocolValue} constructor function |
| 992 */ |
| 993 ProtocolValue.prototype.constructorFunctionValue = function() { |
| 994 var ctor = this.value_.constructorFunction; |
| 995 return this.packet_.lookup(ctor.ref); |
| 996 } |
| 997 |
| 998 |
| 999 /** |
| 1000 * Get the __proto__ value |
| 1001 * @return {ProtocolValue} __proto__ value |
| 1002 */ |
| 1003 ProtocolValue.prototype.protoObjectValue = function() { |
| 1004 var proto = this.value_.protoObject; |
| 1005 return this.packet_.lookup(proto.ref); |
| 1006 } |
| 1007 |
| 1008 |
| 1009 /** |
| 1010 * Get the number og properties. |
| 1011 * @return {number} the number of properties |
| 1012 */ |
| 1013 ProtocolValue.prototype.propertyCount = function() { |
| 1014 return this.value_.properties ? this.value_.properties.length : 0; |
| 1015 } |
| 1016 |
| 1017 |
| 1018 /** |
| 1019 * Get the specified property name. |
| 1020 * @return {string} property name |
| 1021 */ |
| 1022 ProtocolValue.prototype.propertyName = function(index) { |
| 1023 var property = this.value_.properties[index]; |
| 1024 return property.name; |
| 1025 } |
| 1026 |
| 1027 |
| 1028 /** |
| 1029 * Return index for the property name. |
| 1030 * @param name The property name to look for |
| 1031 * @return {number} index for the property name |
| 1032 */ |
| 1033 ProtocolValue.prototype.propertyIndex = function(name) { |
| 1034 for (var i = 0; i < this.propertyCount(); i++) { |
| 1035 if (this.value_.properties[i].name == name) { |
| 1036 return i; |
| 1037 } |
| 1038 } |
| 1039 return null; |
| 1040 } |
| 1041 |
| 1042 |
| 1043 /** |
| 1044 * Get the specified property value. |
| 1045 * @return {ProtocolValue} property value |
| 1046 */ |
| 1047 ProtocolValue.prototype.propertyValue = function(index) { |
| 1048 var property = this.value_.properties[index]; |
| 1049 return this.packet_.lookup(property.ref); |
| 1050 } |
| 1051 |
| 1052 |
| 1053 /** |
| 1054 * Check is the value is a string. |
| 1055 * @return {boolean} true if the value is a string |
| 1056 */ |
| 1057 ProtocolValue.prototype.value = function() { |
| 1058 return this.value_.value; |
| 1059 } |
| 1060 |
| 1061 |
| 1062 function ProtocolReference(handle) { |
| 1063 this.handle_ = handle; |
| 1064 } |
| 1065 |
| 1066 |
| 1067 ProtocolReference.prototype.handle = function() { |
| 1068 return this.handle_; |
| 1069 } |
| 1070 |
| 1071 |
725 function MakeJSONPair_(name, value) { | 1072 function MakeJSONPair_(name, value) { |
726 return '"' + name + '":' + value; | 1073 return '"' + name + '":' + value; |
727 } | 1074 } |
728 | 1075 |
729 | 1076 |
730 function ArrayToJSONObject_(content) { | 1077 function ArrayToJSONObject_(content) { |
731 return '{' + content.join(',') + '}'; | 1078 return '{' + content.join(',') + '}'; |
732 } | 1079 } |
733 | 1080 |
734 | 1081 |
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
919 json += NumberToJSON_(elem); | 1266 json += NumberToJSON_(elem); |
920 } else if (typeof(elem) === 'string') { | 1267 } else if (typeof(elem) === 'string') { |
921 json += StringToJSON_(elem); | 1268 json += StringToJSON_(elem); |
922 } else { | 1269 } else { |
923 json += elem; | 1270 json += elem; |
924 } | 1271 } |
925 } | 1272 } |
926 json += ']'; | 1273 json += ']'; |
927 return json; | 1274 return json; |
928 } | 1275 } |
OLD | NEW |