#include #include "ScriptAPI.h" #pragma warning(disable: 4702) // disable unreachable code warning void ScriptAPI::Define_script(duk_context *ctx) { const DukPropListEntry props[] = { { "timeout", DukCFunction(js_script_timeout) }, { "keepalive", DukCFunction(js_script_keepalive) }, { "abort", DukCFunction(js_script_abort) }, { nullptr } }; DefineGlobalInterface(ctx, "script", props); } duk_ret_t ScriptAPI::js_script_timeout(duk_context *ctx) { CheckArgs(ctx, { Arg_Number }); CScriptInstance* inst = GetInstance(ctx); inst->SetExecTimeout((uint64_t)duk_get_number(ctx, 0)); return 0; } duk_ret_t ScriptAPI::js_script_keepalive(duk_context *ctx) { CheckArgs(ctx, { Arg_Boolean }); CScriptInstance* inst = GetInstance(ctx); duk_bool_t bKeepAlive = duk_get_boolean(ctx, 0); duk_push_global_object(ctx); duk_bool_t bHaveProp = duk_has_prop_string(ctx, -1, HS_gKeepAlive); if(bKeepAlive && !bHaveProp) { duk_push_boolean(ctx, 1); duk_put_prop_string(ctx, -2, HS_gKeepAlive); inst->IncRefCount(); } else if(!bKeepAlive && bHaveProp) { duk_del_prop_string(ctx, -1, HS_gKeepAlive); inst->DecRefCount(); } duk_pop(ctx); return 0; } duk_ret_t ScriptAPI::js_script_abort(duk_context* ctx) { CheckArgs(ctx, {}); CScriptInstance* inst = GetInstance(ctx); if (inst->PrepareAbort()) { return duk_fatal(ctx, "aborted"); } return 0; }