118 lines
2.8 KiB
C
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();
|
|
}
|