mirror of https://github.com/mgba-emu/mgba.git
Scripting: Start bringing up execution contexts
This commit is contained in:
parent
2a81e5a1ba
commit
c507157ab8
|
@ -0,0 +1,56 @@
|
||||||
|
/* Copyright (c) 2013-2022 Jeffrey Pfau
|
||||||
|
*
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
#ifndef M_SCRIPT_CONTEXT_H
|
||||||
|
#define M_SCRIPT_CONTEXT_H
|
||||||
|
|
||||||
|
#include <mgba-util/common.h>
|
||||||
|
|
||||||
|
CXX_GUARD_START
|
||||||
|
|
||||||
|
#include <mgba/script/types.h>
|
||||||
|
#include <mgba-util/table.h>
|
||||||
|
#include <mgba-util/vfs.h>
|
||||||
|
|
||||||
|
struct mScriptFrame;
|
||||||
|
struct mScriptFunction;
|
||||||
|
struct mScriptEngineContext;
|
||||||
|
|
||||||
|
struct mScriptContext {
|
||||||
|
struct mScriptValue rootScope;
|
||||||
|
struct Table engines;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct mScriptEngine2 {
|
||||||
|
const char* name;
|
||||||
|
|
||||||
|
void (*init)(struct mScriptEngine2*);
|
||||||
|
void (*deinit)(struct mScriptEngine2*);
|
||||||
|
|
||||||
|
struct mScriptEngineContext* (*create)(struct mScriptEngine2*, struct mScriptContext*);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct mScriptEngineContext {
|
||||||
|
struct mScriptContext* context;
|
||||||
|
void (*destroy)(struct mScriptEngineContext*);
|
||||||
|
|
||||||
|
bool (*setGlobal)(struct mScriptEngineContext*, const char* name, struct mScriptValue*);
|
||||||
|
struct mScriptValue* (*getGlobal)(struct mScriptEngineContext*, const char* name);
|
||||||
|
|
||||||
|
bool (*load)(struct mScriptEngineContext*, struct VFile*, const char** error);
|
||||||
|
bool (*run)(struct mScriptEngineContext*);
|
||||||
|
};
|
||||||
|
|
||||||
|
void mScriptContextInit(struct mScriptContext*);
|
||||||
|
void mScriptContextDeinit(struct mScriptContext*);
|
||||||
|
|
||||||
|
void mScriptContextRegisterEngine(struct mScriptContext*, struct mScriptEngine2*);
|
||||||
|
|
||||||
|
void mScriptContextAddGlobal(struct mScriptContext*, const char* key, struct mScriptValue* value);
|
||||||
|
void mScriptContextRemoveGlobal(struct mScriptContext*, const char* key);
|
||||||
|
|
||||||
|
bool mScriptInvoke(const struct mScriptFunction* fn, struct mScriptFrame* frame);
|
||||||
|
|
||||||
|
#endif
|
|
@ -131,7 +131,8 @@ CXX_GUARD_START
|
||||||
}
|
}
|
||||||
|
|
||||||
#define mSCRIPT_BIND_FUNCTION(NAME, RETURN, FUNCTION, NPARAMS, ...) \
|
#define mSCRIPT_BIND_FUNCTION(NAME, RETURN, FUNCTION, NPARAMS, ...) \
|
||||||
static bool _binding_ ## NAME(struct mScriptFrame* frame) { \
|
static bool _binding_ ## NAME(struct mScriptFrame* frame, void* ctx) { \
|
||||||
|
UNUSED(ctx); \
|
||||||
mSCRIPT_POP_ ## NPARAMS(&frame->arguments, __VA_ARGS__); \
|
mSCRIPT_POP_ ## NPARAMS(&frame->arguments, __VA_ARGS__); \
|
||||||
if (mScriptListSize(&frame->arguments)) { \
|
if (mScriptListSize(&frame->arguments)) { \
|
||||||
return false; \
|
return false; \
|
||||||
|
@ -154,7 +155,8 @@ CXX_GUARD_START
|
||||||
};
|
};
|
||||||
|
|
||||||
#define mSCRIPT_BIND_VOID_FUNCTION(NAME, FUNCTION, NPARAMS, ...) \
|
#define mSCRIPT_BIND_VOID_FUNCTION(NAME, FUNCTION, NPARAMS, ...) \
|
||||||
static bool _binding_ ## NAME(struct mScriptFrame* frame) { \
|
static bool _binding_ ## NAME(struct mScriptFrame* frame, void* ctx) { \
|
||||||
|
UNUSED(ctx); \
|
||||||
mSCRIPT_POP_ ## NPARAMS(&frame->arguments, __VA_ARGS__); \
|
mSCRIPT_POP_ ## NPARAMS(&frame->arguments, __VA_ARGS__); \
|
||||||
if (mScriptListSize(&frame->arguments)) { \
|
if (mScriptListSize(&frame->arguments)) { \
|
||||||
return false; \
|
return false; \
|
||||||
|
@ -276,7 +278,7 @@ struct mScriptFrame {
|
||||||
|
|
||||||
struct mScriptFunction {
|
struct mScriptFunction {
|
||||||
struct mScriptTypeFunction signature;
|
struct mScriptTypeFunction signature;
|
||||||
bool (*call)(struct mScriptFrame*);
|
bool (*call)(struct mScriptFrame*, void* context);
|
||||||
void* context;
|
void* context;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -303,6 +305,5 @@ bool mScriptPopPointer(struct mScriptList* list, void** out);
|
||||||
|
|
||||||
bool mScriptCast(const struct mScriptType* type, const struct mScriptValue* input, struct mScriptValue* output);
|
bool mScriptCast(const struct mScriptType* type, const struct mScriptValue* input, struct mScriptValue* output);
|
||||||
bool mScriptCoerceFrame(const struct mScriptTypeTuple* types, struct mScriptList* frame);
|
bool mScriptCoerceFrame(const struct mScriptTypeTuple* types, struct mScriptList* frame);
|
||||||
bool mScriptInvoke(const struct mScriptFunction* fn, struct mScriptFrame* frame);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
include(ExportDirectory)
|
include(ExportDirectory)
|
||||||
set(SOURCE_FILES
|
set(SOURCE_FILES
|
||||||
|
context.c
|
||||||
types.c)
|
types.c)
|
||||||
|
|
||||||
set(TEST_FILES
|
set(TEST_FILES
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
/* Copyright (c) 2013-2022 Jeffrey Pfau
|
||||||
|
*
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
#include <mgba/script/context.h>
|
||||||
|
|
||||||
|
void mScriptContextInit(struct mScriptContext* context) {
|
||||||
|
// TODO: rootScope
|
||||||
|
HashTableInit(&context->engines, 0, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void mScriptContextDeinit(struct mScriptContext* context) {
|
||||||
|
HashTableDeinit(&context->engines);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool mScriptInvoke(const struct mScriptFunction* fn, struct mScriptFrame* frame) {
|
||||||
|
if (!mScriptCoerceFrame(&fn->signature.parameters, &frame->arguments)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return fn->call(frame, fn->context);
|
||||||
|
}
|
|
@ -5,6 +5,7 @@
|
||||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
#include "util/test/suite.h"
|
#include "util/test/suite.h"
|
||||||
|
|
||||||
|
#include <mgba/script/context.h>
|
||||||
#include <mgba/script/types.h>
|
#include <mgba/script/types.h>
|
||||||
|
|
||||||
struct Test {
|
struct Test {
|
||||||
|
|
|
@ -723,10 +723,3 @@ bool mScriptCoerceFrame(const struct mScriptTypeTuple* types, struct mScriptList
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool mScriptInvoke(const struct mScriptFunction* fn, struct mScriptFrame* frame) {
|
|
||||||
if (!mScriptCoerceFrame(&fn->signature.parameters, &frame->arguments)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return fn->call(frame);
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in New Issue