mirror of https://github.com/mode777/rayjs.git
Extend binding generation
This commit is contained in:
parent
70e23cb149
commit
c732761ae3
|
@ -2,8 +2,10 @@
|
||||||
{
|
{
|
||||||
"name": "raylib_core",
|
"name": "raylib_core",
|
||||||
"functions": [
|
"functions": [
|
||||||
{ "name": "SetWindowTitle", "jsName": "setWindowTitle" },
|
{ "name": "SetWindowTitle" },
|
||||||
{ "name": "SetWindowPosition", "jsName": "setWindowPosition" }
|
{ "name": "SetWindowPosition" },
|
||||||
|
{ "name": "BeginDrawing" },
|
||||||
|
{ "name": "EndDrawing" }
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
|
@ -46,32 +46,76 @@ const generateFunction = (functionList) => (func) => {
|
||||||
return cfunc.generate()
|
return cfunc.generate()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const generateParameterCheck = (func) => (param, i) => {
|
||||||
|
const errMsg = `${func.name} argument ${param.name} (${i}) needs to be`
|
||||||
|
switch(param.type){
|
||||||
|
case "const char *":
|
||||||
|
return `if(!JS_IsString(argv[${i}])) return JS_ThrowReferenceError(ctx, "${errMsg} a string");`
|
||||||
|
case "int":
|
||||||
|
return `if(!JS_IsNumber(argv[${i}])) return JS_ThrowReferenceError(ctx, "${errMsg} a number");`
|
||||||
|
default:
|
||||||
|
throw new Error("Unknown parameter type: "+param.type)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const generateParameter = (param,i) => {
|
const generateParameter = (param,i) => {
|
||||||
switch(param.type){
|
switch(param.type){
|
||||||
case "const char *":
|
case "const char *":
|
||||||
return `${param.type} ${param.name} = JS_ToCString(ctx, argv[${i}]);`
|
return `${param.type} ${param.name} = JS_ToCString(ctx, argv[${i}]);`
|
||||||
case "int":
|
case "int":
|
||||||
return `${param.type} ${param.name};\n JS_ToInt32(ctx, &${param.name}, argv[${i}]);`
|
return `${param.type} ${param.name}; JS_ToInt32(ctx, &${param.name}, argv[${i}]);`
|
||||||
|
default:
|
||||||
|
throw new Error("Unknown parameter type: "+param.type)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const generateParameterCleanup = (param,i) => {
|
||||||
|
switch(param.type){
|
||||||
|
case "const char *":
|
||||||
|
return `JS_FreeCString(ctx, ${param.name});`
|
||||||
|
default:
|
||||||
|
return ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class CFunction {
|
class CFunction {
|
||||||
constructor(func, api, functionList){
|
constructor(func, api, functionList){
|
||||||
this.func = func
|
this.func = func
|
||||||
|
this.func.jsName = this.func.jsName || this.func.name.charAt(0).toLowerCase() + this.func.name.slice(1);
|
||||||
this.api = api
|
this.api = api
|
||||||
|
this.api.params = this.api.params || [];
|
||||||
this.functionList = functionList
|
this.functionList = functionList
|
||||||
this.functionName = `js_${func.jsName}`
|
this.functionName = `js_${func.jsName}`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
generateParameterCheck(){
|
||||||
|
return this.api.params.map(generateParameterCheck(this.api))
|
||||||
|
}
|
||||||
|
|
||||||
generateParameters(){
|
generateParameters(){
|
||||||
return this.api.params.map(generateParameter)
|
return this.api.params.map(generateParameter)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
generateFunctionCall(){
|
||||||
|
return `${(this.api.returnType === 'void' ? '' : `${this.api.returnType} result = `)}${this.api.name}(${this.api.params.map(x => x.name).join(", ")});`
|
||||||
|
}
|
||||||
|
|
||||||
|
generateReturn(){
|
||||||
|
return this.api.returnType === 'void' ? 'return JS_UNDEFINED;' : 'return result'
|
||||||
|
}
|
||||||
|
|
||||||
|
generateParametersCleanup(){
|
||||||
|
return this.api.params.map(generateParameterCleanup).filter(x => x !== "")
|
||||||
|
}
|
||||||
|
|
||||||
generate(){
|
generate(){
|
||||||
this.functionList.addFunctionDef(this.func.jsName, this.api.params.length, this.functionName)
|
this.functionList.addFunctionDef(this.func.jsName, this.api.params.length, this.functionName)
|
||||||
return `static JSValue ${this.functionName}(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv){
|
return `static JSValue ${this.functionName}(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv){
|
||||||
${this.generateParameters().map(x => " "+x).join("\n")}
|
${this.generateParameterCheck().join("\n ")}
|
||||||
return JS_UNDEFINED;
|
${this.generateParameters().join("\n ")}
|
||||||
|
${this.generateFunctionCall()}
|
||||||
|
${this.generateParametersCleanup().join("\n ")}
|
||||||
|
${this.generateReturn()}
|
||||||
}`
|
}`
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
5
main.js
5
main.js
|
@ -1,5 +1,6 @@
|
||||||
import { setWindowTitle } from "raylib.core"
|
import { setWindowTitle, setWindowPosition } from "raylib.core"
|
||||||
|
|
||||||
console.log(setWindowTitle("Test"))
|
setWindowTitle("My Window")
|
||||||
|
setWindowPosition(50,50)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -13,21 +13,44 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static JSValue js_setWindowTitle(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv){
|
static JSValue js_setWindowTitle(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv){
|
||||||
|
if(!JS_IsString(argv[0])) return JS_ThrowReferenceError(ctx, "SetWindowTitle argument title (0) needs to be a string");
|
||||||
const char * title = JS_ToCString(ctx, argv[0]);
|
const char * title = JS_ToCString(ctx, argv[0]);
|
||||||
|
SetWindowTitle(title);
|
||||||
|
JS_FreeCString(ctx, title);
|
||||||
return JS_UNDEFINED;
|
return JS_UNDEFINED;
|
||||||
}
|
}
|
||||||
|
|
||||||
static JSValue js_setWindowPosition(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv){
|
static JSValue js_setWindowPosition(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv){
|
||||||
int x;
|
if(!JS_IsNumber(argv[0])) return JS_ThrowReferenceError(ctx, "SetWindowPosition argument x (0) needs to be a number");
|
||||||
JS_ToInt32(ctx, &x, argv[0]);
|
if(!JS_IsNumber(argv[1])) return JS_ThrowReferenceError(ctx, "SetWindowPosition argument y (1) needs to be a number");
|
||||||
int y;
|
int x; JS_ToInt32(ctx, &x, argv[0]);
|
||||||
JS_ToInt32(ctx, &y, argv[1]);
|
int y; JS_ToInt32(ctx, &y, argv[1]);
|
||||||
|
SetWindowPosition(x, y);
|
||||||
|
|
||||||
|
return JS_UNDEFINED;
|
||||||
|
}
|
||||||
|
|
||||||
|
static JSValue js_beginDrawing(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv){
|
||||||
|
|
||||||
|
|
||||||
|
BeginDrawing();
|
||||||
|
|
||||||
|
return JS_UNDEFINED;
|
||||||
|
}
|
||||||
|
|
||||||
|
static JSValue js_endDrawing(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv){
|
||||||
|
|
||||||
|
|
||||||
|
EndDrawing();
|
||||||
|
|
||||||
return JS_UNDEFINED;
|
return JS_UNDEFINED;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const JSCFunctionListEntry js_raylib_core_funcs[] = {
|
static const JSCFunctionListEntry js_raylib_core_funcs[] = {
|
||||||
JS_CFUNC_DEF("setWindowTitle", 1, js_setWindowTitle),
|
JS_CFUNC_DEF("setWindowTitle", 1, js_setWindowTitle),
|
||||||
JS_CFUNC_DEF("setWindowPosition", 2, js_setWindowPosition)
|
JS_CFUNC_DEF("setWindowPosition", 2, js_setWindowPosition),
|
||||||
|
JS_CFUNC_DEF("beginDrawing", 0, js_beginDrawing),
|
||||||
|
JS_CFUNC_DEF("endDrawing", 0, js_endDrawing)
|
||||||
};
|
};
|
||||||
|
|
||||||
static int js_raylib_core_init(JSContext *ctx, JSModuleDef *m){
|
static int js_raylib_core_init(JSContext *ctx, JSModuleDef *m){
|
||||||
|
|
|
@ -71,7 +71,7 @@ int app_update_quickjs(){
|
||||||
}
|
}
|
||||||
|
|
||||||
int app_dispose_quickjs(){
|
int app_dispose_quickjs(){
|
||||||
js_std_free_handlers(rt);
|
//js_std_free_handlers(rt);
|
||||||
JS_FreeContext(ctx);
|
JS_FreeContext(ctx);
|
||||||
JS_FreeRuntime(rt);
|
JS_FreeRuntime(rt);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -86,7 +86,7 @@ static JSContext *JS_NewCustomContext(JSRuntime *rt)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
/* system modules */
|
/* system modules */
|
||||||
//js_init_module_std(ctx, "std");
|
js_init_module_std(ctx, "std");
|
||||||
//js_init_module_os(ctx, "os");
|
//js_init_module_os(ctx, "os");
|
||||||
js_init_module_raylib_core(ctx, "raylib.core");
|
js_init_module_raylib_core(ctx, "raylib.core");
|
||||||
return ctx;
|
return ctx;
|
||||||
|
|
Loading…
Reference in New Issue