Index: src/js/messages.js |
diff --git a/src/js/messages.js b/src/js/messages.js |
index 8db1166ff472ef1853ba579fc21268057230d10a..dc845ea97adc855fa7d0847374dad1af99e7551a 100644 |
--- a/src/js/messages.js |
+++ b/src/js/messages.js |
@@ -908,59 +908,45 @@ var StackTraceSetter = function(v) { |
var captureStackTrace = function() {}; |
-// Define special error type constructors. |
-function DefineError(global, 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 (!IS_UNDEFINED(new.target)) { |
- 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', TO_STRING(m), DONT_ENUM); |
- } |
- } else { |
- return new f(m); |
+// Set up special error type constructors. |
+function SetUpError(error_function) { |
+ %FunctionSetInstanceClassName(error_function, 'Error'); |
+ var name = error_function.name; |
+ var prototype = new GlobalObject(); |
+ if (name !== 'Error') { |
+ %InternalSetPrototype(error_function, GlobalError); |
+ %InternalSetPrototype(prototype, GlobalError.prototype); |
+ } |
+ %FunctionSetPrototype(error_function, prototype); |
+ |
+ %AddNamedProperty(error_function.prototype, 'name', name, DONT_ENUM); |
+ %AddNamedProperty(error_function.prototype, 'message', '', DONT_ENUM); |
+ %AddNamedProperty( |
+ error_function.prototype, 'constructor', error_function, DONT_ENUM); |
+ |
+ %SetCode(error_function, function(m) { |
+ if (IS_UNDEFINED(new.target)) return new error_function(m); |
+ |
+ try { captureStackTrace(this, error_function); } 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', TO_STRING(m), DONT_ENUM); |
} |
}); |
- %SetNativeFlag(f); |
- return f; |
-}; |
-GlobalError = DefineError(global, function Error() { }); |
-GlobalEvalError = DefineError(global, function EvalError() { }); |
-GlobalRangeError = DefineError(global, function RangeError() { }); |
-GlobalReferenceError = DefineError(global, function ReferenceError() { }); |
-GlobalSyntaxError = DefineError(global, function SyntaxError() { }); |
-GlobalTypeError = DefineError(global, function TypeError() { }); |
-GlobalURIError = DefineError(global, function URIError() { }); |
+ %SetNativeFlag(error_function); |
+ return error_function; |
+}; |
-%AddNamedProperty(GlobalError.prototype, 'message', '', DONT_ENUM); |
+GlobalError = SetUpError(global.Error); |
+GlobalEvalError = SetUpError(global.EvalError); |
+GlobalRangeError = SetUpError(global.RangeError); |
+GlobalReferenceError = SetUpError(global.ReferenceError); |
+GlobalSyntaxError = SetUpError(global.SyntaxError); |
+GlobalTypeError = SetUpError(global.TypeError); |
+GlobalURIError = SetUpError(global.URIError); |
utils.InstallFunctions(GlobalError.prototype, DONT_ENUM, |
['toString', ErrorToString]); |
@@ -1011,8 +997,6 @@ captureStackTrace = function captureStackTrace(obj, cons_opt) { |
GlobalError.captureStackTrace = captureStackTrace; |
%InstallToContext([ |
- "error_function", GlobalError, |
- "eval_error_function", GlobalEvalError, |
"get_stack_trace_line_fun", GetStackTraceLine, |
"make_error_function", MakeGenericError, |
"make_range_error", MakeRangeError, |
@@ -1021,13 +1005,8 @@ GlobalError.captureStackTrace = captureStackTrace; |
"message_get_line_number", GetLineNumber, |
"message_get_source_line", GetSourceLine, |
"no_side_effect_to_string_fun", NoSideEffectToString, |
- "range_error_function", GlobalRangeError, |
- "reference_error_function", GlobalReferenceError, |
"stack_overflow_boilerplate", StackOverflowBoilerplate, |
- "syntax_error_function", GlobalSyntaxError, |
"to_detail_string_fun", ToDetailString, |
- "type_error_function", GlobalTypeError, |
- "uri_error_function", GlobalURIError, |
]); |
utils.Export(function(to) { |