in interpreters/quickjs/qjsmini.c [469:677]
int main(int argc, char *argv[])
{
JSRuntime *rt = NULL;
JSContext *ctx = NULL;
struct trace_malloc_data trace_data =
{
NULL
};
static const JSMallocFunctions trace_mf =
{
js_trace_malloc,
js_trace_free,
js_trace_realloc,
malloc_usable_size,
};
int argi;
char *expr = NULL;
int dump_memory = 0;
int trace_memory = 0;
int empty_run = 0;
size_t memory_limit = 0;
size_t stack_size = 0;
argi = 1;
while (argi < argc && *argv[argi] == '-')
{
char *arg = argv[argi] + 1;
const char *longopt = "";
if (!*arg)
break;
argi++;
if (*arg == '-')
{
longopt = arg + 1;
arg += strlen(arg);
if (!*longopt)
break;
}
for (; *arg || *longopt; longopt = "")
{
char opt = *arg;
if (opt)
{
arg++;
}
if (opt == 'h' || opt == '?' || !strcmp(longopt, "help"))
{
qjs_help();
continue;
}
if (opt == 'e' || !strcmp(longopt, "eval"))
{
if (*arg)
{
expr = arg;
break;
}
if (argi < argc)
{
expr = argv[argi++];
break;
}
fprintf(stderr, "qjs: missing expression for -e\n");
exit(2);
}
if (opt == 'd' || !strcmp(longopt, "dump"))
{
dump_memory++;
continue;
}
if (opt == 'T' || !strcmp(longopt, "trace"))
{
trace_memory++;
continue;
}
if (opt == 'q' || !strcmp(longopt, "quit"))
{
empty_run++;
continue;
}
if (!strcmp(longopt, "memory-limit"))
{
if (argi >= argc)
{
fprintf(stderr, "expecting memory limit");
exit(1);
}
memory_limit = (size_t)strtod(argv[argi++], NULL);
continue;
}
if (!strcmp(longopt, "stack-size"))
{
if (argi >= argc)
{
fprintf(stderr, "expecting stack size");
exit(1);
}
stack_size = (size_t)strtod(argv[argi++], NULL);
continue;
}
if (opt)
{
fprintf(stderr, "qjs: unknown option '-%c'\n", opt);
}
else
{
fprintf(stderr, "qjs: unknown option '--%s'\n", longopt);
}
qjs_help();
}
}
if (trace_memory)
{
js_trace_malloc_init(&trace_data);
rt = JS_NewRuntime2(&trace_mf, &trace_data);
}
else
{
rt = JS_NewRuntime();
}
if (!rt)
{
fprintf(stderr, "qjs: cannot allocate JS runtime\n");
goto fail;
}
if (memory_limit != 0)
JS_SetMemoryLimit(rt, memory_limit);
if (stack_size != 0)
JS_SetMaxStackSize(rt, stack_size);
ctx = JS_NewContext(rt);
if (!ctx)
{
fprintf(stderr, "qjs: cannot allocate JS context\n");
goto fail;
}
js_std_add_helpers(ctx);
#ifdef CONFIG_INTERPRETERS_QUICKJS_EXT_HOOK
if (OK != js_ext_init(ctx))
{
fprintf(stderr, "qjs: external context init failed\n");
goto fail;
}
#endif
if (!empty_run)
{
if (expr)
{
if (js_eval_buf(ctx, expr, strlen(expr), "<cmdline>", 0))
{
goto fail;
}
}
else if (argi < argc)
{
const char *filename;
filename = argv[argi];
if (js_eval_file(ctx, filename, 1))
{
goto fail;
}
}
}
if (dump_memory)
{
JSMemoryUsage stats;
JS_ComputeMemoryUsage(rt, &stats);
JS_DumpMemoryUsage(stdout, &stats, rt);
}
fail:
if (ctx)
{
#ifdef CONFIG_INTERPRETERS_QUICKJS_EXT_HOOK
js_ext_destroy(ctx);
#endif
JS_FreeContext(ctx);
}
if (rt)
JS_FreeRuntime(rt);
return 0;
}