mirror of
https://github.com/Ylianst/MeshAgent
synced 2025-12-15 15:53:55 +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]
|
duk_put_prop_string(ctx, -2, "_ptrptr"); // [var][var2]
|
||||||
return(1);
|
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)
|
void ILibDuktape_GenericMarshal_Variable_PUSH(duk_context *ctx, void *ptr, int size)
|
||||||
{
|
{
|
||||||
duk_push_object(ctx); // [var]
|
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);
|
duk_put_prop_string(ctx, -2, ILibDuktape_GenericMarshal_VariableType);
|
||||||
|
|
||||||
ILibDuktape_CreateEventWithGetterAndSetterEx(ctx, "Val", ILibDuktape_GenericMarshal_Variable_Val_GET, ILibDuktape_GenericMarshal_Variable_Val_SET);
|
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_CreateInstanceMethod(ctx, "Deref", ILibDuktape_GenericMarshal_Variable_Deref, DUK_VARARGS);
|
||||||
ILibDuktape_CreateEventWithGetter(ctx, "String", ILibDuktape_GenericMarshal_Variable_Val_STRING);
|
ILibDuktape_CreateEventWithGetter(ctx, "String", ILibDuktape_GenericMarshal_Variable_Val_STRING);
|
||||||
ILibDuktape_CreateEventWithGetter(ctx, "AnsiString", ILibDuktape_GenericMarshal_Variable_Val_ASTRING);
|
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);
|
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)
|
duk_ret_t ILibDuktape_tmpdir(duk_context *ctx)
|
||||||
{
|
{
|
||||||
#ifdef WIN32
|
#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, "arch", ILibDuktape_ScriptContainer_OS_arch, 0);
|
||||||
ILibDuktape_CreateInstanceMethod(ctx, "platform", ILibDuktape_ScriptContainer_OS_platform, 0);
|
ILibDuktape_CreateInstanceMethod(ctx, "platform", ILibDuktape_ScriptContainer_OS_platform, 0);
|
||||||
|
ILibDuktape_CreateInstanceMethod(ctx, "endianness", ILibDuktape_ScriptContainer_OS_endianness, 0);
|
||||||
#if !defined(__APPLE__) && !defined(_FREEBSD)
|
#if !defined(__APPLE__) && !defined(_FREEBSD)
|
||||||
ILibDuktape_CreateInstanceMethod(ctx, "networkInterfaces", ILibDuktape_ScriptContainer_OS_networkInterfaces, 0);
|
ILibDuktape_CreateInstanceMethod(ctx, "networkInterfaces", ILibDuktape_ScriptContainer_OS_networkInterfaces, 0);
|
||||||
#endif
|
#endif
|
||||||
@@ -2426,6 +2433,45 @@ void ILibDuktape_ScriptContainer_OS_Push(duk_context *ctx, void *chain)
|
|||||||
child.waitExit();\
|
child.waitExit();\
|
||||||
return(child.stdout.str.trim());\
|
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);
|
ILibDuktape_ModSearch_AddHandler_AlsoIncludeJS(ctx, jsExtras, sizeof(jsExtras) - 1);
|
||||||
|
|||||||
Reference in New Issue
Block a user