172 lines
6.1 KiB
C
172 lines
6.1 KiB
C
#include "qjs_js.h"
|
|
#include "qjs_macros.h"
|
|
#include "jsffi.h"
|
|
#include "prosperon.h"
|
|
#include <string.h>
|
|
|
|
#ifdef _WIN32
|
|
#include <windows.h>
|
|
#endif
|
|
|
|
// Function implementations
|
|
|
|
JSC_CCALL(os_dump_atoms,
|
|
return js_dump_atoms(js);
|
|
)
|
|
|
|
JSC_CCALL(os_dump_shapes,
|
|
return js_dump_shapes(js);
|
|
)
|
|
|
|
JSC_CCALL(js_dump_class, return js_get_object_class_distribution(js))
|
|
JSC_CCALL(js_dump_type_overheads, return js_get_object_type_overheads(js))
|
|
JSC_CCALL(js_dump_objects, return js_dump_objects(js))
|
|
|
|
void cycle_hook_call(JSContext *js, JSValue v)
|
|
{
|
|
prosperon_rt *rt = JS_GetContextOpaque(js);
|
|
JS_FreeValue(js,JS_Call(js, rt->cycle_fn,JS_UNDEFINED,1,&v));
|
|
}
|
|
|
|
JSC_CCALL(js_cycle_hook,
|
|
if (JS_IsUndefined(argv[0]))
|
|
js_debug_sethook(js,NULL,JS_HOOK_CYCLE);
|
|
else {
|
|
prosperon_rt *rt = JS_GetContextOpaque(js);
|
|
JS_FreeValue(js,rt->cycle_fn);
|
|
rt->cycle_fn = JS_DupValue(js,argv[0]);
|
|
js_debug_sethook(js,cycle_hook_call, JS_HOOK_CYCLE);
|
|
}
|
|
)
|
|
|
|
JSC_CCALL(js_stack_info, return js_dump_stack_info(js))
|
|
|
|
JSC_CCALL(os_mem, return js_get_memory_usage(js))
|
|
|
|
#define JSOBJ_ADD_FIELD(OBJ, STRUCT, FIELD, TYPE) \
|
|
JS_SetPropertyStr(js, OBJ, #FIELD, TYPE##2js(js,STRUCT.FIELD));\
|
|
|
|
#define JSJMEMRET(FIELD) JSOBJ_ADD_FIELD(ret, jsmem, FIELD, number)
|
|
|
|
JSC_CCALL(os_memstate,
|
|
JSMemoryUsage jsmem;
|
|
JS_FillMemoryState(JS_GetRuntime(js), &jsmem);
|
|
ret = JS_NewObject(js);
|
|
JSJMEMRET(malloc_size)
|
|
JSJMEMRET(malloc_limit)
|
|
JSJMEMRET(memory_used_size)
|
|
JSJMEMRET(gc_threshold)
|
|
JSJMEMRET(malloc_count)
|
|
JSJMEMRET(memory_used_count)
|
|
JSJMEMRET(atom_count)
|
|
JSJMEMRET(atom_size)
|
|
JSJMEMRET(str_count)
|
|
JSJMEMRET(str_size)
|
|
JSJMEMRET(obj_count)
|
|
JSJMEMRET(obj_size)
|
|
JSJMEMRET(prop_count)
|
|
JSJMEMRET(prop_size)
|
|
JSJMEMRET(shape_count)
|
|
JSJMEMRET(shape_size)
|
|
JSJMEMRET(js_func_count)
|
|
JSJMEMRET(js_func_size)
|
|
JSJMEMRET(js_func_code_size)
|
|
JSJMEMRET(js_func_pc2line_count)
|
|
JSJMEMRET(js_func_pc2line_size)
|
|
JSJMEMRET(c_func_count)
|
|
JSJMEMRET(array_count)
|
|
JSJMEMRET(fast_array_count)
|
|
JSJMEMRET(fast_array_elements)
|
|
JSJMEMRET(binary_object_count)
|
|
JSJMEMRET(binary_object_size)
|
|
)
|
|
|
|
JSC_CCALL(os_gc, JS_RunGC(JS_GetRuntime(js)) )
|
|
|
|
JSC_SSCALL(os_eval,
|
|
ret = JS_Eval(js,str2,strlen(str2),str,JS_EVAL_TYPE_GLOBAL);
|
|
)
|
|
|
|
JSC_CCALL(os_mem_limit, JS_SetMemoryLimit(JS_GetRuntime(js), js2number(js,argv[0])))
|
|
|
|
JSC_CCALL(os_gc_threshold, JS_SetGCThreshold(JS_GetRuntime(js), js2number(js,argv[0])))
|
|
|
|
JSC_CCALL(os_max_stacksize, JS_SetMaxStackSize(JS_GetRuntime(js), js2number(js,argv[0])))
|
|
JSC_CCALL(os_rt_info, return JS_GetRTInfo(JS_GetRuntime(js),js))
|
|
|
|
JSC_CCALL(os_calc_mem,
|
|
JSMemoryUsage mu;
|
|
JS_ComputeMemoryUsage(JS_GetRuntime(js),&mu);
|
|
ret = JS_NewObject(js);
|
|
JS_SetPropertyStr(js,ret,"malloc_size",number2js(js,mu.malloc_size));
|
|
JS_SetPropertyStr(js,ret,"malloc_limit",number2js(js,mu.malloc_limit));
|
|
JS_SetPropertyStr(js,ret,"memory_used_size",number2js(js,mu.memory_used_size));
|
|
JS_SetPropertyStr(js,ret,"malloc_count",number2js(js,mu.malloc_count));
|
|
JS_SetPropertyStr(js,ret,"memory_used_count",number2js(js,mu.memory_used_count));
|
|
JS_SetPropertyStr(js,ret,"atom_count",number2js(js,mu.atom_count));
|
|
JS_SetPropertyStr(js,ret,"atom_size",number2js(js,mu.atom_size));
|
|
JS_SetPropertyStr(js,ret,"str_count",number2js(js,mu.str_count));
|
|
JS_SetPropertyStr(js,ret,"str_size",number2js(js,mu.str_size));
|
|
JS_SetPropertyStr(js,ret,"obj_count",number2js(js,mu.obj_count));
|
|
JS_SetPropertyStr(js,ret,"obj_size",number2js(js,mu.obj_size));
|
|
JS_SetPropertyStr(js,ret,"prop_count",number2js(js,mu.prop_count));
|
|
JS_SetPropertyStr(js,ret,"prop_size",number2js(js,mu.prop_size));
|
|
JS_SetPropertyStr(js,ret,"shape_count",number2js(js,mu.shape_count));
|
|
JS_SetPropertyStr(js,ret,"shape_size",number2js(js,mu.shape_size));
|
|
JS_SetPropertyStr(js,ret,"js_func_count",number2js(js,mu.js_func_count));
|
|
JS_SetPropertyStr(js,ret,"js_func_size",number2js(js,mu.js_func_size));
|
|
JS_SetPropertyStr(js,ret,"js_func_code_size",number2js(js,mu.js_func_code_size));
|
|
JS_SetPropertyStr(js,ret,"js_func_pc2line_count",number2js(js,mu.js_func_pc2line_count));
|
|
JS_SetPropertyStr(js,ret,"js_func_pc2line_size",number2js(js,mu.js_func_pc2line_size));
|
|
JS_SetPropertyStr(js,ret,"c_func_count",number2js(js,mu.c_func_count));
|
|
JS_SetPropertyStr(js,ret,"array_count",number2js(js,mu.array_count));
|
|
JS_SetPropertyStr(js,ret,"fast_array_count",number2js(js,mu.fast_array_count));
|
|
JS_SetPropertyStr(js,ret,"fast_array_elements",number2js(js,mu.fast_array_elements));
|
|
JS_SetPropertyStr(js,ret,"binary_object_count",number2js(js,mu.binary_object_count));
|
|
JS_SetPropertyStr(js,ret,"binary_object_size",number2js(js,mu.binary_object_size));
|
|
)
|
|
|
|
/*
|
|
JSC_CCALL(os_memstate,
|
|
#ifdef _WIN32
|
|
MEMORYSTATUSEX statex;
|
|
statex.dwLength = sizeof (statex);
|
|
GlobalMemoryStatusEx (&statex);
|
|
ret = JS_NewObject(js);
|
|
JS_SetPropertyStr(js,ret,"load",number2js(js,statex.dwMemoryLoad));
|
|
JS_SetPropertyStr(js,ret,"physical",number2js(js,statex.ullTotalPhys));
|
|
JS_SetPropertyStr(js,ret,"availphysical",number2js(js,statex.ullAvailPhys));
|
|
JS_SetPropertyStr(js,ret,"pagefile",number2js(js,statex.ullTotalPageFile));
|
|
JS_SetPropertyStr(js,ret,"availpagefile",number2js(js,statex.ullAvailPageFile));
|
|
JS_SetPropertyStr(js,ret,"virtual",number2js(js,statex.ullTotalVirtual));
|
|
JS_SetPropertyStr(js,ret,"availvirtual",number2js(js,statex.ullAvailVirtual));
|
|
JS_SetPropertyStr(js,ret,"availextended",number2js(js,statex.ullAvailExtendedVirtual));
|
|
#else
|
|
ret = JS_NewObject(js);
|
|
#endif
|
|
)*/
|
|
|
|
static const JSCFunctionListEntry js_js_funcs[] = {
|
|
MIST_FUNC_DEF(js, cycle_hook,1),
|
|
MIST_FUNC_DEF(os, dump_shapes, 0),
|
|
MIST_FUNC_DEF(os, dump_atoms,0),
|
|
MIST_FUNC_DEF(js, dump_class, 0),
|
|
MIST_FUNC_DEF(js, dump_objects, 0),
|
|
MIST_FUNC_DEF(js, dump_type_overheads, 0),
|
|
MIST_FUNC_DEF(js, stack_info, 0),
|
|
MIST_FUNC_DEF(os, calc_mem, 0),
|
|
MIST_FUNC_DEF(os, mem, 0),
|
|
MIST_FUNC_DEF(os, mem_limit, 1),
|
|
MIST_FUNC_DEF(os, gc_threshold, 1),
|
|
MIST_FUNC_DEF(os, max_stacksize, 1),
|
|
MIST_FUNC_DEF(os, memstate, 0),
|
|
MIST_FUNC_DEF(os, gc, 0),
|
|
MIST_FUNC_DEF(os, eval, 2),
|
|
MIST_FUNC_DEF(os, rt_info, 0),
|
|
};
|
|
|
|
JSValue js_js_use(JSContext *js) {
|
|
JSValue mod = JS_NewObject(js);
|
|
JS_SetPropertyFunctionList(js,mod,js_js_funcs,countof(js_js_funcs));
|
|
return mod;
|
|
} |