@@ -12,10 +12,12 @@ static bool called_cb_1 = false;
12
12
static bool called_cb_2 = false ;
13
13
static bool called_cb_ordered_1 = false ;
14
14
static bool called_cb_ordered_2 = false ;
15
+ static bool called_at_exit_js = false ;
15
16
static void at_exit_callback1 (void * arg);
16
17
static void at_exit_callback2 (void * arg);
17
18
static void at_exit_callback_ordered1 (void * arg);
18
19
static void at_exit_callback_ordered2 (void * arg);
20
+ static void at_exit_js (void * arg);
19
21
static std::string cb_1_arg; // NOLINT(runtime/string)
20
22
21
23
class EnvironmentTest : public EnvironmentTestFixture {
@@ -91,6 +93,17 @@ TEST_F(EnvironmentTest, AtExitWithArgument) {
91
93
EXPECT_EQ (arg, cb_1_arg);
92
94
}
93
95
96
+ TEST_F (EnvironmentTest, AtExitRunsJS) {
97
+ const v8::HandleScope handle_scope (isolate_);
98
+ const Argv argv;
99
+ Env env {handle_scope, argv};
100
+
101
+ AtExit (*env, at_exit_js, static_cast <void *>(isolate_));
102
+ EXPECT_FALSE (called_at_exit_js);
103
+ RunAtExit (*env);
104
+ EXPECT_TRUE (called_at_exit_js);
105
+ }
106
+
94
107
TEST_F (EnvironmentTest, MultipleEnvironmentsPerIsolate) {
95
108
const v8::HandleScope handle_scope (isolate_);
96
109
const Argv argv;
@@ -163,3 +176,12 @@ static void at_exit_callback_ordered2(void* arg) {
163
176
EXPECT_FALSE (called_cb_ordered_1);
164
177
called_cb_ordered_2 = true ;
165
178
}
179
+
180
+ static void at_exit_js (void * arg) {
181
+ v8::Isolate* isolate = static_cast <v8::Isolate*>(arg);
182
+ v8::HandleScope handle_scope (isolate);
183
+ v8::Local<v8::Object> obj = v8::Object::New (isolate);
184
+ assert (!obj.IsEmpty ()); // Assert VM is still alive.
185
+ assert (obj->IsObject ());
186
+ called_at_exit_js = true ;
187
+ }
0 commit comments