Index: src/runtime/runtime-internal.cc |
diff --git a/src/runtime/runtime-internal.cc b/src/runtime/runtime-internal.cc |
index 62f9513c939a042874b0c2fb85d92d393955fc40..f9e7cfde4509e52667f23357241e9f43aef26ed7 100644 |
--- a/src/runtime/runtime-internal.cc |
+++ b/src/runtime/runtime-internal.cc |
@@ -290,7 +290,7 @@ RUNTIME_FUNCTION(Runtime_ThrowApplyNonFunction) { |
namespace { |
-void PromiseRejectEvent(Isolate* isolate, Handle<JSObject> promise, |
+void PromiseRejectEvent(Isolate* isolate, Handle<JSReceiver> promise, |
Handle<Object> rejected_promise, Handle<Object> value, |
bool debug_event) { |
if (isolate->debug()->is_active() && debug_event) { |
@@ -299,7 +299,7 @@ void PromiseRejectEvent(Isolate* isolate, Handle<JSObject> promise, |
Handle<Symbol> key = isolate->factory()->promise_has_handler_symbol(); |
// Do not report if we actually have a handler. |
if (JSReceiver::GetDataProperty(promise, key)->IsUndefined(isolate)) { |
- isolate->ReportPromiseReject(promise, value, |
+ isolate->ReportPromiseReject(Handle<JSObject>::cast(promise), value, |
v8::kPromiseRejectWithNoHandler); |
} |
} |
@@ -601,8 +601,35 @@ void EnqueuePromiseReactionJob(Isolate* isolate, Handle<Object> value, |
isolate->native_context()); |
isolate->EnqueueMicrotask(info); |
} |
+ |
+void PromiseFulfill(Isolate* isolate, Handle<JSReceiver> promise, |
+ Handle<Smi> status, Handle<Object> value, |
+ Handle<Symbol> reaction) { |
+ Handle<Object> tasks = JSReceiver::GetDataProperty(promise, reaction); |
+ if (!tasks->IsUndefined(isolate)) { |
+ Handle<Object> deferred = JSReceiver::GetDataProperty( |
+ promise, isolate->factory()->promise_deferred_reaction_symbol()); |
+ EnqueuePromiseReactionJob(isolate, value, tasks, deferred, status); |
+ } |
+} |
} // namespace |
+RUNTIME_FUNCTION(Runtime_PromiseReject) { |
+ DCHECK(args.length() == 3); |
+ HandleScope scope(isolate); |
+ CONVERT_ARG_HANDLE_CHECKED(JSReceiver, promise, 0); |
+ CONVERT_ARG_HANDLE_CHECKED(Object, reason, 1); |
+ CONVERT_BOOLEAN_ARG_CHECKED(debug_event, 2); |
+ |
+ PromiseRejectEvent(isolate, promise, promise, reason, debug_event); |
+ const int kRejected = 2; |
adamk
2016/10/26 14:39:50
This needs a comment that it must be kept in sync
|
+ Handle<Smi> status = handle(Smi::FromInt(kRejected), isolate); |
+ Handle<Symbol> reaction = |
+ isolate->factory()->promise_reject_reactions_symbol(); |
+ PromiseFulfill(isolate, promise, status, reason, reaction); |
+ return isolate->heap()->undefined_value(); |
+} |
+ |
RUNTIME_FUNCTION(Runtime_PromiseFulfill) { |
DCHECK(args.length() == 4); |
HandleScope scope(isolate); |
@@ -610,12 +637,7 @@ RUNTIME_FUNCTION(Runtime_PromiseFulfill) { |
CONVERT_ARG_HANDLE_CHECKED(Smi, status, 1); |
CONVERT_ARG_HANDLE_CHECKED(Object, value, 2); |
CONVERT_ARG_HANDLE_CHECKED(Symbol, reaction, 3); |
- Handle<Object> tasks = JSReceiver::GetDataProperty(promise, reaction); |
- if (!tasks->IsUndefined(isolate)) { |
- Handle<Object> deferred = JSReceiver::GetDataProperty( |
- promise, isolate->factory()->promise_deferred_reaction_symbol()); |
- EnqueuePromiseReactionJob(isolate, value, tasks, deferred, status); |
- } |
+ PromiseFulfill(isolate, promise, status, value, reaction); |
return isolate->heap()->undefined_value(); |
} |