project64/Source/Project64/UserInterface/Debugger/ScriptAPI/ScriptAPI_console.cpp

129 lines
3.0 KiB
C++

#include "stdafx.h"
#include "ScriptAPI.h"
#include <windows.h>
static void ConcatArgs(duk_context * ctx, stdstr & out);
void ScriptAPI::Define_console(duk_context * ctx)
{
const DukPropListEntry props[] = {
{"print", DukCFunction(js_console_print)},
{"log", DukCFunction(js_console_log)},
{"error", DukCFunction(js_console_error)},
{"clear", DukCFunction(js_console_clear)},
{"listen", DukCFunction(js_console_listen)},
{ nullptr }
};
DefineGlobalInterface(ctx, "console", props);
}
duk_ret_t ScriptAPI::js_console_print(duk_context * ctx)
{
stdstr out;
ConcatArgs(ctx, out);
GetInstance(ctx)->System()->ConsolePrint("%s", out.c_str());
return 0;
}
duk_ret_t ScriptAPI::js_console_log(duk_context * ctx)
{
stdstr out;
ConcatArgs(ctx, out);
GetInstance(ctx)->System()->ConsoleLog("%s", out.c_str());
return 0;
}
duk_ret_t ScriptAPI::js_console_error(duk_context * ctx)
{
CheckArgs(ctx, {Arg_OptAny});
if (duk_is_error(ctx, 0))
{
duk_get_prop_string(ctx, 0, "stack");
const char * message = duk_get_string(ctx, -1);
GetInstance(ctx)->System()->ConsoleLog("%s", message);
return 0;
}
GetInstance(ctx)->System()->ConsoleLog("%s", duk_safe_to_string(ctx, 0));
return 0;
}
duk_ret_t ScriptAPI::js_console_clear(duk_context * ctx)
{
CheckArgs(ctx, {});
GetInstance(ctx)->System()->ConsoleClear();
return 0;
}
duk_ret_t ScriptAPI::js_console_listen(duk_context * ctx)
{
CScriptInstance * inst = GetInstance(ctx);
duk_push_global_object(ctx);
duk_bool_t haveListener = duk_has_prop_string(ctx, -1, HS_gInputListener);
if (duk_is_function(ctx, 0))
{
duk_pull(ctx, 0);
duk_put_prop_string(ctx, -2, HS_gInputListener);
if (!haveListener)
{
inst->IncRefCount();
}
return 0;
}
else if (duk_is_null(ctx, 0))
{
if (haveListener)
{
duk_del_prop_string(ctx, -1, HS_gInputListener);
inst->DecRefCount();
}
return 0;
}
return ThrowInvalidArgsError(ctx);
}
void ConcatArgs(duk_context * ctx, stdstr & out)
{
out = "";
duk_idx_t nargs = duk_get_top(ctx);
// note: global JSON.stringify must be intact
duk_get_global_string(ctx, "JSON");
duk_get_prop_string(ctx, -1, "stringify");
duk_remove(ctx, -2);
for (duk_idx_t n = 0; n < nargs; n++)
{
if (n != 0)
{
out += " ";
}
if (duk_is_object(ctx, n))
{
duk_dup(ctx, n);
out += duk_safe_to_string(ctx, -1);
out += " ";
duk_pop(ctx);
duk_dup(ctx, -1);
duk_dup(ctx, n);
duk_push_null(ctx);
duk_push_int(ctx, 2);
duk_pcall(ctx, 3);
out += duk_safe_to_string(ctx, -1);
duk_pop(ctx);
}
else
{
out += duk_safe_to_string(ctx, n);
}
}
}