From 7012418b139d835f3196fd4d934036f61b68bc4b Mon Sep 17 00:00:00 2001 From: Cory McWilliams Date: Mon, 11 Jan 2021 02:09:19 +0000 Subject: [PATCH] Support requiring adjacent files from the same app. git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3636 ed5197a5-7fde-0310-b194-c3ffbd925b24 --- src/task.c | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/src/task.c b/src/task.c index 17171df2..8d40f11b 100644 --- a/src/task.c +++ b/src/task.c @@ -129,7 +129,7 @@ static JSValue _tf_task_utf8Decode(JSContext* context, JSValueConst this_val, in static JSValue _tf_task_get_parent(JSContext* context, JSValueConst this_val, int argc, JSValueConst* argv); static JSValue _tf_task_print(JSContext* context, JSValueConst this_val, int argc, JSValueConst* argv); static JSValue _tf_task_exit(JSContext* context, JSValueConst this_val, int argc, JSValueConst* argv); -static JSValue _tf_task_childRequire(JSContext* context, JSValueConst this_val, int argc, JSValueConst* argv); +static JSValue _tf_task_sandbox_require(JSContext* context, JSValueConst this_val, int argc, JSValueConst* argv); static JSValue _tf_task_trace(JSContext* context, JSValueConst this_val, int argc, JSValueConst* argv); static JSValue _tf_task_getFile(JSContext* context, JSValueConst this_val, int argc, JSValueConst* argv); @@ -909,10 +909,10 @@ static JSValue _tf_task_executeSource(tf_task_t* task, const char* source, const return result; } -JSValue _tf_task_childRequire(JSContext* context, JSValueConst this_val, int argc, JSValueConst* argv) { +JSValue _tf_task_sandbox_require(JSContext* context, JSValueConst this_val, int argc, JSValueConst* argv) { tf_task_t* task = JS_GetContextOpaque(context); - if (JS_IsObject(task->_requires)) { + if (JS_IsObject(task->_loadedFiles)) { const char* name = JS_ToCString(context, argv[0]); script_export_t* it = _task_find_script_export(task, name); if (it) { @@ -920,8 +920,24 @@ JSValue _tf_task_childRequire(JSContext* context, JSValueConst this_val, int arg } else { JSValue exports = JS_NewObject(context); const char* name = JS_ToCString(context, argv[0]); - JSValue value = JS_GetProperty(context, task->_requires, JS_ValueToAtom(context, argv[0])); - if (JS_IsString(value)) { + JSValue value = JS_GetPropertyStr(context, task->_loadedFiles, name); + size_t length; + uint8_t* array = tf_try_get_array_buffer(context, &length, value); + if (array) { + char* source = malloc(length + 1); + memcpy(source, array, length); + source[length] = '\0'; + JSValue global = JS_GetGlobalObject(context); + JSValue oldExports = JS_GetPropertyStr(context, global, "exports"); + JS_SetPropertyStr(context, global, "exports", JS_DupValue(context, exports)); + JSValue result = JS_Eval(context, source, length, name, 0); + tf_task_report_error(task, result); + JS_SetPropertyStr(context, global, "exports", oldExports); + JS_FreeValue(context, global); + tf_task_run_jobs(task); + free(source); + return exports; + } else if (JS_IsString(value)) { size_t length; const char* source = JS_ToCStringLen(context, &length, value); JSValue global = JS_GetGlobalObject(context); @@ -934,7 +950,7 @@ JSValue _tf_task_childRequire(JSContext* context, JSValueConst this_val, int arg tf_task_run_jobs(task); return exports; } else { - return JS_ThrowInternalError(context, "Failed to load %s.", name); + return JS_ThrowInternalError(context, "Failed to load %s %d %d %d.", name, JS_IsNull(value), JS_IsUndefined(value), JS_IsException(value)); } } } @@ -1180,7 +1196,7 @@ void tf_task_activate(tf_task_t* task) JS_SetPropertyStr(context, global, "trace", JS_NewCFunction(context, _tf_task_trace, "trace", 1)); } else { - JS_SetPropertyStr(context, global, "require", JS_NewCFunction(context, _tf_task_childRequire, "childRequire", 0)); + JS_SetPropertyStr(context, global, "require", JS_NewCFunction(context, _tf_task_sandbox_require, "sandboxRequire", 0)); } tf_bcrypt_init(context);