private static JSModuleDef _NewModuleDef(JSContext ctx, JSValue func_val, string module_name) { var mod = new JSModuleDef(func_val.u.ptr); var meta = JSApi.JS_GetImportMeta(ctx, mod); JSApi.JS_DefinePropertyValueStr(ctx, meta, "url", JSApi.JS_NewString(ctx, $"file://{module_name}"), JSPropFlags.JS_PROP_C_W_E); JSApi.JS_DefinePropertyValueStr(ctx, meta, "main", JSApi.JS_NewBool(ctx, false), JSPropFlags.JS_PROP_C_W_E); JSApi.JS_FreeValue(ctx, meta); return(mod); }
public static unsafe JSModuleDef module_loader(JSContext ctx, string module_name, IntPtr opaque) { // Debug.LogFormat("module_loader: {0}", module_name); var mod = JSModuleDef.Null; var runtime = ScriptEngine.GetRuntime(ctx); var fileSystem = runtime._fileSystem; if (fileSystem.Exists(module_name)) { var source = fileSystem.ReadAllBytes(module_name); var input_bytes = TextUtils.GetNullTerminatedBytes(source); var fn_bytes = TextUtils.GetNullTerminatedBytes(module_name); fixed(byte *input_ptr = input_bytes) fixed(byte *fn_ptr = fn_bytes) { var input_len = (size_t)(input_bytes.Length - 1); var func_val = JSApi.JS_Eval(ctx, input_ptr, input_len, fn_ptr, JSEvalFlags.JS_EVAL_TYPE_MODULE | JSEvalFlags.JS_EVAL_FLAG_COMPILE_ONLY); if (JSApi.JS_IsException(func_val)) { ctx.print_exception(); JSApi.JS_ThrowReferenceError(ctx, "module error"); } else if (func_val.IsNullish()) { JSApi.JS_ThrowReferenceError(ctx, "module is null"); } else { mod = new JSModuleDef(func_val.u.ptr); var meta = JSApi.JS_GetImportMeta(ctx, mod); JSApi.JS_DefinePropertyValueStr(ctx, meta, "url", JSApi.JS_NewString(ctx, $"file://{module_name}"), JSPropFlags.JS_PROP_C_W_E); JSApi.JS_DefinePropertyValueStr(ctx, meta, "main", JSApi.JS_NewBool(ctx, false), JSPropFlags.JS_PROP_C_W_E); JSApi.JS_FreeValue(ctx, meta); } } } else { JSApi.JS_ThrowReferenceError(ctx, "module load failed: file not found"); } return(mod); }