1
0
mirror of https://github.com/Ylianst/MeshAgent synced 2025-12-06 00:13:33 +00:00

1. added os.endianness

2. added os.uptime()
3. added bignum property support to _GenericMarshal.Variable
This commit is contained in:
Bryan Roe
2020-07-11 01:34:33 -07:00
parent f9c9e4264d
commit 70593e995b
2 changed files with 85 additions and 1 deletions

View File

@@ -429,6 +429,42 @@ duk_ret_t ILibDuktape_GenericMarshal_Variable_pointerpointer(duk_context *ctx)
duk_put_prop_string(ctx, -2, "_ptrptr"); // [var][var2]
return(1);
}
#ifndef MICROSTACK_NOTLS
duk_ret_t ILibDuktape_GenericMarshal_Variable_bignum_GET(duk_context *ctx)
{
int16_t test = 0x0001;
int LE = ((char*)&test)[0] ? 1 : 0;
duk_push_this(ctx); // [var]
void *ptr = Duktape_GetPointerProperty(ctx, -1, "_ptr");
uint64_t v = (uint64_t)(uintptr_t)ptr;
duk_eval_string(ctx, "require('bignum')"); // [var][bignum]
duk_prepare_method_call(ctx, -1, "fromBuffer"); // [var][bignum][fromBuffer][this]
duk_push_external_buffer(ctx); // [var][bignum][fromBuffer][this][buffer]
duk_config_buffer(ctx, -1, &v, sizeof(v));
duk_push_buffer_object(ctx, -1, 0, sizeof(v), DUK_BUFOBJ_NODEJS_BUFFER);// [var][bignum][fromBuffer][this][buffer][nodebuffer]
duk_remove(ctx, -2); // [var][bignum][fromBuffer][this][nodeBuffer]
duk_push_object(ctx); // [var][bignum][fromBuffer][this][nodeBuffer][options
duk_push_string(ctx, LE ? "little" : "big"); // [var][bignum][fromBuffer][this][nodeBuffer][options][endian]
duk_put_prop_string(ctx, -2, "endian");
duk_call_method(ctx, 2); // [var][bignum][bignum]
return(1);
}
duk_ret_t ILibDuktape_GenericMarshal_Variable_bignum_SET(duk_context *ctx)
{
int16_t test = 0x0001;
int LE = ((char*)&test)[0] ? 1 : 0;
duk_prepare_method_call(ctx, 0, "toString"); // [toString][this]
duk_call_method(ctx, 0); // [string]
uint64_t val = (uint64_t)strtoull((char*)duk_to_string(ctx, -1), NULL, 10);
duk_push_this(ctx); // [var]
duk_push_pointer(ctx, (void*)(uintptr_t)val); // [var][ptr]
duk_put_prop_string(ctx, -2, "_ptr"); // [var]
return(0);
}
#endif
void ILibDuktape_GenericMarshal_Variable_PUSH(duk_context *ctx, void *ptr, int size)
{
duk_push_object(ctx); // [var]
@@ -441,7 +477,9 @@ void ILibDuktape_GenericMarshal_Variable_PUSH(duk_context *ctx, void *ptr, int s
duk_put_prop_string(ctx, -2, ILibDuktape_GenericMarshal_VariableType);
ILibDuktape_CreateEventWithGetterAndSetterEx(ctx, "Val", ILibDuktape_GenericMarshal_Variable_Val_GET, ILibDuktape_GenericMarshal_Variable_Val_SET);
#ifndef MICROSTACK_NOTLS
ILibDuktape_CreateEventWithGetterAndSetterEx(ctx, "bignum", ILibDuktape_GenericMarshal_Variable_bignum_GET, ILibDuktape_GenericMarshal_Variable_bignum_SET);
#endif
ILibDuktape_CreateInstanceMethod(ctx, "Deref", ILibDuktape_GenericMarshal_Variable_Deref, DUK_VARARGS);
ILibDuktape_CreateEventWithGetter(ctx, "String", ILibDuktape_GenericMarshal_Variable_Val_STRING);
ILibDuktape_CreateEventWithGetter(ctx, "AnsiString", ILibDuktape_GenericMarshal_Variable_Val_ASTRING);

View File

@@ -1936,6 +1936,12 @@ duk_ret_t ILibDuktape_ScriptContainer_OS_hostname(duk_context *ctx)
}
return(1);
}
duk_ret_t ILibDuktape_ScriptContainer_OS_endianness(duk_context *ctx)
{
int16_t test = 0x0001;
duk_push_string(ctx, ((char*)&test)[0] ? "LE" : "BE");
return(1);
}
duk_ret_t ILibDuktape_tmpdir(duk_context *ctx)
{
#ifdef WIN32
@@ -1967,6 +1973,7 @@ void ILibDuktape_ScriptContainer_OS_Push(duk_context *ctx, void *chain)
ILibDuktape_CreateInstanceMethod(ctx, "arch", ILibDuktape_ScriptContainer_OS_arch, 0);
ILibDuktape_CreateInstanceMethod(ctx, "platform", ILibDuktape_ScriptContainer_OS_platform, 0);
ILibDuktape_CreateInstanceMethod(ctx, "endianness", ILibDuktape_ScriptContainer_OS_endianness, 0);
#if !defined(__APPLE__) && !defined(_FREEBSD)
ILibDuktape_CreateInstanceMethod(ctx, "networkInterfaces", ILibDuktape_ScriptContainer_OS_networkInterfaces, 0);
#endif
@@ -2426,6 +2433,45 @@ void ILibDuktape_ScriptContainer_OS_Push(duk_context *ctx, void *chain)
child.waitExit();\
return(child.stdout.str.trim());\
};\
}\
exports.uptime = function uptime()\
{\
switch(process.platform)\
{\
case 'win32':\
var GM = require('_GenericMarshal');\
var kernel32 = GM.CreateNativeProxy('kernel32.dll');\
kernel32.CreateMethod('GetTickCount64');\
var v = kernel32.GetTickCount64().bignum.div(require('bignum')('1000')).toString();\
return (parseInt(v));\
break;\
case 'linux':\
return (parseInt(require('fs').readFileSync('/proc/uptime').toString().split('.')[0]));\
break;\
case 'freebsd':\
case 'darwin':\
var child = require('child_process').execFile('/bin/sh', ['sh']);\
child.stdout.str = ''; child.stdout.on('data', function(c) { this.str += c.toString(); });\
child.stdin.write(\"sysctl kern.boottime | awk '\");\
child.stdin.write('{');\
child.stdin.write(' split($0,A,\"{\");');\
child.stdin.write(' split(A[2],B,\"}\");');\
child.stdin.write(' split(B[1],C,\",\");');\
child.stdin.write(' split(C[1],D,\"=\");');\
child.stdin.write(' gsub(/^[ ]+/,\"\",D[2]);');\
child.stdin.write(' SEC=D[2]+0;');\
child.stdin.write(' split(C[2],G,\"=\");');\
child.stdin.write(' gsub(/^[ ]+/,\"\",G[2]);');\
child.stdin.write(' USEC=G[2]+0;');\
child.stdin.write(' if(USEC>1000000) { SEC+=1; }');\
child.stdin.write(' print SEC;');\
child.stdin.write(\"}'\");\
child.stdin.write('\\nexit\\n');\
child.waitExit();\
var tmp = Math.round((new Date()).getTime()/1000) - parseInt(child.stdout.str);\
return(tmp);\
break;\
}\
}";
ILibDuktape_ModSearch_AddHandler_AlsoIncludeJS(ctx, jsExtras, sizeof(jsExtras) - 1);