Index: src/factory.cc |
diff --git a/src/factory.cc b/src/factory.cc |
index de47c849480634bb8560a5289cf5e5f2cdd46ecd..8d01918e292902edad3c807ae65c5cabd172b4aa 100644 |
--- a/src/factory.cc |
+++ b/src/factory.cc |
@@ -1103,35 +1103,31 @@ Handle<Bool8x16> Factory::NewBool8x16(bool lanes[16], PretenureFlag pretenure) { |
} |
-Handle<Object> Factory::NewError(const char* maker, |
+Handle<Object> Factory::NewError(Handle<JSFunction> constructor, |
MessageTemplate::Template template_index, |
Handle<Object> arg0, Handle<Object> arg1, |
Handle<Object> arg2) { |
HandleScope scope(isolate()); |
- Handle<String> error_maker = InternalizeUtf8String(maker); |
if (isolate()->bootstrapper()->IsActive()) { |
- // If this exception is being thrown during bootstrapping, |
- // js_builtins_object is unavailable. We return the error maker |
- // name's string as the exception since we have nothing better |
- // to do. |
- return scope.CloseAndEscape(error_maker); |
+ // During bootstrapping we cannot construct error objects. |
+ return scope.CloseAndEscape(NewStringFromAsciiChecked( |
+ MessageTemplate::TemplateString(template_index))); |
} |
- Handle<Object> fun_obj = Object::GetProperty(isolate()->js_builtins_object(), |
- error_maker).ToHandleChecked(); |
- Handle<JSFunction> fun = Handle<JSFunction>::cast(fun_obj); |
+ Handle<JSFunction> fun = isolate()->make_error_function(); |
Handle<Object> message_type(Smi::FromInt(template_index), isolate()); |
if (arg0.is_null()) arg0 = undefined_value(); |
if (arg1.is_null()) arg1 = undefined_value(); |
if (arg2.is_null()) arg2 = undefined_value(); |
- Handle<Object> argv[] = {message_type, arg0, arg1, arg2}; |
+ Handle<Object> argv[] = {constructor, message_type, arg0, arg1, arg2}; |
// Invoke the JavaScript factory method. If an exception is thrown while |
// running the factory method, use the exception as the result. |
Handle<Object> result; |
MaybeHandle<Object> exception; |
- if (!Execution::TryCall(fun, isolate()->js_builtins_object(), arraysize(argv), |
- argv, &exception).ToHandle(&result)) { |
+ if (!Execution::TryCall(fun, undefined_value(), arraysize(argv), argv, |
+ &exception) |
+ .ToHandle(&result)) { |
Handle<Object> exception_obj; |
if (exception.ToHandle(&exception_obj)) { |
result = exception_obj; |
@@ -1143,113 +1139,6 @@ Handle<Object> Factory::NewError(const char* maker, |
} |
-Handle<Object> Factory::NewError(MessageTemplate::Template template_index, |
- Handle<Object> arg0, Handle<Object> arg1, |
- Handle<Object> arg2) { |
- return NewError("MakeError", template_index, arg0, arg1, arg2); |
-} |
- |
- |
-Handle<Object> Factory::NewTypeError(MessageTemplate::Template template_index, |
- Handle<Object> arg0, Handle<Object> arg1, |
- Handle<Object> arg2) { |
- return NewError("MakeTypeError", template_index, arg0, arg1, arg2); |
-} |
- |
- |
-Handle<Object> Factory::NewSyntaxError(MessageTemplate::Template template_index, |
- Handle<Object> arg0, Handle<Object> arg1, |
- Handle<Object> arg2) { |
- return NewError("MakeSyntaxError", template_index, arg0, arg1, arg2); |
-} |
- |
- |
-Handle<Object> Factory::NewReferenceError( |
- MessageTemplate::Template template_index, Handle<Object> arg0, |
- Handle<Object> arg1, Handle<Object> arg2) { |
- return NewError("MakeReferenceError", template_index, arg0, arg1, arg2); |
-} |
- |
- |
-Handle<Object> Factory::NewRangeError(MessageTemplate::Template template_index, |
- Handle<Object> arg0, Handle<Object> arg1, |
- Handle<Object> arg2) { |
- return NewError("MakeRangeError", template_index, arg0, arg1, arg2); |
-} |
- |
- |
-Handle<Object> Factory::NewEvalError(MessageTemplate::Template template_index, |
- Handle<Object> arg0, Handle<Object> arg1, |
- Handle<Object> arg2) { |
- return NewError("MakeEvalError", template_index, arg0, arg1, arg2); |
-} |
- |
- |
-Handle<String> Factory::EmergencyNewError(const char* message, |
- Handle<JSArray> args) { |
- const int kBufferSize = 1000; |
- char buffer[kBufferSize]; |
- size_t space = kBufferSize; |
- char* p = &buffer[0]; |
- |
- Vector<char> v(buffer, kBufferSize); |
- StrNCpy(v, message, space); |
- space -= Min(space, strlen(message)); |
- p = &buffer[kBufferSize] - space; |
- |
- for (int i = 0; i < Smi::cast(args->length())->value(); i++) { |
- if (space > 0) { |
- *p++ = ' '; |
- space--; |
- if (space > 0) { |
- Handle<String> arg_str = Handle<String>::cast( |
- Object::GetElement(isolate(), args, i).ToHandleChecked()); |
- base::SmartArrayPointer<char> arg = arg_str->ToCString(); |
- Vector<char> v2(p, static_cast<int>(space)); |
- StrNCpy(v2, arg.get(), space); |
- space -= Min(space, strlen(arg.get())); |
- p = &buffer[kBufferSize] - space; |
- } |
- } |
- } |
- if (space > 0) { |
- *p = '\0'; |
- } else { |
- buffer[kBufferSize - 1] = '\0'; |
- } |
- return NewStringFromUtf8(CStrVector(buffer), TENURED).ToHandleChecked(); |
-} |
- |
- |
-Handle<Object> Factory::NewError(const char* maker, const char* message, |
- Handle<JSArray> args) { |
- Handle<String> make_str = InternalizeUtf8String(maker); |
- Handle<Object> fun_obj = Object::GetProperty( |
- isolate()->js_builtins_object(), make_str).ToHandleChecked(); |
- // If the builtins haven't been properly configured yet this error |
- // constructor may not have been defined. Bail out. |
- if (!fun_obj->IsJSFunction()) { |
- return EmergencyNewError(message, args); |
- } |
- Handle<JSFunction> fun = Handle<JSFunction>::cast(fun_obj); |
- Handle<Object> message_obj = InternalizeUtf8String(message); |
- Handle<Object> argv[] = { message_obj, args }; |
- |
- // Invoke the JavaScript factory method. If an exception is thrown while |
- // running the factory method, use the exception as the result. |
- Handle<Object> result; |
- MaybeHandle<Object> exception; |
- if (!Execution::TryCall(fun, undefined_value(), arraysize(argv), argv, |
- &exception) |
- .ToHandle(&result)) { |
- Handle<Object> exception_obj; |
- if (exception.ToHandle(&exception_obj)) return exception_obj; |
- return undefined_value(); |
- } |
- return result; |
-} |
- |
- |
Handle<Object> Factory::NewError(Handle<JSFunction> constructor, |
Handle<String> message) { |
Handle<Object> argv[] = { message }; |