From 5c84278667eb022c48f9e0940ae2016e6285ef41 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sat, 14 May 2022 19:26:07 -0700 Subject: [PATCH] Scripting: Start exporting some constants --- include/mgba/script/context.h | 10 ++++++++++ src/script/context.c | 24 +++++++++++++++++++----- src/script/stdlib.c | 20 ++++++++++++++++++++ 3 files changed, 49 insertions(+), 5 deletions(-) diff --git a/include/mgba/script/context.h b/include/mgba/script/context.h index 8104295d7..74385c291 100644 --- a/include/mgba/script/context.h +++ b/include/mgba/script/context.h @@ -14,6 +14,9 @@ CXX_GUARD_START #include #include +#define mSCRIPT_CONSTANT_PAIR(NS, CONST) { #CONST, mScriptValueCreateFromSInt(NS ## _ ## CONST) } +#define mSCRIPT_CONSTANT_SENTINEL { NULL, NULL } + struct mScriptFrame; struct mScriptFunction; struct mScriptEngineContext; @@ -25,6 +28,7 @@ struct mScriptContext { struct Table weakrefs; uint32_t nextWeakref; struct Table callbacks; + struct mScriptValue* constants; }; struct mScriptEngine2 { @@ -50,6 +54,11 @@ struct mScriptEngineContext { const char* (*getError)(struct mScriptEngineContext*); }; +struct mScriptKVPair { + const char* key; + struct mScriptValue* value; +}; + void mScriptContextInit(struct mScriptContext*); void mScriptContextDeinit(struct mScriptContext*); @@ -70,6 +79,7 @@ struct mScriptValue* mScriptContextAccessWeakref(struct mScriptContext*, struct void mScriptContextClearWeakref(struct mScriptContext*, uint32_t weakref); void mScriptContextAttachStdlib(struct mScriptContext* context); +void mScriptContextExportConstants(struct mScriptContext* context, const char* nspace, struct mScriptKVPair* constants); void mScriptContextTriggerCallback(struct mScriptContext*, const char* callback); void mScriptContextAddCallback(struct mScriptContext*, const char* callback, struct mScriptValue* value); diff --git a/src/script/context.c b/src/script/context.c index 2ee2dead0..b3ec04ffd 100644 --- a/src/script/context.c +++ b/src/script/context.c @@ -8,11 +8,6 @@ #include #endif -struct mScriptKVPair { - const char* key; - struct mScriptValue* value; -}; - struct mScriptFileInfo { const char* name; struct VFile* vf; @@ -61,6 +56,7 @@ void mScriptContextInit(struct mScriptContext* context) { TableInit(&context->weakrefs, 0, (void (*)(void*)) mScriptValueDeref); context->nextWeakref = 1; HashTableInit(&context->callbacks, 0, (void (*)(void*)) mScriptValueDeref); + context->constants = NULL; } void mScriptContextDeinit(struct mScriptContext* context) { @@ -223,6 +219,24 @@ void mScriptContextAddCallback(struct mScriptContext* context, const char* callb mScriptValueWrap(fn, mScriptListAppend(list->value.opaque)); } +void mScriptContextExportConstants(struct mScriptContext* context, const char* nspace, struct mScriptKVPair* constants) { + if (!context->constants) { + context->constants = mScriptValueAlloc(mSCRIPT_TYPE_MS_TABLE); + } + struct mScriptValue* table = mScriptValueAlloc(mSCRIPT_TYPE_MS_TABLE); + size_t i; + for (i = 0; constants[i].key; ++i) { + struct mScriptValue* key = mScriptStringCreateFromUTF8(constants[i].key); + mScriptTableInsert(table, key, constants[i].value); + mScriptValueDeref(key); + mScriptValueDeref(constants[i].value); + } + struct mScriptValue* key = mScriptStringCreateFromUTF8(nspace); + mScriptTableInsert(context->constants, key, table); + mScriptValueDeref(key); + mScriptValueDeref(table); +} + bool mScriptContextLoadVF(struct mScriptContext* context, const char* name, struct VFile* vf) { struct mScriptFileInfo info = { .name = name, diff --git a/src/script/stdlib.c b/src/script/stdlib.c index 08871fb49..78d57deb8 100644 --- a/src/script/stdlib.c +++ b/src/script/stdlib.c @@ -5,6 +5,9 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include +#include +#include + struct mScriptCallbackAdapter { struct mScriptContext* context; }; @@ -34,4 +37,21 @@ void mScriptContextAttachStdlib(struct mScriptContext* context) { }; lib->flags = mSCRIPT_VALUE_FLAG_FREE_BUFFER; mScriptContextSetGlobal(context, "callbacks", lib); + + mScriptContextExportConstants(context, "SAVESTATE", (struct mScriptKVPair[]) { + mSCRIPT_CONSTANT_PAIR(SAVESTATE, SCREENSHOT), + mSCRIPT_CONSTANT_PAIR(SAVESTATE, SAVEDATA), + mSCRIPT_CONSTANT_PAIR(SAVESTATE, CHEATS), + mSCRIPT_CONSTANT_PAIR(SAVESTATE, RTC), + mSCRIPT_CONSTANT_PAIR(SAVESTATE, METADATA), + mSCRIPT_CONSTANT_PAIR(SAVESTATE, ALL), + mSCRIPT_CONSTANT_SENTINEL + }); + mScriptContextExportConstants(context, "PLATFORM", (struct mScriptKVPair[]) { + mSCRIPT_CONSTANT_PAIR(mPLATFORM, NONE), + mSCRIPT_CONSTANT_PAIR(mPLATFORM, GBA), + mSCRIPT_CONSTANT_PAIR(mPLATFORM, GB), + mSCRIPT_CONSTANT_SENTINEL + }); + mScriptContextSetGlobal(context, "C", context->constants); }