using v8::Message;
using v8::StackFrame;
using v8::StackTrace;
+using v8::TryCatch;
void Environment::PrintSyncTrace() const {
if (!trace_sync_io_)
fflush(stderr);
}
+
+bool Environment::KickNextTick() {
+ TickInfo* info = tick_info();
+
+ if (info->in_tick()) {
+ return true;
+ }
+
+ if (info->length() == 0) {
+ isolate()->RunMicrotasks();
+ }
+
+ if (info->length() == 0) {
+ info->set_index(0);
+ return true;
+ }
+
+ info->set_in_tick(true);
+
+ // process nextTicks after call
+ TryCatch try_catch;
+ try_catch.SetVerbose(true);
+ tick_callback_function()->Call(process_object(), 0, nullptr);
+
+ info->set_in_tick(false);
+
+ if (try_catch.HasCaught()) {
+ info->set_last_threw(true);
+ return false;
+ }
+
+ return true;
+}
+
} // namespace node
void PrintSyncTrace() const;
inline void set_trace_sync_io(bool value);
+ bool KickNextTick();
+
inline uint32_t* heap_statistics_buffer() const;
inline void set_heap_statistics_buffer(uint32_t* pointer);
// If you hit this assertion, you forgot to enter the v8::Context first.
CHECK_EQ(env->context(), env->isolate()->GetCurrentContext());
- Local<Object> process = env->process_object();
Local<Object> object, domain;
bool has_async_queue = false;
bool has_domain = false;
return Undefined(env->isolate());
}
- Environment::TickInfo* tick_info = env->tick_info();
-
- if (tick_info->in_tick()) {
- return ret;
- }
-
- if (tick_info->length() == 0) {
- env->isolate()->RunMicrotasks();
- }
-
- if (tick_info->length() == 0) {
- tick_info->set_index(0);
- return ret;
- }
-
- tick_info->set_in_tick(true);
-
- // process nextTicks after call
- env->tick_callback_function()->Call(process, 0, nullptr);
-
- tick_info->set_in_tick(false);
-
- if (try_catch.HasCaught()) {
- tick_info->set_last_threw(true);
+ if (!env->KickNextTick())
return Undefined(env->isolate());
- }
return ret;
}
int argc = 0,
v8::Handle<v8::Value>* argv = nullptr);
+bool KickNextTick();
+
// Convert a struct sockaddr to a { address: '1.2.3.4', port: 1234 } JS object.
// Sets address and port properties on the info object and returns it.
// If |info| is omitted, a new object is returned.