| Index: src/builtins/builtins-error.cc
|
| diff --git a/src/builtins/builtins-error.cc b/src/builtins/builtins-error.cc
|
| index 43637060110df21c8ff878fcd197ec5c32212203..d1be5033d82d96831c3b7d6ff3e9ed1e8b7f7472 100644
|
| --- a/src/builtins/builtins-error.cc
|
| +++ b/src/builtins/builtins-error.cc
|
| @@ -15,11 +15,23 @@ namespace internal {
|
| // ES6 section 19.5.1.1 Error ( message )
|
| BUILTIN(ErrorConstructor) {
|
| HandleScope scope(isolate);
|
| +
|
| + FrameSkipMode mode = SKIP_FIRST;
|
| + Handle<Object> caller;
|
| +
|
| + // When we're passed a JSFunction as new target, we can skip frames until that
|
| + // specific function is seen instead of unconditionally skipping the first
|
| + // frame.
|
| + if (args.new_target()->IsJSFunction()) {
|
| + mode = SKIP_UNTIL_SEEN;
|
| + caller = args.new_target();
|
| + }
|
| +
|
| RETURN_RESULT_OR_FAILURE(
|
| - isolate,
|
| - ErrorUtils::Construct(isolate, args.target<JSFunction>(),
|
| - Handle<Object>::cast(args.new_target()),
|
| - args.atOrUndefined(isolate, 1), SKIP_FIRST, false));
|
| + isolate, ErrorUtils::Construct(isolate, args.target<JSFunction>(),
|
| + Handle<Object>::cast(args.new_target()),
|
| + args.atOrUndefined(isolate, 1), mode,
|
| + caller, false));
|
| }
|
|
|
| // static
|
| @@ -69,5 +81,24 @@ BUILTIN(ErrorPrototypeToString) {
|
| ErrorUtils::ToString(isolate, args.receiver()));
|
| }
|
|
|
| +BUILTIN(MakeGenericError) {
|
| + HandleScope scope(isolate);
|
| +
|
| + Handle<Object> constructor = args.atOrUndefined(isolate, 1);
|
| + Handle<Object> template_index = args.atOrUndefined(isolate, 2);
|
| + Handle<Object> arg0 = args.atOrUndefined(isolate, 3);
|
| + Handle<Object> arg1 = args.atOrUndefined(isolate, 4);
|
| + Handle<Object> arg2 = args.atOrUndefined(isolate, 5);
|
| +
|
| + DCHECK(constructor->IsJSFunction());
|
| + DCHECK(template_index->IsSmi());
|
| +
|
| + RETURN_RESULT_OR_FAILURE(
|
| + isolate,
|
| + ErrorUtils::MakeGenericError(
|
| + isolate, Handle<JSFunction>::cast(constructor),
|
| + Smi::cast(*template_index)->value(), arg0, arg1, arg2, SKIP_FIRST));
|
| +}
|
| +
|
| } // namespace internal
|
| } // namespace v8
|
|
|