Skip to content

Commit 0281f7b

Browse files
committed
feat(node:vm): implement node:vm module for v8 and quickjs
1 parent 822c0b9 commit 0281f7b

File tree

9 files changed

+3976
-12
lines changed

9 files changed

+3976
-12
lines changed

NativeScript/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,7 @@ if(ENABLE_JS_RUNTIME)
155155
runtime/modules/node/FS.cpp
156156
runtime/modules/node/Path.cpp
157157
runtime/modules/node/Process.cpp
158+
runtime/modules/node/VM.cpp
158159
runtime/modules/performance/Performance.cpp
159160
runtime/ThreadSafeFunction.mm
160161
runtime/Bundle.mm

NativeScript/napi/quickjs/quickjs-api.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4328,3 +4328,20 @@ napi_status qjs_update_stack_top(napi_env env) {
43284328
JS_UpdateStackTop(env->runtime->runtime);
43294329
return napi_clear_last_error(env);
43304330
}
4331+
4332+
napi_status qjs_create_scoped_value(napi_env env, JSValue value,
4333+
napi_value *result) {
4334+
return CreateScopedResult(env, value, result);
4335+
}
4336+
4337+
JSContext *qjs_get_context(napi_env env) {
4338+
return env != NULL ? env->context : NULL;
4339+
}
4340+
4341+
JSRuntime *qjs_get_runtime(napi_env env) {
4342+
if (env == NULL || env->runtime == NULL) {
4343+
return NULL;
4344+
}
4345+
4346+
return env->runtime->runtime;
4347+
}

NativeScript/napi/quickjs/quicks-runtime.h

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,31 +5,42 @@
55
#ifndef TEST_APP_QUICKS_RUNTIME_H
66
#define TEST_APP_QUICKS_RUNTIME_H
77
#include "js_native_api.h"
8+
#include "quickjs.h"
89

910
EXTERN_C_START
1011

11-
NAPI_EXTERN napi_status NAPI_CDECL qjs_create_runtime(napi_runtime *runtime);
12+
NAPI_EXTERN napi_status NAPI_CDECL qjs_create_runtime(napi_runtime* runtime);
1213

13-
NAPI_EXTERN napi_status NAPI_CDECL qjs_create_napi_env(napi_env *env, napi_runtime runtime);
14+
NAPI_EXTERN napi_status NAPI_CDECL qjs_create_napi_env(napi_env* env,
15+
napi_runtime runtime);
1416

1517
NAPI_EXTERN napi_status NAPI_CDECL qjs_free_napi_env(napi_env env);
1618

1719
NAPI_EXTERN napi_status NAPI_CDECL qjs_free_runtime(napi_runtime runtime);
1820

1921
NAPI_EXTERN napi_status NAPI_CDECL qjs_execute_script(napi_env env,
2022
napi_value script,
21-
const char *file,
22-
napi_value *result);
23+
const char* file,
24+
napi_value* result);
2325

24-
NAPI_EXTERN napi_status NAPI_CDECL qjs_runtime_before_gc_callback(napi_env env, napi_finalize cb, void *data);
25-
26-
NAPI_EXTERN napi_status NAPI_CDECL qjs_runtime_after_gc_callback(napi_env env, napi_finalize cb, void *data);
26+
NAPI_EXTERN napi_status NAPI_CDECL
27+
qjs_runtime_before_gc_callback(napi_env env, napi_finalize cb, void* data);
2728

29+
NAPI_EXTERN napi_status NAPI_CDECL
30+
qjs_runtime_after_gc_callback(napi_env env, napi_finalize cb, void* data);
2831

2932
NAPI_EXTERN napi_status NAPI_CDECL qjs_execute_pending_jobs(napi_env env);
3033

3134
NAPI_EXTERN napi_status NAPI_CDECL qjs_update_stack_top(napi_env env);
3235

36+
NAPI_EXTERN JSContext* NAPI_CDECL qjs_get_context(napi_env env);
37+
38+
NAPI_EXTERN JSRuntime* NAPI_CDECL qjs_get_runtime(napi_env env);
39+
40+
NAPI_EXTERN napi_status NAPI_CDECL qjs_create_scoped_value(napi_env env,
41+
JSValue value,
42+
napi_value* result);
43+
3344
EXTERN_C_END
3445

35-
#endif //TEST_APP_QUICKS_RUNTIME_H
46+
#endif // TEST_APP_QUICKS_RUNTIME_H

NativeScript/napi/quickjs/source/quickjs.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33614,7 +33614,8 @@ static JSValue __JS_EvalInternal(JSContext *ctx, JSValue this_obj,
3361433614
/* Could add a flag to avoid resolution if necessary */
3361533615
if (m) {
3361633616
m->func_obj = fun_obj;
33617-
if (js_resolve_module(ctx, m) < 0)
33617+
if (!(flags & JS_EVAL_FLAG_COMPILE_ONLY_NO_RESOLVE) &&
33618+
js_resolve_module(ctx, m) < 0)
3361833619
goto fail1;
3361933620
fun_obj = JS_NewModuleValue(ctx, m);
3362033621
}

NativeScript/napi/quickjs/source/quickjs.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,8 @@ static inline bool JS_VALUE_IS_NAN(JSValue v)
312312
JS_TAG_FUNCTION_BYTECODE or JS_TAG_MODULE tag. It can be executed
313313
with JS_EvalFunction(). */
314314
#define JS_EVAL_FLAG_COMPILE_ONLY (1 << 5)
315+
/* compile a module without resolving its imports yet */
316+
#define JS_EVAL_FLAG_COMPILE_ONLY_NO_RESOLVE JS_EVAL_FLAG_UNUSED
315317
/* don't include the stack frames before this eval in the Error() backtraces */
316318
#define JS_EVAL_FLAG_BACKTRACE_BARRIER (1 << 6)
317319
/* allow top-level await in normal script. JS_Eval() returns a

NativeScript/runtime/modules/node/Node.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,12 @@
33
#include "FS.h"
44
#include "Path.h"
55
#include "Process.h"
6+
#include "VM.h"
67
#include "native_api_util.h"
78

89
namespace nativescript {
910

10-
void Node::Init(napi_env env, napi_value global) {
11-
Process::Init(env, global);
12-
}
11+
void Node::Init(napi_env env, napi_value global) { Process::Init(env, global); }
1312

1413
napi_value Node::LoadInternalModule(napi_env env,
1514
const std::string& moduleName) {
@@ -25,6 +24,10 @@ napi_value Node::LoadInternalModule(napi_env env,
2524
return Process::CreateModule(env);
2625
}
2726

27+
if (moduleName == "vm" || moduleName == "node:vm") {
28+
return VM::CreateModule(env);
29+
}
30+
2831
if (moduleName == "fs/promises" || moduleName == "node:fs/promises") {
2932
napi_value fsModule = FS::CreateModule(env);
3033
if (napi_util::is_null_or_undefined(env, fsModule)) {

0 commit comments

Comments
 (0)