Files
dusk/src/dusk/script/scriptmanager.c
T
2026-05-03 21:52:12 -05:00

118 lines
2.8 KiB
C

/**
* 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();
}