diff --git a/microscript/ILibDuktape_GenericMarshal.c b/microscript/ILibDuktape_GenericMarshal.c index 8527079..2052bac 100644 --- a/microscript/ILibDuktape_GenericMarshal.c +++ b/microscript/ILibDuktape_GenericMarshal.c @@ -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); diff --git a/microscript/ILibDuktape_ScriptContainer.c b/microscript/ILibDuktape_ScriptContainer.c index 86509b7..e842945 100644 --- a/microscript/ILibDuktape_ScriptContainer.c +++ b/microscript/ILibDuktape_ScriptContainer.c @@ -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);