@@ -17718,6 +17718,8 @@ TEST(RethrowBogusErrorStackTrace) {
1771817718v8::PromiseRejectEvent reject_event = v8::kPromiseRejectWithNoHandler;
1771917719int promise_reject_counter = 0;
1772017720int promise_revoke_counter = 0;
17721+ int promise_reject_after_resolved_counter = 0;
17722+ int promise_resolve_after_resolved_counter = 0;
1772117723int promise_reject_msg_line_number = -1;
1772217724int promise_reject_msg_column_number = -1;
1772317725int promise_reject_line_number = -1;
@@ -17727,40 +17729,56 @@ int promise_reject_frame_count = -1;
1772717729void PromiseRejectCallback(v8::PromiseRejectMessage reject_message) {
1772817730 v8::Local<v8::Object> global = CcTest::global();
1772917731 v8::Local<v8::Context> context = CcTest::isolate()->GetCurrentContext();
17730- CHECK_EQ (v8::Promise::PromiseState::kRejected ,
17732+ CHECK_NE (v8::Promise::PromiseState::kPending ,
1773117733 reject_message.GetPromise()->State());
17732- if (reject_message.GetEvent() == v8::kPromiseRejectWithNoHandler) {
17733- promise_reject_counter++;
17734- global->Set(context, v8_str("rejected"), reject_message.GetPromise())
17735- .FromJust();
17736- global->Set(context, v8_str("value"), reject_message.GetValue()).FromJust();
17737- v8::Local<v8::Message> message = v8::Exception::CreateMessage(
17738- CcTest::isolate(), reject_message.GetValue());
17739- v8::Local<v8::StackTrace> stack_trace = message->GetStackTrace();
17740-
17741- promise_reject_msg_line_number = message->GetLineNumber(context).FromJust();
17742- promise_reject_msg_column_number =
17743- message->GetStartColumn(context).FromJust() + 1;
17744-
17745- if (!stack_trace.IsEmpty()) {
17746- promise_reject_frame_count = stack_trace->GetFrameCount();
17747- if (promise_reject_frame_count > 0) {
17748- CHECK(stack_trace->GetFrame(0)
17749- ->GetScriptName()
17750- ->Equals(context, v8_str("pro"))
17751- .FromJust());
17752- promise_reject_line_number = stack_trace->GetFrame(0)->GetLineNumber();
17753- promise_reject_column_number = stack_trace->GetFrame(0)->GetColumn();
17754- } else {
17755- promise_reject_line_number = -1;
17756- promise_reject_column_number = -1;
17734+ switch (reject_message.GetEvent()) {
17735+ case v8::kPromiseRejectWithNoHandler: {
17736+ promise_reject_counter++;
17737+ global->Set(context, v8_str("rejected"), reject_message.GetPromise())
17738+ .FromJust();
17739+ global->Set(context, v8_str("value"), reject_message.GetValue())
17740+ .FromJust();
17741+ v8::Local<v8::Message> message = v8::Exception::CreateMessage(
17742+ CcTest::isolate(), reject_message.GetValue());
17743+ v8::Local<v8::StackTrace> stack_trace = message->GetStackTrace();
17744+
17745+ promise_reject_msg_line_number =
17746+ message->GetLineNumber(context).FromJust();
17747+ promise_reject_msg_column_number =
17748+ message->GetStartColumn(context).FromJust() + 1;
17749+
17750+ if (!stack_trace.IsEmpty()) {
17751+ promise_reject_frame_count = stack_trace->GetFrameCount();
17752+ if (promise_reject_frame_count > 0) {
17753+ CHECK(stack_trace->GetFrame(0)
17754+ ->GetScriptName()
17755+ ->Equals(context, v8_str("pro"))
17756+ .FromJust());
17757+ promise_reject_line_number =
17758+ stack_trace->GetFrame(0)->GetLineNumber();
17759+ promise_reject_column_number = stack_trace->GetFrame(0)->GetColumn();
17760+ } else {
17761+ promise_reject_line_number = -1;
17762+ promise_reject_column_number = -1;
17763+ }
1775717764 }
17765+ break;
17766+ }
17767+ case v8::kPromiseHandlerAddedAfterReject: {
17768+ promise_revoke_counter++;
17769+ global->Set(context, v8_str("revoked"), reject_message.GetPromise())
17770+ .FromJust();
17771+ CHECK(reject_message.GetValue().IsEmpty());
17772+ break;
17773+ }
17774+ case v8::kPromiseRejectAfterResolved: {
17775+ promise_reject_after_resolved_counter++;
17776+ break;
17777+ }
17778+ case v8::kPromiseResolveAfterResolved: {
17779+ promise_resolve_after_resolved_counter++;
17780+ break;
1775817781 }
17759- } else {
17760- promise_revoke_counter++;
17761- global->Set(context, v8_str("revoked"), reject_message.GetPromise())
17762- .FromJust();
17763- CHECK(reject_message.GetValue().IsEmpty());
1776417782 }
1776517783}
1776617784
@@ -17783,6 +17801,8 @@ v8::Local<v8::Value> RejectValue() {
1778317801void ResetPromiseStates() {
1778417802 promise_reject_counter = 0;
1778517803 promise_revoke_counter = 0;
17804+ promise_reject_after_resolved_counter = 0;
17805+ promise_resolve_after_resolved_counter = 0;
1778617806 promise_reject_msg_line_number = -1;
1778717807 promise_reject_msg_column_number = -1;
1778817808 promise_reject_line_number = -1;
@@ -18008,6 +18028,40 @@ TEST(PromiseRejectCallback) {
1800818028 CHECK_EQ(0, promise_revoke_counter);
1800918029 CHECK(RejectValue()->Equals(env.local(), v8_str("sss")).FromJust());
1801018030
18031+ ResetPromiseStates();
18032+
18033+ // Swallowed exceptions in the Promise constructor.
18034+ CompileRun(
18035+ "var v0 = new Promise(\n"
18036+ " function(res, rej) {\n"
18037+ " res(1);\n"
18038+ " throw new Error();\n"
18039+ " }\n"
18040+ ");\n");
18041+ CHECK(!GetPromise("v0")->HasHandler());
18042+ CHECK_EQ(0, promise_reject_counter);
18043+ CHECK_EQ(0, promise_revoke_counter);
18044+ CHECK_EQ(1, promise_reject_after_resolved_counter);
18045+ CHECK_EQ(0, promise_resolve_after_resolved_counter);
18046+
18047+ ResetPromiseStates();
18048+
18049+ // Duplication resolve.
18050+ CompileRun(
18051+ "var r;\n"
18052+ "var y0 = new Promise(\n"
18053+ " function(res, rej) {\n"
18054+ " r = res;\n"
18055+ " throw new Error();\n"
18056+ " }\n"
18057+ ");\n"
18058+ "r(1);\n");
18059+ CHECK(!GetPromise("y0")->HasHandler());
18060+ CHECK_EQ(1, promise_reject_counter);
18061+ CHECK_EQ(0, promise_revoke_counter);
18062+ CHECK_EQ(0, promise_reject_after_resolved_counter);
18063+ CHECK_EQ(1, promise_resolve_after_resolved_counter);
18064+
1801118065 // Test stack frames.
1801218066 env->GetIsolate()->SetCaptureStackTraceForUncaughtExceptions(true);
1801318067
0 commit comments