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 = { const platformNames = {
[System.PLATFORM_LINUX]: 'Linux', [System.PLATFORM_LINUX]: 'Linux',
[System.PLATFORM_KNULLI]: 'Knulli', [System.PLATFORM_KNULLI]: 'Knulli',
@@ -8,13 +6,4 @@ const platformNames = {
[System.PLATFORM_WII]: 'Wii', [System.PLATFORM_WII]: 'Wii',
}; };
Console.print('Platform: ' + (platformNames[System.platform] || 'Unknown')); 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();
+14 -2
View File
@@ -22,8 +22,20 @@ errorret_t inputInit(void) {
INPUT.actions[i].action = (inputaction_t)i; INPUT.actions[i].action = (inputaction_t)i;
INPUT.actions[i].lastValue = 0.0f; INPUT.actions[i].lastValue = 0.0f;
INPUT.actions[i].currentValue = 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 #ifdef inputInitPlatform
+6 -4
View File
@@ -10,6 +10,8 @@
#include "input/inputactiondefs.h" #include "input/inputactiondefs.h"
#include "event/event.h" #include "event/event.h"
#define INPUT_ACTION_CALLBACK_COUNT_MAX 4
typedef struct { typedef struct {
inputaction_t action; inputaction_t action;
float_t lastValue; float_t lastValue;
@@ -20,11 +22,11 @@ typedef struct {
float_t currentDynamicValue; float_t currentDynamicValue;
#endif #endif
eventcallback_t onPressedCallbacks[4]; eventcallback_t onPressedCallbacks[INPUT_ACTION_CALLBACK_COUNT_MAX];
void *onPressedUsers[4]; void *onPressedUsers[INPUT_ACTION_CALLBACK_COUNT_MAX];
event_t onPressed; event_t onPressed;
eventcallback_t onReleasedCallbacks[4]; eventcallback_t onReleasedCallbacks[INPUT_ACTION_CALLBACK_COUNT_MAX];
void *onReleasedUsers[4]; void *onReleasedUsers[INPUT_ACTION_CALLBACK_COUNT_MAX];
event_t onReleased; event_t onReleased;
} inputactiondata_t; } inputactiondata_t;
+53 -32
View File
@@ -6,56 +6,58 @@
*/ */
#include "modulerequire.h" #include "modulerequire.h"
#include "asset/asset.h"
#include "util/memory.h" #include "util/memory.h"
#include "util/string.h" #include "util/string.h"
#include "assert/assert.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 { void moduleRequireAsyncOnLoaded(void *params, void *user) {
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) {
assetentry_t *entry = (assetentry_t *)params; assetentry_t *entry = (assetentry_t *)params;
(void)user;
eventUnsubscribe(&entry->onLoaded, moduleRequireAsyncOnLoaded); eventUnsubscribe(&entry->onLoaded, moduleRequireAsyncOnLoaded);
eventUnsubscribe(&entry->onError, moduleRequireAsyncOnError); eventUnsubscribe(&entry->onError, moduleRequireAsyncOnError);
jerry_value_t exports = jerry_value_is_undefined(entry->data.script.exports) jerry_value_t exports = (
? jerry_undefined() jerry_value_is_undefined(entry->data.script.exports) ?
: jerry_value_copy(entry->data.script.exports); jerry_undefined() :
jerry_value_copy(entry->data.script.exports)
);
uint32_t i = 0; uint32_t i = 0;
while(i < MODULE_REQUIRE_ASYNC_PENDING_COUNT) { 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); assetUnlockEntry(entry);
jerry_value_t copy = jerry_value_copy(exports); 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(ret);
jerry_value_free(copy); jerry_value_free(copy);
jerry_value_free(MODULE_REQUIRE_ASYNC_PENDING[i].promise); jerry_value_free(MODULE_REQUIRE_ASYNC_PENDING[i].promise);
MODULE_REQUIRE_ASYNC_PENDING_COUNT--; MODULE_REQUIRE_ASYNC_PENDING_COUNT--;
if(i < 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); jerry_value_free(exports);
} }
static void moduleRequireAsyncOnError(void *params, void *user) { void moduleRequireAsyncOnError(void *params, void *user) {
assetentry_t *entry = (assetentry_t *)params; assetentry_t *entry = (assetentry_t *)params;
(void)user;
eventUnsubscribe(&entry->onLoaded, moduleRequireAsyncOnLoaded); eventUnsubscribe(&entry->onLoaded, moduleRequireAsyncOnLoaded);
eventUnsubscribe(&entry->onError, moduleRequireAsyncOnError); eventUnsubscribe(&entry->onError, moduleRequireAsyncOnError);
@@ -66,14 +68,20 @@ static void moduleRequireAsyncOnError(void *params, void *user) {
while(i < MODULE_REQUIRE_ASYNC_PENDING_COUNT) { 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); assetUnlockEntry(entry);
jerry_value_t copy = jerry_value_copy(errStr); 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(ret);
jerry_value_free(copy); jerry_value_free(copy);
jerry_value_free(MODULE_REQUIRE_ASYNC_PENDING[i].promise); jerry_value_free(MODULE_REQUIRE_ASYNC_PENDING[i].promise);
MODULE_REQUIRE_ASYNC_PENDING_COUNT--; MODULE_REQUIRE_ASYNC_PENDING_COUNT--;
if(i < 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. // Already loaded — resolve immediately.
if(entry->state == ASSET_ENTRY_STATE_LOADED) { if(entry->state == ASSET_ENTRY_STATE_LOADED) {
jerry_value_t exports = jerry_value_is_undefined(entry->data.script.exports) jerry_value_t exports = (
? jerry_undefined() jerry_value_is_undefined(entry->data.script.exports) ?
: jerry_value_copy(entry->data.script.exports); jerry_undefined() :
jerry_value_copy(entry->data.script.exports)
);
assetUnlockEntry(entry); assetUnlockEntry(entry);
jerry_value_t ret = jerry_promise_resolve(promise, exports); jerry_value_t ret = jerry_promise_resolve(promise, exports);
jerry_value_free(ret); 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. // Subscribe to entry events only if this is the first pending await for it.
bool_t subscribed = false; bool_t subscribed = false;
for(uint32_t i = 0; i < MODULE_REQUIRE_ASYNC_PENDING_COUNT; i++) { 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(!subscribed) {
if(entry->onLoaded.count >= entry->onLoaded.size) { if(entry->onLoaded.count >= entry->onLoaded.size) {
assetUnlockEntry(entry); assetUnlockEntry(entry);
@@ -187,8 +201,12 @@ jerry_value_t moduleRequireAsyncFunc(
eventSubscribe(&entry->onError, moduleRequireAsyncOnError, NULL); 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].entry = (
MODULE_REQUIRE_ASYNC_PENDING[MODULE_REQUIRE_ASYNC_PENDING_COUNT].promise = jerry_value_copy(promise); entry
);
MODULE_REQUIRE_ASYNC_PENDING[MODULE_REQUIRE_ASYNC_PENDING_COUNT].promise = (
jerry_value_copy(promise)
);
MODULE_REQUIRE_ASYNC_PENDING_COUNT++; MODULE_REQUIRE_ASYNC_PENDING_COUNT++;
return promise; return promise;
} }
@@ -204,7 +222,10 @@ void moduleRequireDispose(void) {
assetentry_t *entry = MODULE_REQUIRE_ASYNC_PENDING[i].entry; assetentry_t *entry = MODULE_REQUIRE_ASYNC_PENDING[i].entry;
bool_t alreadyUnsub = false; bool_t alreadyUnsub = false;
for(uint32_t j = 0; j < i; j++) { 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) { if(!alreadyUnsub) {
eventUnsubscribe(&entry->onLoaded, moduleRequireAsyncOnLoaded); eventUnsubscribe(&entry->onLoaded, moduleRequireAsyncOnLoaded);
@@ -7,6 +7,64 @@
#pragma once #pragma once
#include "script/module/modulebase.h" #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. * Initializes the require module.