| Index: src/messages.js
|
| diff --git a/src/messages.js b/src/messages.js
|
| index e997061fc47416b04992090cef81a6fd8d7d7452..eadc880715a01d60bd93e394632a3cd2cdcacbd5 100644
|
| --- a/src/messages.js
|
| +++ b/src/messages.js
|
| @@ -4,6 +4,48 @@
|
|
|
| // -------------------------------------------------------------------
|
|
|
| +var $errorToString;
|
| +var $formatMessage;
|
| +var $getStackTraceLine;
|
| +var $messageGetPositionInLine;
|
| +var $messageGetLineNumber;
|
| +var $messageGetSourceLine;
|
| +var $stackOverflowBoilerplate;
|
| +var $stackTraceSymbol;
|
| +var $toDetailString;
|
| +var $Error;
|
| +var $EvalError;
|
| +var $RangeError;
|
| +var $ReferenceError;
|
| +var $SyntaxError;
|
| +var $TypeError;
|
| +var $URIError;
|
| +var MakeError;
|
| +var MakeEvalError;
|
| +var MakeRangeError;
|
| +var MakeReferenceError;
|
| +var MakeSyntaxError;
|
| +var MakeTypeError;
|
| +var MakeURIError;
|
| +var MakeReferenceErrorEmbedded;
|
| +var MakeSyntaxErrorEmbedded;
|
| +var MakeTypeErrorEmbedded;
|
| +
|
| +(function() {
|
| +
|
| +%CheckIsBootstrapping();
|
| +
|
| +var GlobalObject = global.Object;
|
| +var GlobalError;
|
| +var GlobalTypeError;
|
| +var GlobalRangeError;
|
| +var GlobalURIError;
|
| +var GlobalSyntaxError;
|
| +var GlobalReferenceError;
|
| +var GlobalEvalError;
|
| +
|
| +// -------------------------------------------------------------------
|
| +
|
| var kMessages = {
|
| // Error
|
| constructor_is_generator: ["Class constructor may not be a generator"],
|
| @@ -234,7 +276,7 @@ function NoSideEffectToString(obj) {
|
|
|
| // To determine whether we can safely stringify an object using ErrorToString
|
| // without the risk of side-effects, we need to check whether the object is
|
| -// either an instance of a native error type (via '%_ClassOf'), or has $Error
|
| +// either an instance of a native error type (via '%_ClassOf'), or has Error
|
| // in its prototype chain and hasn't overwritten 'toString' with something
|
| // strange and unusual.
|
| function CanBeSafelyTreatedAsAnErrorObject(obj) {
|
| @@ -250,7 +292,7 @@ function CanBeSafelyTreatedAsAnErrorObject(obj) {
|
| }
|
|
|
| var objToString = %GetDataProperty(obj, "toString");
|
| - return obj instanceof $Error && objToString === ErrorToString;
|
| + return obj instanceof GlobalError && objToString === ErrorToString;
|
| }
|
|
|
|
|
| @@ -338,57 +380,6 @@ function GetSourceLine(message) {
|
| return location.sourceText();
|
| }
|
|
|
| -
|
| -function MakeError(type, arg0, arg1, arg2) {
|
| - return MakeGenericError($Error, type, arg0, arg1, arg2);
|
| -}
|
| -
|
| -
|
| -function MakeTypeError(type, arg0, arg1, arg2) {
|
| - return MakeGenericError($TypeError, type, arg0, arg1, arg2);
|
| -}
|
| -
|
| -
|
| -function MakeRangeError(type, arg0, arg1, arg2) {
|
| - return MakeGenericError($RangeError, type, arg0, arg1, arg2);
|
| -}
|
| -
|
| -
|
| -function MakeSyntaxError(type, arg0, arg1, arg2) {
|
| - return MakeGenericError($SyntaxError, type, arg0, arg1, arg2);
|
| -}
|
| -
|
| -
|
| -function MakeReferenceError(type, arg0, arg1, arg2) {
|
| - return MakeGenericError($ReferenceError, type, arg0, arg1, arg2);
|
| -}
|
| -
|
| -
|
| -function MakeEvalError(type, arg0, arg1, arg2) {
|
| - return MakeGenericError($EvalError, type, arg0, arg1, arg2);
|
| -}
|
| -
|
| -
|
| -function MakeURIError() {
|
| - return MakeGenericError($URIError, kURIMalformed);
|
| -}
|
| -
|
| -// The embedded versions are called from unoptimized code, with embedded
|
| -// arguments. Those arguments cannot be arrays, which are context-dependent.
|
| -function MakeTypeErrorEmbedded(type, arg) {
|
| - return MakeGenericError($TypeError, type, [arg]);
|
| -}
|
| -
|
| -
|
| -function MakeSyntaxErrorEmbedded(type, arg) {
|
| - return MakeGenericError($SyntaxError, type, [arg]);
|
| -}
|
| -
|
| -
|
| -function MakeReferenceErrorEmbedded(type, arg) {
|
| - return MakeGenericError($ReferenceError, type, [arg]);
|
| -}
|
| -
|
| /**
|
| * Find a line number given a specific source position.
|
| * @param {number} position The source position.
|
| @@ -1032,13 +1023,14 @@ var formatting_custom_stack_trace = false;
|
|
|
| function FormatStackTrace(obj, raw_stack) {
|
| var frames = GetStackFrames(raw_stack);
|
| - if (IS_FUNCTION($Error.prepareStackTrace) && !formatting_custom_stack_trace) {
|
| + if (IS_FUNCTION(GlobalError.prepareStackTrace) &&
|
| + !formatting_custom_stack_trace) {
|
| var array = [];
|
| %MoveArrayContents(frames, array);
|
| formatting_custom_stack_trace = true;
|
| var stack_trace = UNDEFINED;
|
| try {
|
| - stack_trace = $Error.prepareStackTrace(obj, array);
|
| + stack_trace = GlobalError.prepareStackTrace(obj, array);
|
| } catch (e) {
|
| throw e; // The custom formatting function threw. Rethrow.
|
| } finally {
|
| @@ -1082,8 +1074,6 @@ function GetTypeName(receiver, requireConstructor) {
|
| return constructorName;
|
| }
|
|
|
| -
|
| -var stack_trace_symbol; // Set during bootstrapping.
|
| var formatted_stack_trace_symbol = NEW_PRIVATE_OWN("formatted stack trace");
|
|
|
|
|
| @@ -1097,7 +1087,7 @@ var StackTraceGetter = function() {
|
| GET_PRIVATE(holder, formatted_stack_trace_symbol);
|
| if (IS_UNDEFINED(formatted_stack_trace)) {
|
| // No formatted stack trace available.
|
| - var stack_trace = GET_PRIVATE(holder, stack_trace_symbol);
|
| + var stack_trace = GET_PRIVATE(holder, $stackTraceSymbol);
|
| if (IS_UNDEFINED(stack_trace)) {
|
| // Neither formatted nor structured stack trace available.
|
| // Look further up the prototype chain.
|
| @@ -1105,7 +1095,7 @@ var StackTraceGetter = function() {
|
| continue;
|
| }
|
| formatted_stack_trace = FormatStackTrace(holder, stack_trace);
|
| - SET_PRIVATE(holder, stack_trace_symbol, UNDEFINED);
|
| + SET_PRIVATE(holder, $stackTraceSymbol, UNDEFINED);
|
| SET_PRIVATE(holder, formatted_stack_trace_symbol, formatted_stack_trace);
|
| }
|
| return formatted_stack_trace;
|
| @@ -1117,8 +1107,8 @@ var StackTraceGetter = function() {
|
| // If the receiver equals the holder, set the formatted stack trace that the
|
| // getter returns.
|
| var StackTraceSetter = function(v) {
|
| - if (HAS_PRIVATE(this, stack_trace_symbol)) {
|
| - SET_PRIVATE(this, stack_trace_symbol, UNDEFINED);
|
| + if (HAS_PRIVATE(this, $stackTraceSymbol)) {
|
| + SET_PRIVATE(this, $stackTraceSymbol, UNDEFINED);
|
| SET_PRIVATE(this, formatted_stack_trace_symbol, v);
|
| }
|
| };
|
| @@ -1135,72 +1125,67 @@ var captureStackTrace = function captureStackTrace(obj, cons_opt) {
|
| }
|
|
|
|
|
| -function SetUpError() {
|
| - // Define special error type constructors.
|
| -
|
| - var DefineError = function(f) {
|
| - // Store the error function in both the global object
|
| - // and the runtime object. The function is fetched
|
| - // from the runtime object when throwing errors from
|
| - // within the runtime system to avoid strange side
|
| - // effects when overwriting the error functions from
|
| - // user code.
|
| - var name = f.name;
|
| - %AddNamedProperty(global, name, f, DONT_ENUM);
|
| - %AddNamedProperty(builtins, '$' + name, f,
|
| - DONT_ENUM | DONT_DELETE | READ_ONLY);
|
| - // Configure the error function.
|
| - if (name == 'Error') {
|
| - // The prototype of the Error object must itself be an error.
|
| - // However, it can't be an instance of the Error object because
|
| - // it hasn't been properly configured yet. Instead we create a
|
| - // special not-a-true-error-but-close-enough object.
|
| - var ErrorPrototype = function() {};
|
| - %FunctionSetPrototype(ErrorPrototype, $Object.prototype);
|
| - %FunctionSetInstanceClassName(ErrorPrototype, 'Error');
|
| - %FunctionSetPrototype(f, new ErrorPrototype());
|
| +// Define special error type constructors.
|
| +function DefineError(f) {
|
| + // Store the error function in both the global object
|
| + // and the runtime object. The function is fetched
|
| + // from the runtime object when throwing errors from
|
| + // within the runtime system to avoid strange side
|
| + // effects when overwriting the error functions from
|
| + // user code.
|
| + var name = f.name;
|
| + %AddNamedProperty(global, name, f, DONT_ENUM);
|
| + // Configure the error function.
|
| + if (name == 'Error') {
|
| + // The prototype of the Error object must itself be an error.
|
| + // However, it can't be an instance of the Error object because
|
| + // it hasn't been properly configured yet. Instead we create a
|
| + // special not-a-true-error-but-close-enough object.
|
| + var ErrorPrototype = function() {};
|
| + %FunctionSetPrototype(ErrorPrototype, GlobalObject.prototype);
|
| + %FunctionSetInstanceClassName(ErrorPrototype, 'Error');
|
| + %FunctionSetPrototype(f, new ErrorPrototype());
|
| + } else {
|
| + %FunctionSetPrototype(f, new GlobalError());
|
| + %InternalSetPrototype(f, GlobalError);
|
| + }
|
| + %FunctionSetInstanceClassName(f, 'Error');
|
| + %AddNamedProperty(f.prototype, 'constructor', f, DONT_ENUM);
|
| + %AddNamedProperty(f.prototype, 'name', name, DONT_ENUM);
|
| + %SetCode(f, function(m) {
|
| + if (%_IsConstructCall()) {
|
| + try { captureStackTrace(this, f); } catch (e) { }
|
| + // Define all the expected properties directly on the error
|
| + // object. This avoids going through getters and setters defined
|
| + // on prototype objects.
|
| + if (!IS_UNDEFINED(m)) {
|
| + %AddNamedProperty(this, 'message', ToString(m), DONT_ENUM);
|
| + }
|
| } else {
|
| - %FunctionSetPrototype(f, new $Error());
|
| - %InternalSetPrototype(f, $Error);
|
| + return new f(m);
|
| }
|
| - %FunctionSetInstanceClassName(f, 'Error');
|
| - %AddNamedProperty(f.prototype, 'constructor', f, DONT_ENUM);
|
| - %AddNamedProperty(f.prototype, 'name', name, DONT_ENUM);
|
| - %SetCode(f, function(m) {
|
| - if (%_IsConstructCall()) {
|
| - try { captureStackTrace(this, f); } catch (e) { }
|
| - // Define all the expected properties directly on the error
|
| - // object. This avoids going through getters and setters defined
|
| - // on prototype objects.
|
| - if (!IS_UNDEFINED(m)) {
|
| - %AddNamedProperty(this, 'message', ToString(m), DONT_ENUM);
|
| - }
|
| - } else {
|
| - return new f(m);
|
| - }
|
| - });
|
| - %SetNativeFlag(f);
|
| - };
|
| -
|
| - DefineError(function Error() { });
|
| - DefineError(function TypeError() { });
|
| - DefineError(function RangeError() { });
|
| - DefineError(function SyntaxError() { });
|
| - DefineError(function ReferenceError() { });
|
| - DefineError(function EvalError() { });
|
| - DefineError(function URIError() { });
|
| -}
|
| + });
|
| + %SetNativeFlag(f);
|
| + return f;
|
| +};
|
|
|
| -SetUpError();
|
| +GlobalError = DefineError(function Error() { });
|
| +GlobalEvalError = DefineError(function EvalError() { });
|
| +GlobalRangeError = DefineError(function RangeError() { });
|
| +GlobalReferenceError = DefineError(function ReferenceError() { });
|
| +GlobalSyntaxError = DefineError(function SyntaxError() { });
|
| +GlobalTypeError = DefineError(function TypeError() { });
|
| +GlobalURIError = DefineError(function URIError() { });
|
|
|
| -$Error.captureStackTrace = captureStackTrace;
|
|
|
| -%AddNamedProperty($Error.prototype, 'message', '', DONT_ENUM);
|
| +GlobalError.captureStackTrace = captureStackTrace;
|
| +
|
| +%AddNamedProperty(GlobalError.prototype, 'message', '', DONT_ENUM);
|
|
|
| // Global list of error objects visited during ErrorToString. This is
|
| // used to detect cycles in error toString formatting.
|
| var visited_errors = new InternalArray();
|
| -var cyclic_error_marker = new $Object();
|
| +var cyclic_error_marker = new GlobalObject();
|
|
|
| function GetPropertyWithoutInvokingMonkeyGetters(error, name) {
|
| var current = error;
|
| @@ -1216,11 +1201,11 @@ function GetPropertyWithoutInvokingMonkeyGetters(error, name) {
|
| var desc = %GetOwnProperty(current, name);
|
| if (desc && desc[IS_ACCESSOR_INDEX]) {
|
| var isName = name === "name";
|
| - if (current === $ReferenceError.prototype)
|
| + if (current === GlobalReferenceError.prototype)
|
| return isName ? "ReferenceError" : UNDEFINED;
|
| - if (current === $SyntaxError.prototype)
|
| + if (current === GlobalSyntaxError.prototype)
|
| return isName ? "SyntaxError" : UNDEFINED;
|
| - if (current === $TypeError.prototype)
|
| + if (current === GlobalTypeError.prototype)
|
| return isName ? "TypeError" : UNDEFINED;
|
| }
|
| // Otherwise, read normally.
|
| @@ -1259,18 +1244,70 @@ function ErrorToString() {
|
| }
|
| }
|
|
|
| +InstallFunctions(GlobalError.prototype, DONT_ENUM, ['toString', ErrorToString]);
|
| +
|
| +$errorToString = ErrorToString;
|
| +$formatMessage = FormatMessage;
|
| +$getStackTraceLine = GetStackTraceLine;
|
| +$messageGetPositionInLine = GetPositionInLine;
|
| +$messageGetLineNumber = GetLineNumber;
|
| +$messageGetSourceLine = GetSourceLine;
|
| +$toDetailString = ToDetailString;
|
| +
|
| +$Error = GlobalError;
|
| +$EvalError = GlobalEvalError;
|
| +$RangeError = GlobalRangeError;
|
| +$ReferenceError = GlobalReferenceError;
|
| +$SyntaxError = GlobalSyntaxError;
|
| +$TypeError = GlobalTypeError;
|
| +$URIError = GlobalURIError;
|
| +
|
| +MakeError = function(type, arg0, arg1, arg2) {
|
| + return MakeGenericError(GlobalError, type, arg0, arg1, arg2);
|
| +}
|
| +
|
| +MakeEvalError = function(type, arg0, arg1, arg2) {
|
| + return MakeGenericError(GlobalEvalError, type, arg0, arg1, arg2);
|
| +}
|
| +
|
| +MakeRangeError = function(type, arg0, arg1, arg2) {
|
| + return MakeGenericError(GlobalRangeError, type, arg0, arg1, arg2);
|
| +}
|
|
|
| -InstallFunctions($Error.prototype, DONT_ENUM, ['toString', ErrorToString]);
|
| +MakeReferenceError = function(type, arg0, arg1, arg2) {
|
| + return MakeGenericError(GlobalReferenceError, type, arg0, arg1, arg2);
|
| +}
|
|
|
| -// Boilerplate for exceptions for stack overflows. Used from
|
| -// Isolate::StackOverflow().
|
| -function SetUpStackOverflowBoilerplate() {
|
| - var boilerplate = MakeRangeError(kStackOverflow);
|
| +MakeSyntaxError = function(type, arg0, arg1, arg2) {
|
| + return MakeGenericError(GlobalSyntaxError, type, arg0, arg1, arg2);
|
| +}
|
|
|
| - %DefineAccessorPropertyUnchecked(
|
| - boilerplate, 'stack', StackTraceGetter, StackTraceSetter, DONT_ENUM);
|
| +MakeTypeError = function(type, arg0, arg1, arg2) {
|
| + return MakeGenericError(GlobalTypeError, type, arg0, arg1, arg2);
|
| +}
|
|
|
| - return boilerplate;
|
| +MakeURIError = function() {
|
| + return MakeGenericError(GlobalURIError, kURIMalformed);
|
| }
|
|
|
| -var kStackOverflowBoilerplate = SetUpStackOverflowBoilerplate();
|
| +// The embedded versions are called from unoptimized code, with embedded
|
| +// arguments. Those arguments cannot be arrays, which are context-dependent.
|
| +MakeSyntaxErrorEmbedded = function(type, arg) {
|
| + return MakeGenericError(GlobalSyntaxError, type, [arg]);
|
| +}
|
| +
|
| +MakeReferenceErrorEmbedded = function(type, arg) {
|
| + return MakeGenericError(GlobalReferenceError, type, [arg]);
|
| +}
|
| +
|
| +MakeTypeErrorEmbedded = function(type, arg) {
|
| + return MakeGenericError(GlobalTypeError, type, [arg]);
|
| +}
|
| +
|
| +//Boilerplate for exceptions for stack overflows. Used from
|
| +//Isolate::StackOverflow().
|
| +$stackOverflowBoilerplate = MakeRangeError(kStackOverflow);
|
| +%DefineAccessorPropertyUnchecked($stackOverflowBoilerplate, 'stack',
|
| + StackTraceGetter, StackTraceSetter, DONT_ENUM);
|
| +
|
| +})();
|
|
|