Skip to content

Commit eab6a35

Browse files
committed
Implementation of v8::Context::SetPromiseHooks().
1 parent ffcbe75 commit eab6a35

File tree

7 files changed

+52
-0
lines changed

7 files changed

+52
-0
lines changed

graal-nodejs/deps/v8/src/graal/graal_context.cc

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
*/
4141

4242
#include "graal_context.h"
43+
#include "graal_function.h"
4344
#include "graal_object.h"
4445

4546
#include "graal_context-inl.h"
@@ -114,3 +115,11 @@ v8::Local<v8::Object> GraalContext::GetExtrasBindingObject() {
114115
GraalObject* graal_extras = GraalObject::Allocate(Isolate(), java_extras);
115116
return reinterpret_cast<v8::Object*> (graal_extras);
116117
}
118+
119+
void GraalContext::SetPromiseHooks(v8::Local<v8::Function> init_hook, v8::Local<v8::Function> before_hook, v8::Local<v8::Function> after_hook, v8::Local<v8::Function> resolve_hook) {
120+
jobject java_init_hook = init_hook.IsEmpty() ? nullptr : reinterpret_cast<GraalFunction*> (*init_hook)->GetJavaObject();
121+
jobject java_before_hook = before_hook.IsEmpty() ? nullptr : reinterpret_cast<GraalFunction*> (*before_hook)->GetJavaObject();
122+
jobject java_after_hook = after_hook.IsEmpty() ? nullptr : reinterpret_cast<GraalFunction*> (*after_hook)->GetJavaObject();
123+
jobject java_resolve_hook = resolve_hook.IsEmpty() ? nullptr : reinterpret_cast<GraalFunction*> (*resolve_hook)->GetJavaObject();
124+
JNI_CALL_VOID(Isolate(), GraalAccessMethod::context_set_promise_hooks, GetJavaObject(), java_init_hook, java_before_hook, java_after_hook, java_resolve_hook);
125+
}

graal-nodejs/deps/v8/src/graal/graal_context.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ class GraalContext : public GraalHandleContent {
6060
void UseDefaultSecurityToken();
6161
v8::Local<v8::Value> GetSecurityToken();
6262
v8::Local<v8::Object> GetExtrasBindingObject();
63+
void SetPromiseHooks(v8::Local<v8::Function> init_hook, v8::Local<v8::Function> before_hook, v8::Local<v8::Function> after_hook, v8::Local<v8::Function> resolve_hook);
6364

6465
inline v8::Isolate* GetIsolate() {
6566
return reinterpret_cast<v8::Isolate*> (Isolate());

graal-nodejs/deps/v8/src/graal/graal_isolate.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -803,6 +803,7 @@ GraalIsolate::GraalIsolate(JavaVM* jvm, JNIEnv* env, v8::Isolate::CreateParams c
803803
ACCESS_METHOD(GraalAccessMethod::context_set_security_token, "contextSetSecurityToken", "(Ljava/lang/Object;Ljava/lang/Object;)V")
804804
ACCESS_METHOD(GraalAccessMethod::context_get_security_token, "contextGetSecurityToken", "(Ljava/lang/Object;)Ljava/lang/Object;")
805805
ACCESS_METHOD(GraalAccessMethod::context_get_extras_binding_object, "contextGetExtrasBindingObject", "(Ljava/lang/Object;)Ljava/lang/Object;")
806+
ACCESS_METHOD(GraalAccessMethod::context_set_promise_hooks, "contextSetPromiseHooks", "(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V")
806807
ACCESS_METHOD(GraalAccessMethod::find_dynamic_object_fields, "findDynamicObjectFields", "(Ljava/lang/Object;)[Ljava/lang/Object;")
807808
ACCESS_METHOD(GraalAccessMethod::proxy_is_function, "proxyIsFunction", "(Ljava/lang/Object;)Z")
808809
ACCESS_METHOD(GraalAccessMethod::proxy_get_handler, "proxyGetHandler", "(Ljava/lang/Object;)Ljava/lang/Object;")

graal-nodejs/deps/v8/src/graal/graal_isolate.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,7 @@ enum GraalAccessMethod {
264264
context_set_embedder_data,
265265
context_get_embedder_data,
266266
context_get_extras_binding_object,
267+
context_set_promise_hooks,
267268
try_catch_exception,
268269
try_catch_has_terminated,
269270
message_get_script_resource_name,

graal-nodejs/deps/v8/src/graal/v8.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3639,6 +3639,10 @@ namespace v8 {
36393639
TRACE
36403640
}
36413641

3642+
void Context::SetPromiseHooks(Local<Function> init_hook, Local<Function> before_hook, Local<Function> after_hook, Local<Function> resolve_hook) {
3643+
reinterpret_cast<GraalContext*> (this)->SetPromiseHooks(init_hook, before_hook, after_hook, resolve_hook);
3644+
}
3645+
36423646
void Object::CheckCast(v8::Value* obj) {}
36433647
void Promise::CheckCast(v8::Value* obj) {}
36443648
void Function::CheckCast(v8::Value* obj) {}

graal-nodejs/mx.graal-nodejs/com.oracle.truffle.trufflenode/src/com/oracle/truffle/trufflenode/GraalJSAccess.java

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2792,6 +2792,41 @@ public Object contextGetEmbedderData(Object realm, int index) {
27922792
return data.getEmbedderData(index);
27932793
}
27942794

2795+
public void contextSetPromiseHooks(Object context, Object initHook, Object beforeHook, Object afterHook, Object resolveHook) {
2796+
PromiseHook hook = new PromiseHook() {
2797+
@Override
2798+
public void promiseChanged(int changeType, DynamicObject promise, DynamicObject parentPromise) {
2799+
Object hook;
2800+
switch (changeType) {
2801+
case PromiseHook.TYPE_INIT:
2802+
hook = initHook;
2803+
break;
2804+
case PromiseHook.TYPE_RESOLVE:
2805+
hook = resolveHook;
2806+
break;
2807+
case PromiseHook.TYPE_BEFORE:
2808+
hook = beforeHook;
2809+
break;
2810+
case PromiseHook.TYPE_AFTER:
2811+
hook = afterHook;
2812+
break;
2813+
default:
2814+
throw Errors.shouldNotReachHere();
2815+
}
2816+
if (hook != null) {
2817+
Object[] arguments;
2818+
if (changeType == PromiseHook.TYPE_INIT) {
2819+
arguments = new Object[]{promise, parentPromise};
2820+
} else {
2821+
arguments = new Object[]{promise};
2822+
}
2823+
JSRuntime.call(hook, Undefined.instance, arguments);
2824+
}
2825+
}
2826+
};
2827+
((JSRealm) context).getContext().setPromiseHook(hook);
2828+
}
2829+
27952830
public void isolateRunMicrotasks() {
27962831
pollWeakCallbackQueue(false);
27972832
try {

graal-nodejs/mx.graal-nodejs/com.oracle.truffle.trufflenode/src/svmnodejs.jniconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
{ "name": "contextNew" },
4040
{ "name": "contextSetEmbedderData" },
4141
{ "name": "contextSetPointerInEmbedderData" },
42+
{ "name": "contextSetPromiseHooks" },
4243
{ "name": "contextSetSecurityToken" },
4344
{ "name": "create" },
4445
{ "name": "dataViewNew" },

0 commit comments

Comments
 (0)