@@ -17700,6 +17700,8 @@ TEST(RethrowBogusErrorStackTrace) {
1770017700v8::PromiseRejectEvent reject_event = v8::kPromiseRejectWithNoHandler;
1770117701int promise_reject_counter = 0;
1770217702int promise_revoke_counter = 0;
17703+ int promise_reject_after_resolved_counter = 0;
17704+ int promise_resolve_after_resolved_counter = 0;
1770317705int promise_reject_msg_line_number = -1;
1770417706int promise_reject_msg_column_number = -1;
1770517707int promise_reject_line_number = -1;
@@ -17709,40 +17711,56 @@ int promise_reject_frame_count = -1;
1770917711void PromiseRejectCallback(v8::PromiseRejectMessage reject_message) {
1771017712 v8::Local<v8::Object> global = CcTest::global();
1771117713 v8::Local<v8::Context> context = CcTest::isolate()->GetCurrentContext();
17712- CHECK_EQ (v8::Promise::PromiseState::kRejected ,
17714+ CHECK_NE (v8::Promise::PromiseState::kPending ,
1771317715 reject_message.GetPromise()->State());
17714- if (reject_message.GetEvent() == v8::kPromiseRejectWithNoHandler) {
17715- promise_reject_counter++;
17716- global->Set(context, v8_str("rejected"), reject_message.GetPromise())
17717- .FromJust();
17718- global->Set(context, v8_str("value"), reject_message.GetValue()).FromJust();
17719- v8::Local<v8::Message> message = v8::Exception::CreateMessage(
17720- CcTest::isolate(), reject_message.GetValue());
17721- v8::Local<v8::StackTrace> stack_trace = message->GetStackTrace();
17722-
17723- promise_reject_msg_line_number = message->GetLineNumber(context).FromJust();
17724- promise_reject_msg_column_number =
17725- message->GetStartColumn(context).FromJust() + 1;
17726-
17727- if (!stack_trace.IsEmpty()) {
17728- promise_reject_frame_count = stack_trace->GetFrameCount();
17729- if (promise_reject_frame_count > 0) {
17730- CHECK(stack_trace->GetFrame(0)
17731- ->GetScriptName()
17732- ->Equals(context, v8_str("pro"))
17733- .FromJust());
17734- promise_reject_line_number = stack_trace->GetFrame(0)->GetLineNumber();
17735- promise_reject_column_number = stack_trace->GetFrame(0)->GetColumn();
17736- } else {
17737- promise_reject_line_number = -1;
17738- promise_reject_column_number = -1;
17716+ switch (reject_message.GetEvent()) {
17717+ case v8::kPromiseRejectWithNoHandler: {
17718+ promise_reject_counter++;
17719+ global->Set(context, v8_str("rejected"), reject_message.GetPromise())
17720+ .FromJust();
17721+ global->Set(context, v8_str("value"), reject_message.GetValue())
17722+ .FromJust();
17723+ v8::Local<v8::Message> message = v8::Exception::CreateMessage(
17724+ CcTest::isolate(), reject_message.GetValue());
17725+ v8::Local<v8::StackTrace> stack_trace = message->GetStackTrace();
17726+
17727+ promise_reject_msg_line_number =
17728+ message->GetLineNumber(context).FromJust();
17729+ promise_reject_msg_column_number =
17730+ message->GetStartColumn(context).FromJust() + 1;
17731+
17732+ if (!stack_trace.IsEmpty()) {
17733+ promise_reject_frame_count = stack_trace->GetFrameCount();
17734+ if (promise_reject_frame_count > 0) {
17735+ CHECK(stack_trace->GetFrame(0)
17736+ ->GetScriptName()
17737+ ->Equals(context, v8_str("pro"))
17738+ .FromJust());
17739+ promise_reject_line_number =
17740+ stack_trace->GetFrame(0)->GetLineNumber();
17741+ promise_reject_column_number = stack_trace->GetFrame(0)->GetColumn();
17742+ } else {
17743+ promise_reject_line_number = -1;
17744+ promise_reject_column_number = -1;
17745+ }
1773917746 }
17747+ break;
17748+ }
17749+ case v8::kPromiseHandlerAddedAfterReject: {
17750+ promise_revoke_counter++;
17751+ global->Set(context, v8_str("revoked"), reject_message.GetPromise())
17752+ .FromJust();
17753+ CHECK(reject_message.GetValue().IsEmpty());
17754+ break;
17755+ }
17756+ case v8::kPromiseRejectAfterResolved: {
17757+ promise_reject_after_resolved_counter++;
17758+ break;
17759+ }
17760+ case v8::kPromiseResolveAfterResolved: {
17761+ promise_resolve_after_resolved_counter++;
17762+ break;
1774017763 }
17741- } else {
17742- promise_revoke_counter++;
17743- global->Set(context, v8_str("revoked"), reject_message.GetPromise())
17744- .FromJust();
17745- CHECK(reject_message.GetValue().IsEmpty());
1774617764 }
1774717765}
1774817766
@@ -17765,6 +17783,8 @@ v8::Local<v8::Value> RejectValue() {
1776517783void ResetPromiseStates() {
1776617784 promise_reject_counter = 0;
1776717785 promise_revoke_counter = 0;
17786+ promise_reject_after_resolved_counter = 0;
17787+ promise_resolve_after_resolved_counter = 0;
1776817788 promise_reject_msg_line_number = -1;
1776917789 promise_reject_msg_column_number = -1;
1777017790 promise_reject_line_number = -1;
@@ -17990,6 +18010,40 @@ TEST(PromiseRejectCallback) {
1799018010 CHECK_EQ(0, promise_revoke_counter);
1799118011 CHECK(RejectValue()->Equals(env.local(), v8_str("sss")).FromJust());
1799218012
18013+ ResetPromiseStates();
18014+
18015+ // Swallowed exceptions in the Promise constructor.
18016+ CompileRun(
18017+ "var v0 = new Promise(\n"
18018+ " function(res, rej) {\n"
18019+ " res(1);\n"
18020+ " throw new Error();\n"
18021+ " }\n"
18022+ ");\n");
18023+ CHECK(!GetPromise("v0")->HasHandler());
18024+ CHECK_EQ(0, promise_reject_counter);
18025+ CHECK_EQ(0, promise_revoke_counter);
18026+ CHECK_EQ(1, promise_reject_after_resolved_counter);
18027+ CHECK_EQ(0, promise_resolve_after_resolved_counter);
18028+
18029+ ResetPromiseStates();
18030+
18031+ // Duplication resolve.
18032+ CompileRun(
18033+ "var r;\n"
18034+ "var y0 = new Promise(\n"
18035+ " function(res, rej) {\n"
18036+ " r = res;\n"
18037+ " throw new Error();\n"
18038+ " }\n"
18039+ ");\n"
18040+ "r(1);\n");
18041+ CHECK(!GetPromise("y0")->HasHandler());
18042+ CHECK_EQ(1, promise_reject_counter);
18043+ CHECK_EQ(0, promise_revoke_counter);
18044+ CHECK_EQ(0, promise_reject_after_resolved_counter);
18045+ CHECK_EQ(1, promise_resolve_after_resolved_counter);
18046+
1799318047 // Test stack frames.
1799418048 env->GetIsolate()->SetCaptureStackTraceForUncaughtExceptions(true);
1799518049
0 commit comments