Cleanup a bit.

This commit is contained in:
2026-06-06 16:39:27 -05:00
parent 81024c4c09
commit 79054080c0
5 changed files with 132 additions and 50 deletions
+1 -12
View File
@@ -1,5 +1,3 @@
const platformNames = {
[System.PLATFORM_LINUX]: 'Linux',
[System.PLATFORM_KNULLI]: 'Knulli',
@@ -8,13 +6,4 @@ const platformNames = {
[System.PLATFORM_WII]: 'Wii',
};
Console.print('Platform: ' + (platformNames[System.platform] || 'Unknown'));
async function testRequireAsync() {
Console.print('Loading testscene.js...');
const scene = await requireAsync('testscene.js');
Console.print('Loaded!');
Console.print(scene.test());
}
testRequireAsync();
Console.print('Platform: ' + (platformNames[System.platform] || 'Unknown'));
+14 -2
View File
@@ -22,8 +22,20 @@ errorret_t inputInit(void) {
INPUT.actions[i].action = (inputaction_t)i;
INPUT.actions[i].lastValue = 0.0f;
INPUT.actions[i].currentValue = 0.0f;
eventInit(&INPUT.actions[i].onPressed, INPUT.actions[i].onPressedCallbacks, INPUT.actions[i].onPressedUsers, 4);
eventInit(&INPUT.actions[i].onReleased, INPUT.actions[i].onReleasedCallbacks, INPUT.actions[i].onReleasedUsers, 4);
eventInit(
&INPUT.actions[i].onPressed,
INPUT.actions[i].onPressedCallbacks,
INPUT.actions[i].onPressedUsers,
INPUT_ACTION_CALLBACK_COUNT_MAX
);
eventInit(
&INPUT.actions[i].onReleased,
INPUT.actions[i].onReleasedCallbacks,
INPUT.actions[i].onReleasedUsers,
INPUT_ACTION_CALLBACK_COUNT_MAX
);
}
#ifdef inputInitPlatform
+6 -4
View File
@@ -10,6 +10,8 @@
#include "input/inputactiondefs.h"
#include "event/event.h"
#define INPUT_ACTION_CALLBACK_COUNT_MAX 4
typedef struct {
inputaction_t action;
float_t lastValue;
@@ -20,11 +22,11 @@ typedef struct {
float_t currentDynamicValue;
#endif
eventcallback_t onPressedCallbacks[4];
void *onPressedUsers[4];
eventcallback_t onPressedCallbacks[INPUT_ACTION_CALLBACK_COUNT_MAX];
void *onPressedUsers[INPUT_ACTION_CALLBACK_COUNT_MAX];
event_t onPressed;
eventcallback_t onReleasedCallbacks[4];
void *onReleasedUsers[4];
eventcallback_t onReleasedCallbacks[INPUT_ACTION_CALLBACK_COUNT_MAX];
void *onReleasedUsers[INPUT_ACTION_CALLBACK_COUNT_MAX];
event_t onReleased;
} inputactiondata_t;
+53 -32
View File
@@ -6,56 +6,58 @@
*/
#include "modulerequire.h"
#include "asset/asset.h"
#include "util/memory.h"
#include "util/string.h"
#include "assert/assert.h"
#define MODULE_REQUIRE_ASYNC_MAX 16
modulerequireasyncpending_t MODULE_REQUIRE_ASYNC_PENDING[
MODULE_REQUIRE_ASYNC_MAX
];
uint32_t MODULE_REQUIRE_ASYNC_PENDING_COUNT = 0;
typedef struct {
assetentry_t *entry;
jerry_value_t promise;
} modulerequireasyncpending_t;
static modulerequireasyncpending_t MODULE_REQUIRE_ASYNC_PENDING[MODULE_REQUIRE_ASYNC_MAX];
static uint32_t MODULE_REQUIRE_ASYNC_PENDING_COUNT = 0;
/* Resolves or rejects every promise associated with entry, then unsubscribes. */
static void moduleRequireAsyncOnError(void *params, void *user);
static void moduleRequireAsyncOnLoaded(void *params, void *user) {
void moduleRequireAsyncOnLoaded(void *params, void *user) {
assetentry_t *entry = (assetentry_t *)params;
(void)user;
eventUnsubscribe(&entry->onLoaded, moduleRequireAsyncOnLoaded);
eventUnsubscribe(&entry->onError, moduleRequireAsyncOnError);
jerry_value_t exports = jerry_value_is_undefined(entry->data.script.exports)
? jerry_undefined()
: jerry_value_copy(entry->data.script.exports);
jerry_value_t exports = (
jerry_value_is_undefined(entry->data.script.exports) ?
jerry_undefined() :
jerry_value_copy(entry->data.script.exports)
);
uint32_t i = 0;
while(i < MODULE_REQUIRE_ASYNC_PENDING_COUNT) {
if(MODULE_REQUIRE_ASYNC_PENDING[i].entry != entry) { i++; continue; }
if(MODULE_REQUIRE_ASYNC_PENDING[i].entry != entry) {
i++;
continue;
}
assetUnlockEntry(entry);
jerry_value_t copy = jerry_value_copy(exports);
jerry_value_t ret = jerry_promise_resolve(MODULE_REQUIRE_ASYNC_PENDING[i].promise, copy);
jerry_value_t ret = jerry_promise_resolve(
MODULE_REQUIRE_ASYNC_PENDING[i].promise, copy
);
jerry_value_free(ret);
jerry_value_free(copy);
jerry_value_free(MODULE_REQUIRE_ASYNC_PENDING[i].promise);
MODULE_REQUIRE_ASYNC_PENDING_COUNT--;
if(i < MODULE_REQUIRE_ASYNC_PENDING_COUNT) {
MODULE_REQUIRE_ASYNC_PENDING[i] = MODULE_REQUIRE_ASYNC_PENDING[MODULE_REQUIRE_ASYNC_PENDING_COUNT];
MODULE_REQUIRE_ASYNC_PENDING[i] = (
MODULE_REQUIRE_ASYNC_PENDING[MODULE_REQUIRE_ASYNC_PENDING_COUNT]
);
}
}
jerry_value_free(exports);
}
static void moduleRequireAsyncOnError(void *params, void *user) {
void moduleRequireAsyncOnError(void *params, void *user) {
assetentry_t *entry = (assetentry_t *)params;
(void)user;
eventUnsubscribe(&entry->onLoaded, moduleRequireAsyncOnLoaded);
eventUnsubscribe(&entry->onError, moduleRequireAsyncOnError);
@@ -66,14 +68,20 @@ static void moduleRequireAsyncOnError(void *params, void *user) {
while(i < MODULE_REQUIRE_ASYNC_PENDING_COUNT) {
if(MODULE_REQUIRE_ASYNC_PENDING[i].entry != entry) { i++; continue; }
assetUnlockEntry(entry);
jerry_value_t copy = jerry_value_copy(errStr);
jerry_value_t ret = jerry_promise_reject(MODULE_REQUIRE_ASYNC_PENDING[i].promise, copy);
jerry_value_t ret = jerry_promise_reject(
MODULE_REQUIRE_ASYNC_PENDING[i].promise, copy
);
jerry_value_free(ret);
jerry_value_free(copy);
jerry_value_free(MODULE_REQUIRE_ASYNC_PENDING[i].promise);
MODULE_REQUIRE_ASYNC_PENDING_COUNT--;
if(i < MODULE_REQUIRE_ASYNC_PENDING_COUNT) {
MODULE_REQUIRE_ASYNC_PENDING[i] = MODULE_REQUIRE_ASYNC_PENDING[MODULE_REQUIRE_ASYNC_PENDING_COUNT];
MODULE_REQUIRE_ASYNC_PENDING[i] = (
MODULE_REQUIRE_ASYNC_PENDING[MODULE_REQUIRE_ASYNC_PENDING_COUNT]
);
}
}
@@ -147,9 +155,11 @@ jerry_value_t moduleRequireAsyncFunc(
// Already loaded — resolve immediately.
if(entry->state == ASSET_ENTRY_STATE_LOADED) {
jerry_value_t exports = jerry_value_is_undefined(entry->data.script.exports)
? jerry_undefined()
: jerry_value_copy(entry->data.script.exports);
jerry_value_t exports = (
jerry_value_is_undefined(entry->data.script.exports) ?
jerry_undefined() :
jerry_value_copy(entry->data.script.exports)
);
assetUnlockEntry(entry);
jerry_value_t ret = jerry_promise_resolve(promise, exports);
jerry_value_free(ret);
@@ -170,8 +180,12 @@ jerry_value_t moduleRequireAsyncFunc(
// Subscribe to entry events only if this is the first pending await for it.
bool_t subscribed = false;
for(uint32_t i = 0; i < MODULE_REQUIRE_ASYNC_PENDING_COUNT; i++) {
if(MODULE_REQUIRE_ASYNC_PENDING[i].entry == entry) { subscribed = true; break; }
if(MODULE_REQUIRE_ASYNC_PENDING[i].entry == entry) {
subscribed = true;
break;
}
}
if(!subscribed) {
if(entry->onLoaded.count >= entry->onLoaded.size) {
assetUnlockEntry(entry);
@@ -187,8 +201,12 @@ jerry_value_t moduleRequireAsyncFunc(
eventSubscribe(&entry->onError, moduleRequireAsyncOnError, NULL);
}
MODULE_REQUIRE_ASYNC_PENDING[MODULE_REQUIRE_ASYNC_PENDING_COUNT].entry = entry;
MODULE_REQUIRE_ASYNC_PENDING[MODULE_REQUIRE_ASYNC_PENDING_COUNT].promise = jerry_value_copy(promise);
MODULE_REQUIRE_ASYNC_PENDING[MODULE_REQUIRE_ASYNC_PENDING_COUNT].entry = (
entry
);
MODULE_REQUIRE_ASYNC_PENDING[MODULE_REQUIRE_ASYNC_PENDING_COUNT].promise = (
jerry_value_copy(promise)
);
MODULE_REQUIRE_ASYNC_PENDING_COUNT++;
return promise;
}
@@ -204,7 +222,10 @@ void moduleRequireDispose(void) {
assetentry_t *entry = MODULE_REQUIRE_ASYNC_PENDING[i].entry;
bool_t alreadyUnsub = false;
for(uint32_t j = 0; j < i; j++) {
if(MODULE_REQUIRE_ASYNC_PENDING[j].entry == entry) { alreadyUnsub = true; break; }
if(MODULE_REQUIRE_ASYNC_PENDING[j].entry == entry) {
alreadyUnsub = true;
break;
}
}
if(!alreadyUnsub) {
eventUnsubscribe(&entry->onLoaded, moduleRequireAsyncOnLoaded);
@@ -7,6 +7,64 @@
#pragma once
#include "script/module/modulebase.h"
#include "asset/asset.h"
#define MODULE_REQUIRE_ASYNC_MAX 16
typedef struct {
assetentry_t *entry;
jerry_value_t promise;
} modulerequireasyncpending_t;
extern modulerequireasyncpending_t MODULE_REQUIRE_ASYNC_PENDING[
MODULE_REQUIRE_ASYNC_MAX
];
extern uint32_t MODULE_REQUIRE_ASYNC_PENDING_COUNT;
/**
* Success loaded callback for async module loading.
*
* @param params The asset entry that finished loading.
* @param user Unused.
*/
void moduleRequireAsyncOnLoaded(void *params, void *user);
/**
* Error callback for when an async loaded module fails.
*
* @param params The asset entry that failed to load.
* @param user Unused.
*/
void moduleRequireAsyncOnError(void *params, void *user);
/**
* Synchronous require function exposed to scripts.
*
* @param callInfo JerryScript call info.
* @param args The arguments passed to the function.
* @param argc The number of arguments passed.
* @return The exports of the required module.
*/
jerry_value_t moduleRequireFunc(
const jerry_call_info_t *callInfo,
const jerry_value_t args[],
const jerry_length_t argc
);
/**
* Asynchronous require function exposed to scripts.
*
* @param callInfo JerryScript call info.
* @param args The arguments passed to the function.
* @param argc The number of arguments passed.
* @return A promise that resolves with the exports of the required module.
*/
jerry_value_t moduleRequireAsyncFunc(
const jerry_call_info_t *callInfo,
const jerry_value_t args[],
const jerry_length_t argc
);
/**
* Initializes the require module.