/** * Copyright (c) 2026 Dominic Masters * * This software is released under the MIT License. * https://opensource.org/licenses/MIT */ #include "scriptmanager.h" #include "assert/assert.h" #include "asset/asset.h" #include "util/memory.h" #include "asset/loader/script/assetscriptloader.h" #include "script/module/module.h" #ifdef SCRIPT_GAME_INIT #include "script/scriptgame.h" #endif scriptmanager_t SCRIPT_MANAGER; const jerry_object_native_info_t JS_PTR_NATIVE_INFO = { .free_cb = NULL, .number_of_references = 0, .offset_of_references = 0 }; errorret_t scriptManagerInit(void) { memoryZero(&SCRIPT_MANAGER, sizeof(scriptmanager_t)); jerry_init(JERRY_INIT_EMPTY); moduleRegister(); #ifdef SCRIPT_GAME_INIT SCRIPT_GAME_INIT(); #endif errorOk(); } errorret_t scriptManagerExec(const char_t *script, jerry_value_t *resultOut) { assertNotNull(script, "Script cannot be NULL"); jerry_value_t result = jerry_eval( (const jerry_char_t *)script, strlen(script), JERRY_PARSE_NO_OPTS ); if(jerry_value_is_exception(result)) { jerry_value_t errVal = jerry_exception_value(result, false); jerry_value_t errStr = jerry_value_to_string(errVal); char_t buf[256]; jerry_size_t len = jerry_string_to_buffer( errStr, JERRY_ENCODING_UTF8, (jerry_char_t *)buf, sizeof(buf) - 1 ); buf[len] = '\0'; jerry_value_free(errStr); jerry_value_free(errVal); jerry_value_free(result); errorThrow("Failed to execute script: %s", buf); } if(resultOut != NULL) { *resultOut = result; } else { jerry_value_free(result); } errorOk(); } errorret_t scriptManagerExecFile( const char_t *fname, jerry_value_t *resultOut ) { assertNotNull(fname, "Filename cannot be NULL"); return assetScriptLoad(fname, resultOut); } errorret_t scriptInclude(const char_t *filename, jerry_value_t *out) { assertNotNull(filename, "Filename cannot be NULL"); jerry_value_t global = jerry_current_realm(); jerry_value_t moduleKey = jerry_string_sz("module"); jerry_value_t prevModule = jerry_object_get(global, moduleKey); jerry_value_t undef = jerry_undefined(); jerry_object_set(global, moduleKey, undef); jerry_value_free(undef); jerry_value_t execResult = 0; errorret_t err = scriptManagerExecFile(filename, &execResult); if(execResult != 0) jerry_value_free(execResult); jerry_value_t moduleVal = jerry_object_get(global, moduleKey); jerry_object_set(global, moduleKey, prevModule); jerry_value_free(prevModule); jerry_value_free(moduleKey); jerry_value_free(global); if(err.code != ERROR_OK) { jerry_value_free(moduleVal); return err; } if(out != NULL) { *out = moduleVal; } else { jerry_value_free(moduleVal); } errorOk(); } errorret_t scriptManagerDispose(void) { jerry_cleanup(); errorOk(); }