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:
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user