Fix crash on exit
This commit is contained in:
parent
bba9c3e90a
commit
c368b81216
1
Makefile
1
Makefile
|
@ -58,6 +58,7 @@ endif
|
||||||
|
|
||||||
ifdef LEAK
|
ifdef LEAK
|
||||||
CPPFLAGS += -fsanitize=address -fsanitize=undefined -fno-omit-frame-pointer -DLEAK
|
CPPFLAGS += -fsanitize=address -fsanitize=undefined -fno-omit-frame-pointer -DLEAK
|
||||||
|
INFO := $(INFO)_leak
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(OPT),small)
|
ifeq ($(OPT),small)
|
||||||
|
|
|
@ -156,6 +156,7 @@ console.pprint = function(msg,lvl = 0) {
|
||||||
|
|
||||||
var file = "nofile";
|
var file = "nofile";
|
||||||
var line = 0;
|
var line = 0;
|
||||||
|
console.rec(0,msg,file,line);
|
||||||
|
|
||||||
var caller = (new Error()).stack.split('\n')[2];
|
var caller = (new Error()).stack.split('\n')[2];
|
||||||
if (caller) {
|
if (caller) {
|
||||||
|
@ -453,12 +454,12 @@ prosperon.touchrelease = function(touches){};
|
||||||
prosperon.touchmove = function(touches){};
|
prosperon.touchmove = function(touches){};
|
||||||
prosperon.clipboardpaste = function(str){};
|
prosperon.clipboardpaste = function(str){};
|
||||||
prosperon.quit = function(){
|
prosperon.quit = function(){
|
||||||
console.info(profile.printreport(profcache, "USE REPORT"));
|
say(profile.printreport(profcache, "USE REPORT"));
|
||||||
console.info(profile.printreport(entityreport, "ENTITY REPORT"));
|
say(profile.printreport(entityreport, "ENTITY REPORT"));
|
||||||
|
|
||||||
console.info("QUITTING");
|
console.info("QUITTING");
|
||||||
for (var i in debug.log.time)
|
for (var i in debug.log.time)
|
||||||
console.warn(debug.log.time[i].map(x=>profile.ms(x)));
|
say(debug.log.time[i].map(x=>profile.ms(x)));
|
||||||
};
|
};
|
||||||
|
|
||||||
global.mixin("scripts/input");
|
global.mixin("scripts/input");
|
||||||
|
|
|
@ -248,7 +248,7 @@ Cmdline.register_order("play", function(argv) {
|
||||||
console.info(`Starting game with window size ${window.size} and render ${window.rendersize}.`);
|
console.info(`Starting game with window size ${window.size} and render ${window.rendersize}.`);
|
||||||
|
|
||||||
game.engine_start(function() {
|
game.engine_start(function() {
|
||||||
render.set_font("fonts/c64.ttf", 8);
|
render.set_font("fonts/c64.ttf", 8);
|
||||||
global.app = actor.spawn("game.js");
|
global.app = actor.spawn("game.js");
|
||||||
if (project.icon) window.set_icon(game.texture(project.icon));
|
if (project.icon) window.set_icon(game.texture(project.icon));
|
||||||
game.camera = world.spawn("scripts/camera2d");
|
game.camera = world.spawn("scripts/camera2d");
|
||||||
|
|
|
@ -101,14 +101,6 @@ JSValue js_getpropidx(JSValue v, uint32_t i)
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
JSValue gos2ref(gameobject **go)
|
|
||||||
{
|
|
||||||
JSValue array = JS_NewArray(js);
|
|
||||||
for (int i = 0; i < arrlen(go); i++)
|
|
||||||
js_setprop_num(array,i,JS_DupValue(js,go[i]->ref));
|
|
||||||
return array;
|
|
||||||
}
|
|
||||||
|
|
||||||
void js_setprop_str(JSValue obj, const char *prop, JSValue v) { JS_SetPropertyStr(js, obj, prop, v); }
|
void js_setprop_str(JSValue obj, const char *prop, JSValue v) { JS_SetPropertyStr(js, obj, prop, v); }
|
||||||
JSValue js_getpropstr(JSValue v, const char *str)
|
JSValue js_getpropstr(JSValue v, const char *str)
|
||||||
{
|
{
|
||||||
|
@ -1549,7 +1541,6 @@ void ffi_load() {
|
||||||
QJSGLOBALCLASS(dspsound);
|
QJSGLOBALCLASS(dspsound);
|
||||||
QJSGLOBALCLASS(pshape);
|
QJSGLOBALCLASS(pshape);
|
||||||
QJSGLOBALCLASS(performance);
|
QJSGLOBALCLASS(performance);
|
||||||
|
|
||||||
QJSGLOBALCLASS(circle2d);
|
QJSGLOBALCLASS(circle2d);
|
||||||
QJSGLOBALCLASS(poly2d);
|
QJSGLOBALCLASS(poly2d);
|
||||||
QJSGLOBALCLASS(edge2d);
|
QJSGLOBALCLASS(edge2d);
|
||||||
|
@ -1560,7 +1551,7 @@ void ffi_load() {
|
||||||
JS_SetPropertyStr(js, globalThis, "texture", JS_DupValue(js,texture_proto));
|
JS_SetPropertyStr(js, globalThis, "texture", JS_DupValue(js,texture_proto));
|
||||||
|
|
||||||
//JS_SetPropertyStr(js, globalThis, "steam", js_init_steam(js));
|
//JS_SetPropertyStr(js, globalThis, "steam", js_init_steam(js));
|
||||||
|
|
||||||
sound_proto = JS_NewObject(js);
|
sound_proto = JS_NewObject(js);
|
||||||
JS_SetPropertyStr(js,globalThis, "sound_proto", sound_proto);
|
JS_SetPropertyStr(js,globalThis, "sound_proto", sound_proto);
|
||||||
JS_SetPropertyFunctionList(js, sound_proto, js_sound_funcs, countof(js_sound_funcs));
|
JS_SetPropertyFunctionList(js, sound_proto, js_sound_funcs, countof(js_sound_funcs));
|
||||||
|
@ -1568,7 +1559,3 @@ void ffi_load() {
|
||||||
|
|
||||||
JS_FreeValue(js,globalThis);
|
JS_FreeValue(js,globalThis);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ffi_stop()
|
|
||||||
{
|
|
||||||
}
|
|
|
@ -120,7 +120,6 @@ JS_SetClassProto(js, js_##TYPE##_id, TYPE##_proto); \
|
||||||
#define countof(x) (sizeof(x)/sizeof((x)[0]))
|
#define countof(x) (sizeof(x)/sizeof((x)[0]))
|
||||||
|
|
||||||
void ffi_load();
|
void ffi_load();
|
||||||
void ffi_stop();
|
|
||||||
|
|
||||||
JSValue vec22js(HMM_Vec2 v);
|
JSValue vec22js(HMM_Vec2 v);
|
||||||
HMM_Vec2 js2vec2(JSValue v);
|
HMM_Vec2 js2vec2(JSValue v);
|
||||||
|
|
|
@ -24,7 +24,7 @@ void script_startup() {
|
||||||
size_t len;
|
size_t len;
|
||||||
char *eng = slurp_text("scripts/engine.js", &len);
|
char *eng = slurp_text("scripts/engine.js", &len);
|
||||||
JSValue v = script_eval("scripts/engine.js", eng);
|
JSValue v = script_eval("scripts/engine.js", eng);
|
||||||
JS_FreeValue(js,v);
|
JS_FreeValue(js, v);
|
||||||
free(eng);
|
free(eng);
|
||||||
}
|
}
|
||||||
static int stopped = 0;
|
static int stopped = 0;
|
||||||
|
@ -35,17 +35,19 @@ void script_stop()
|
||||||
return;
|
return;
|
||||||
#endif
|
#endif
|
||||||
printf("FREEING CONTEXT\n");
|
printf("FREEING CONTEXT\n");
|
||||||
ffi_stop();
|
|
||||||
JS_FreeContext(js);
|
|
||||||
script_gc();
|
script_gc();
|
||||||
JS_FreeRuntime(rt);
|
|
||||||
|
JS_FreeContext(js);
|
||||||
js = NULL;
|
js = NULL;
|
||||||
|
JS_FreeRuntime(rt);
|
||||||
rt = NULL;
|
rt = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void script_gc() { JS_RunGC(rt); }
|
void script_gc() { JS_RunGC(rt); }
|
||||||
|
|
||||||
void js_stacktrace() {
|
void js_stacktrace() {
|
||||||
|
if (!js) return;
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
script_evalf("console.stack();");
|
script_evalf("console.stack();");
|
||||||
#endif
|
#endif
|
||||||
|
@ -53,13 +55,19 @@ void js_stacktrace() {
|
||||||
|
|
||||||
void script_evalf(const char *format, ...)
|
void script_evalf(const char *format, ...)
|
||||||
{
|
{
|
||||||
char fmtbuf[4096];
|
JSValue obj;
|
||||||
va_list args;
|
va_list args;
|
||||||
va_start(args, format);
|
va_start(args, format);
|
||||||
vsnprintf(fmtbuf, 4096, format, args);
|
int len = vsnprintf(NULL, 0, format, args);
|
||||||
|
va_end(args);
|
||||||
|
|
||||||
|
char *eval = malloc(len+1);
|
||||||
|
va_start(args, format);
|
||||||
|
vsnprintf(eval, len+1, format, args);
|
||||||
va_end(args);
|
va_end(args);
|
||||||
|
|
||||||
JSValue obj = JS_Eval(js, fmtbuf, strlen(fmtbuf), "C eval", JS_EVAL_FLAGS);
|
obj = JS_Eval(js, eval, len, "C eval", JS_EVAL_FLAGS);
|
||||||
|
free(eval);
|
||||||
js_print_exception(obj);
|
js_print_exception(obj);
|
||||||
JS_FreeValue(js,obj);
|
JS_FreeValue(js,obj);
|
||||||
}
|
}
|
||||||
|
|
16
source/engine/thirdparty/quickjs/quickjs.c
vendored
16
source/engine/thirdparty/quickjs/quickjs.c
vendored
|
@ -114,17 +114,17 @@ void quickjs_set_dumpout(FILE *f)
|
||||||
#ifdef DUMP
|
#ifdef DUMP
|
||||||
//#define DUMP_FREE
|
//#define DUMP_FREE
|
||||||
#define DUMP_MEM
|
#define DUMP_MEM
|
||||||
#define DUMP_CLOSURE
|
//#define DUMP_CLOSURE
|
||||||
#define DUMP_GC
|
#define DUMP_GC
|
||||||
#define DUMP_GC_FREE
|
//#define DUMP_GC_FREE
|
||||||
#define DUMP_LEAKS 1
|
#define DUMP_LEAKS 1
|
||||||
#define DUMP_OBJECTS
|
//#define DUMP_OBJECTS
|
||||||
#define DUMP_CLOSURE
|
#define DUMP_CLOSURE
|
||||||
#define DUMP_OBJECTS
|
//#define DUMP_OBJECTS
|
||||||
#define DUMP_ATOMS
|
//#define DUMP_ATOMS
|
||||||
#define DUMP_SHAPES
|
//#define DUMP_SHAPES
|
||||||
#define DUMP_MODULE_RESOLVE
|
//#define DUMP_MODULE_RESOLVE
|
||||||
#define DUMP_PROMISE
|
//#define DUMP_PROMISE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* test the GC by forcing it before each object allocation */
|
/* test the GC by forcing it before each object allocation */
|
||||||
|
|
|
@ -85,6 +85,7 @@ void seghandle()
|
||||||
}
|
}
|
||||||
|
|
||||||
void c_clean() {
|
void c_clean() {
|
||||||
|
JS_FreeValue(js, c_process_fn);
|
||||||
cleanup();
|
cleanup();
|
||||||
gif_rec_end("out.gif");
|
gif_rec_end("out.gif");
|
||||||
saudio_shutdown();
|
saudio_shutdown();
|
||||||
|
|
Loading…
Reference in a new issue