| OLD | NEW |
| 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 |
| 11 // with the distribution. | 11 // with the distribution. |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 50 | 50 |
| 51 var kReplacementMarkers = [ "%0", "%1", "%2", "%3" ]; | 51 var kReplacementMarkers = [ "%0", "%1", "%2", "%3" ]; |
| 52 | 52 |
| 53 function FormatString(format, message) { | 53 function FormatString(format, message) { |
| 54 var args = %MessageGetArguments(message); | 54 var args = %MessageGetArguments(message); |
| 55 var result = ""; | 55 var result = ""; |
| 56 var arg_num = 0; | 56 var arg_num = 0; |
| 57 for (var i = 0; i < format.length; i++) { | 57 for (var i = 0; i < format.length; i++) { |
| 58 var str = format[i]; | 58 var str = format[i]; |
| 59 for (arg_num = 0; arg_num < kReplacementMarkers.length; arg_num++) { | 59 for (arg_num = 0; arg_num < kReplacementMarkers.length; arg_num++) { |
| 60 if (format[i] !== kReplacementMarkers[arg_num]) continue; | 60 if (str !== kReplacementMarkers[arg_num]) continue; |
| 61 try { | 61 try { |
| 62 str = ToDetailString(args[arg_num]); | 62 str = ToDetailString(args[arg_num]); |
| 63 } catch (e) { | 63 } catch (e) { |
| 64 str = "#<error>"; | 64 str = "#<error>"; |
| 65 } | 65 } |
| 66 } | 66 } |
| 67 result += str; | 67 result += str; |
| 68 } | 68 } |
| 69 return result; | 69 return result; |
| 70 } | 70 } |
| (...skipping 22 matching lines...) Expand all Loading... |
| 93 function ToStringCheckErrorObject(obj) { | 93 function ToStringCheckErrorObject(obj) { |
| 94 if (IsNativeErrorObject(obj)) { | 94 if (IsNativeErrorObject(obj)) { |
| 95 return %_CallFunction(obj, errorToString); | 95 return %_CallFunction(obj, errorToString); |
| 96 } else { | 96 } else { |
| 97 return ToString(obj); | 97 return ToString(obj); |
| 98 } | 98 } |
| 99 } | 99 } |
| 100 | 100 |
| 101 | 101 |
| 102 function ToDetailString(obj) { | 102 function ToDetailString(obj) { |
| 103 if (obj != null && IS_OBJECT(obj) && obj.toString === $Object.prototype.toStri
ng) { | 103 if (obj != null && IS_OBJECT(obj) && |
| 104 obj.toString === $Object.prototype.toString) { |
| 104 var constructor = obj.constructor; | 105 var constructor = obj.constructor; |
| 105 if (!constructor) return ToStringCheckErrorObject(obj); | 106 if (!constructor) return ToStringCheckErrorObject(obj); |
| 106 var constructorName = constructor.name; | 107 var constructorName = constructor.name; |
| 107 if (!constructorName || !IS_STRING(constructorName)) { | 108 if (!constructorName || !IS_STRING(constructorName)) { |
| 108 return ToStringCheckErrorObject(obj); | 109 return ToStringCheckErrorObject(obj); |
| 109 } | 110 } |
| 110 return "#<" + constructorName + ">"; | 111 return "#<" + constructorName + ">"; |
| 111 } else { | 112 } else { |
| 112 return ToStringCheckErrorObject(obj); | 113 return ToStringCheckErrorObject(obj); |
| 113 } | 114 } |
| (...skipping 429 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 543 */ | 544 */ |
| 544 function SourceLocation(script, position, line, column, start, end) { | 545 function SourceLocation(script, position, line, column, start, end) { |
| 545 this.script = script; | 546 this.script = script; |
| 546 this.position = position; | 547 this.position = position; |
| 547 this.line = line; | 548 this.line = line; |
| 548 this.column = column; | 549 this.column = column; |
| 549 this.start = start; | 550 this.start = start; |
| 550 this.end = end; | 551 this.end = end; |
| 551 } | 552 } |
| 552 | 553 |
| 554 SourceLocation.prototype.__proto__ = null; |
| 553 | 555 |
| 554 const kLineLengthLimit = 78; | 556 const kLineLengthLimit = 78; |
| 555 | 557 |
| 556 /** | 558 /** |
| 557 * Restrict source location start and end positions to make the source slice | 559 * Restrict source location start and end positions to make the source slice |
| 558 * no more that a certain number of characters wide. | 560 * no more that a certain number of characters wide. |
| 559 * @param {number} opt_limit The with limit of the source text with a default | 561 * @param {number} opt_limit The with limit of the source text with a default |
| 560 * of 78 | 562 * of 78 |
| 561 * @param {number} opt_before The number of characters to prefer before the | 563 * @param {number} opt_before The number of characters to prefer before the |
| 562 * position with a default value of 10 less that the limit | 564 * position with a default value of 10 less that the limit |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 632 * @constructor | 634 * @constructor |
| 633 */ | 635 */ |
| 634 function SourceSlice(script, from_line, to_line, from_position, to_position) { | 636 function SourceSlice(script, from_line, to_line, from_position, to_position) { |
| 635 this.script = script; | 637 this.script = script; |
| 636 this.from_line = from_line; | 638 this.from_line = from_line; |
| 637 this.to_line = to_line; | 639 this.to_line = to_line; |
| 638 this.from_position = from_position; | 640 this.from_position = from_position; |
| 639 this.to_position = to_position; | 641 this.to_position = to_position; |
| 640 } | 642 } |
| 641 | 643 |
| 644 SourceSlice.prototype.__proto__ = null; |
| 642 | 645 |
| 643 /** | 646 /** |
| 644 * Get the source text for a SourceSlice | 647 * Get the source text for a SourceSlice |
| 645 * @return {String} Source text for this slice. The last line will include | 648 * @return {String} Source text for this slice. The last line will include |
| 646 * the line terminating characters (if any) | 649 * the line terminating characters (if any) |
| 647 */ | 650 */ |
| 648 SourceSlice.prototype.sourceText = function () { | 651 SourceSlice.prototype.sourceText = function () { |
| 649 return %_CallFunction(this.script.source, | 652 return %_CallFunction(this.script.source, |
| 650 this.from_position, | 653 this.from_position, |
| 651 this.to_position, | 654 this.to_position, |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 693 value = v; | 696 value = v; |
| 694 }); | 697 }); |
| 695 } | 698 } |
| 696 | 699 |
| 697 function CallSite(receiver, fun, pos) { | 700 function CallSite(receiver, fun, pos) { |
| 698 this.receiver = receiver; | 701 this.receiver = receiver; |
| 699 this.fun = fun; | 702 this.fun = fun; |
| 700 this.pos = pos; | 703 this.pos = pos; |
| 701 } | 704 } |
| 702 | 705 |
| 706 CallSite.prototype.__proto__ = null; |
| 707 |
| 703 CallSite.prototype.getThis = function () { | 708 CallSite.prototype.getThis = function () { |
| 704 return this.receiver; | 709 return this.receiver; |
| 705 }; | 710 }; |
| 706 | 711 |
| 707 CallSite.prototype.getTypeName = function () { | 712 CallSite.prototype.getTypeName = function () { |
| 708 var constructor = this.receiver.constructor; | 713 var constructor = this.receiver.constructor; |
| 709 if (!constructor) | 714 if (!constructor) { |
| 710 return %_CallFunction(this.receiver, ObjectToString); | 715 return %_CallFunction(this.receiver, ObjectToString); |
| 716 } |
| 711 var constructorName = constructor.name; | 717 var constructorName = constructor.name; |
| 712 if (!constructorName) | 718 if (!constructorName) { |
| 713 return %_CallFunction(this.receiver, ObjectToString); | 719 return %_CallFunction(this.receiver, ObjectToString); |
| 720 } |
| 714 return constructorName; | 721 return constructorName; |
| 715 }; | 722 }; |
| 716 | 723 |
| 717 CallSite.prototype.isToplevel = function () { | 724 CallSite.prototype.isToplevel = function () { |
| 718 if (this.receiver == null) | 725 if (this.receiver == null) { |
| 719 return true; | 726 return true; |
| 727 } |
| 720 return IS_GLOBAL(this.receiver); | 728 return IS_GLOBAL(this.receiver); |
| 721 }; | 729 }; |
| 722 | 730 |
| 723 CallSite.prototype.isEval = function () { | 731 CallSite.prototype.isEval = function () { |
| 724 var script = %FunctionGetScript(this.fun); | 732 var script = %FunctionGetScript(this.fun); |
| 725 return script && script.compilation_type == COMPILATION_TYPE_EVAL; | 733 return script && script.compilation_type == COMPILATION_TYPE_EVAL; |
| 726 }; | 734 }; |
| 727 | 735 |
| 728 CallSite.prototype.getEvalOrigin = function () { | 736 CallSite.prototype.getEvalOrigin = function () { |
| 729 var script = %FunctionGetScript(this.fun); | 737 var script = %FunctionGetScript(this.fun); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 742 CallSite.prototype.getFunctionName = function () { | 750 CallSite.prototype.getFunctionName = function () { |
| 743 // See if the function knows its own name | 751 // See if the function knows its own name |
| 744 var name = this.fun.name; | 752 var name = this.fun.name; |
| 745 if (name) { | 753 if (name) { |
| 746 return name; | 754 return name; |
| 747 } else { | 755 } else { |
| 748 return %FunctionGetInferredName(this.fun); | 756 return %FunctionGetInferredName(this.fun); |
| 749 } | 757 } |
| 750 // Maybe this is an evaluation? | 758 // Maybe this is an evaluation? |
| 751 var script = %FunctionGetScript(this.fun); | 759 var script = %FunctionGetScript(this.fun); |
| 752 if (script && script.compilation_type == COMPILATION_TYPE_EVAL) | 760 if (script && script.compilation_type == COMPILATION_TYPE_EVAL) { |
| 753 return "eval"; | 761 return "eval"; |
| 762 } |
| 754 return null; | 763 return null; |
| 755 }; | 764 }; |
| 756 | 765 |
| 757 CallSite.prototype.getMethodName = function () { | 766 CallSite.prototype.getMethodName = function () { |
| 758 // See if we can find a unique property on the receiver that holds | 767 // See if we can find a unique property on the receiver that holds |
| 759 // this function. | 768 // this function. |
| 760 var ownName = this.fun.name; | 769 var ownName = this.fun.name; |
| 761 if (ownName && this.receiver && | 770 if (ownName && this.receiver && |
| 762 (%_CallFunction(this.receiver, ownName, ObjectLookupGetter) === this.fun |
| | 771 (%_CallFunction(this.receiver, ownName, ObjectLookupGetter) === this.fun |
| |
| 763 %_CallFunction(this.receiver, ownName, ObjectLookupSetter) === this.fun |
| | 772 %_CallFunction(this.receiver, ownName, ObjectLookupSetter) === this.fun |
| |
| 764 this.receiver[ownName] === this.fun)) { | 773 this.receiver[ownName] === this.fun)) { |
| 765 // To handle DontEnum properties we guess that the method has | 774 // To handle DontEnum properties we guess that the method has |
| 766 // the same name as the function. | 775 // the same name as the function. |
| 767 return ownName; | 776 return ownName; |
| 768 } | 777 } |
| 769 var name = null; | 778 var name = null; |
| 770 for (var prop in this.receiver) { | 779 for (var prop in this.receiver) { |
| 771 if (this.receiver.__lookupGetter__(prop) === this.fun || | 780 if (this.receiver.__lookupGetter__(prop) === this.fun || |
| 772 this.receiver.__lookupSetter__(prop) === this.fun || | 781 this.receiver.__lookupSetter__(prop) === this.fun || |
| 773 (!this.receiver.__lookupGetter__(prop) && this.receiver[prop] === this.f
un)) { | 782 (!this.receiver.__lookupGetter__(prop) && this.receiver[prop] === this.f
un)) { |
| 774 // If we find more than one match bail out to avoid confusion. | 783 // If we find more than one match bail out to avoid confusion. |
| 775 if (name) | 784 if (name) { |
| 776 return null; | 785 return null; |
| 786 } |
| 777 name = prop; | 787 name = prop; |
| 778 } | 788 } |
| 779 } | 789 } |
| 780 if (name) | 790 if (name) { |
| 781 return name; | 791 return name; |
| 792 } |
| 782 return null; | 793 return null; |
| 783 }; | 794 }; |
| 784 | 795 |
| 785 CallSite.prototype.getFileName = function () { | 796 CallSite.prototype.getFileName = function () { |
| 786 var script = %FunctionGetScript(this.fun); | 797 var script = %FunctionGetScript(this.fun); |
| 787 return script ? script.name : null; | 798 return script ? script.name : null; |
| 788 }; | 799 }; |
| 789 | 800 |
| 790 CallSite.prototype.getLineNumber = function () { | 801 CallSite.prototype.getLineNumber = function () { |
| 791 if (this.pos == -1) | 802 if (this.pos == -1) { |
| 792 return null; | 803 return null; |
| 804 } |
| 793 var script = %FunctionGetScript(this.fun); | 805 var script = %FunctionGetScript(this.fun); |
| 794 var location = null; | 806 var location = null; |
| 795 if (script) { | 807 if (script) { |
| 796 location = script.locationFromPosition(this.pos, true); | 808 location = script.locationFromPosition(this.pos, true); |
| 797 } | 809 } |
| 798 return location ? location.line + 1 : null; | 810 return location ? location.line + 1 : null; |
| 799 }; | 811 }; |
| 800 | 812 |
| 801 CallSite.prototype.getColumnNumber = function () { | 813 CallSite.prototype.getColumnNumber = function () { |
| 802 if (this.pos == -1) | 814 if (this.pos == -1) { |
| 803 return null; | 815 return null; |
| 816 } |
| 804 var script = %FunctionGetScript(this.fun); | 817 var script = %FunctionGetScript(this.fun); |
| 805 var location = null; | 818 var location = null; |
| 806 if (script) { | 819 if (script) { |
| 807 location = script.locationFromPosition(this.pos, true); | 820 location = script.locationFromPosition(this.pos, true); |
| 808 } | 821 } |
| 809 return location ? location.column + 1: null; | 822 return location ? location.column + 1: null; |
| 810 }; | 823 }; |
| 811 | 824 |
| 812 CallSite.prototype.isNative = function () { | 825 CallSite.prototype.isNative = function () { |
| 813 var script = %FunctionGetScript(this.fun); | 826 var script = %FunctionGetScript(this.fun); |
| 814 return script ? (script.type == TYPE_NATIVE) : false; | 827 return script ? (script.type == TYPE_NATIVE) : false; |
| 815 }; | 828 }; |
| 816 | 829 |
| 817 CallSite.prototype.getPosition = function () { | 830 CallSite.prototype.getPosition = function () { |
| 818 return this.pos; | 831 return this.pos; |
| 819 }; | 832 }; |
| 820 | 833 |
| 821 CallSite.prototype.isConstructor = function () { | 834 CallSite.prototype.isConstructor = function () { |
| 822 var constructor = this.receiver ? this.receiver.constructor : null; | 835 var constructor = this.receiver ? this.receiver.constructor : null; |
| 823 if (!constructor) | 836 if (!constructor) { |
| 824 return false; | 837 return false; |
| 838 } |
| 825 return this.fun === constructor; | 839 return this.fun === constructor; |
| 826 }; | 840 }; |
| 827 | 841 |
| 828 function FormatEvalOrigin(script) { | 842 function FormatEvalOrigin(script) { |
| 829 var sourceURL = script.nameOrSourceURL(); | 843 var sourceURL = script.nameOrSourceURL(); |
| 830 if (sourceURL) | 844 if (sourceURL) { |
| 831 return sourceURL; | 845 return sourceURL; |
| 846 } |
| 832 | 847 |
| 833 var eval_origin = "eval at "; | 848 var eval_origin = "eval at "; |
| 834 if (script.eval_from_function_name) { | 849 if (script.eval_from_function_name) { |
| 835 eval_origin += script.eval_from_function_name; | 850 eval_origin += script.eval_from_function_name; |
| 836 } else { | 851 } else { |
| 837 eval_origin += "<anonymous>"; | 852 eval_origin += "<anonymous>"; |
| 838 } | 853 } |
| 839 | 854 |
| 840 var eval_from_script = script.eval_from_script; | 855 var eval_from_script = script.eval_from_script; |
| 841 if (eval_from_script) { | 856 if (eval_from_script) { |
| (...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1016 captureStackTrace(this, f); | 1031 captureStackTrace(this, f); |
| 1017 } else { | 1032 } else { |
| 1018 return new f(m); | 1033 return new f(m); |
| 1019 } | 1034 } |
| 1020 }); | 1035 }); |
| 1021 } | 1036 } |
| 1022 | 1037 |
| 1023 function captureStackTrace(obj, cons_opt) { | 1038 function captureStackTrace(obj, cons_opt) { |
| 1024 var stackTraceLimit = $Error.stackTraceLimit; | 1039 var stackTraceLimit = $Error.stackTraceLimit; |
| 1025 if (!stackTraceLimit || !IS_NUMBER(stackTraceLimit)) return; | 1040 if (!stackTraceLimit || !IS_NUMBER(stackTraceLimit)) return; |
| 1026 if (stackTraceLimit < 0 || stackTraceLimit > 10000) | 1041 if (stackTraceLimit < 0 || stackTraceLimit > 10000) { |
| 1027 stackTraceLimit = 10000; | 1042 stackTraceLimit = 10000; |
| 1043 } |
| 1028 var raw_stack = %CollectStackTrace(cons_opt | 1044 var raw_stack = %CollectStackTrace(cons_opt |
| 1029 ? cons_opt | 1045 ? cons_opt |
| 1030 : captureStackTrace, stackTraceLimit); | 1046 : captureStackTrace, stackTraceLimit); |
| 1031 DefineOneShotAccessor(obj, 'stack', function (obj) { | 1047 DefineOneShotAccessor(obj, 'stack', function (obj) { |
| 1032 return FormatRawStackTrace(obj, raw_stack); | 1048 return FormatRawStackTrace(obj, raw_stack); |
| 1033 }); | 1049 }); |
| 1034 }; | 1050 }; |
| 1035 | 1051 |
| 1036 $Math.__proto__ = global.Object.prototype; | 1052 $Math.__proto__ = global.Object.prototype; |
| 1037 | 1053 |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1077 } | 1093 } |
| 1078 // This helper function is needed because access to properties on | 1094 // This helper function is needed because access to properties on |
| 1079 // the builtins object do not work inside of a catch clause. | 1095 // the builtins object do not work inside of a catch clause. |
| 1080 function isCyclicErrorMarker(o) { return o === cyclic_error_marker; } | 1096 function isCyclicErrorMarker(o) { return o === cyclic_error_marker; } |
| 1081 | 1097 |
| 1082 try { | 1098 try { |
| 1083 return %_CallFunction(this, errorToStringDetectCycle); | 1099 return %_CallFunction(this, errorToStringDetectCycle); |
| 1084 } catch(e) { | 1100 } catch(e) { |
| 1085 // If this error message was encountered already return the empty | 1101 // If this error message was encountered already return the empty |
| 1086 // string for it instead of recursively formatting it. | 1102 // string for it instead of recursively formatting it. |
| 1087 if (isCyclicErrorMarker(e)) return ''; | 1103 if (isCyclicErrorMarker(e)) { |
| 1088 else throw e; | 1104 return ''; |
| 1105 } |
| 1106 throw e; |
| 1089 } | 1107 } |
| 1090 } | 1108 } |
| 1091 | 1109 |
| 1092 | 1110 |
| 1093 InstallFunctions($Error.prototype, DONT_ENUM, ['toString', errorToString]); | 1111 InstallFunctions($Error.prototype, DONT_ENUM, ['toString', errorToString]); |
| 1094 | 1112 |
| 1095 // Boilerplate for exceptions for stack overflows. Used from | 1113 // Boilerplate for exceptions for stack overflows. Used from |
| 1096 // Isolate::StackOverflow(). | 1114 // Isolate::StackOverflow(). |
| 1097 const kStackOverflowBoilerplate = MakeRangeError('stack_overflow', []); | 1115 const kStackOverflowBoilerplate = MakeRangeError('stack_overflow', []); |
| OLD | NEW |