private unsafe void CreateDefaultOperators(JSValue constructor) { var rval = JSApi.JS_Call(_ctx, _operatorCreate); if (rval.IsException()) { var ex = _ctx.GetExceptionString(); GetLogger()?.Write(LogLevel.Error, ex); } else { JSApi.JS_DefinePropertyValue(_ctx, constructor, JSApi.JS_ATOM_Symbol_operatorSet, rval, JSPropFlags.DEFAULT); } }
protected static bool js_script_error(JSContext ctx) { var logger = ScriptEngine.GetLogger(ctx); logger.ScriptWrite(LogLevel.Error, ctx.GetExceptionString()); return(false); }
public static bool js_get_type_array(JSContext ctx, JSValue val, out Type[] o) { if (JSApi.JS_IsArray(ctx, val) == 1) { var lengthVal = JSApi.JS_GetProperty(ctx, val, JSApi.JS_ATOM_length); if (JSApi.JS_IsException(lengthVal)) { throw new Exception(ctx.GetExceptionString()); } uint length; JSApi.JSB_ToUint32(ctx, out length, lengthVal); JSApi.JS_FreeValue(ctx, lengthVal); o = new Type[length]; for (uint i = 0; i < length; i++) { var eVal = JSApi.JS_GetPropertyUint32(ctx, val, i); Type e; js_get_type(ctx, eVal, out e); o[i] = e; JSApi.JS_FreeValue(ctx, eVal); } return(true); } // fallthrough return(js_get_classvalue <Type[]>(ctx, val, out o)); }
public static bool js_get_delegate_array <T>(JSContext ctx, JSValue val, out T[] o) where T : class { if (JSApi.JS_IsArray(ctx, val) == 1) { var lengthVal = JSApi.JS_GetProperty(ctx, val, JSApi.JS_ATOM_length); if (JSApi.JS_IsException(lengthVal)) { throw new Exception(ctx.GetExceptionString()); } uint length; JSApi.JSB_ToUint32(ctx, out length, lengthVal); JSApi.JS_FreeValue(ctx, lengthVal); o = new T[length]; for (uint i = 0; i < length; i++) { var eVal = JSApi.JS_GetPropertyUint32(ctx, val, i); T e; js_get_delegate(ctx, eVal, out e); o[i] = e; JSApi.JS_FreeValue(ctx, eVal); } return(true); } js_get_classvalue <T[]>(ctx, val, out o); return(true); }
private unsafe object Invoke(Type resultType) { if (_context == null) { return(null); } JSContext ctx = _context; var argc = _args == null ? 0 : _args.Length; fixed(JSValue *ptr = _args) { var rVal = JSApi.JS_Call(ctx, _jsValue, _thisValue, argc, ptr); if (JSApi.JS_IsException(rVal)) { var ex = ctx.GetExceptionString(); throw new JSException(ex); } object resultObject = null; Binding.Values.js_get_var(ctx, rVal, resultType, out resultObject); JSApi.JS_FreeValue(ctx, rVal); return(resultObject); } }
private unsafe void OnError(string error) { if (!_jsContext.IsValid() || JSApi.JS_IsFunction(_jsContext, _onerror) != 1) { return; } var argv = stackalloc[] { Values.js_push_primitive(_jsContext, error) }; var ret = JSApi.JS_Call(_jsContext, _onerror, JSApi.JS_UNDEFINED, 1, argv); if (ret.IsException()) { var logger = ScriptEngine.GetLogger(_jsContext); if (logger != null) { var ex = _jsContext.GetExceptionString(); logger.Write(LogLevel.Error, ex); } } else { JSApi.JS_FreeValue(_jsContext, ret); } JSApi.JS_FreeValue(_jsContext, argv[0]); }
private void Run() { var tick = Environment.TickCount; var list = new List <IO.ByteBuffer>(); var context = _runtime.GetMainContext(); var globalObject = context.GetGlobalObject(); var onmessage = JSApi.JS_GetPropertyStr(context, globalObject, "onmessage"); JSContext ctx = context; var logger = _runtime.GetLogger(); while (_runtime.isRunning) { lock (_inbox) { list.AddRange(_inbox); _inbox.Clear(); } if (list.Count == 0) { Thread.Yield(); } else { for (int i = 0, count = list.Count; i < count; i++) { var byteBuffer = list[i]; unsafe { JSValue data; fixed(byte *buf = byteBuffer.data) { data = JSApi.JS_ReadObject(ctx, buf, byteBuffer.readableBytes, 0); } if (data.IsException()) { var exceptionString = ctx.GetExceptionString(); if (logger != null) { logger.Write(LogLevel.Error, exceptionString); } } else { var argv = stackalloc JSValue[1] { data }; var rval = JSApi.JS_Call(ctx, onmessage, globalObject, 1, argv); JSApi.JS_FreeValue(ctx, rval); } } byteBuffer.Release(); } list.Clear(); } var now = Environment.TickCount; var dt = now - tick; tick = now; _runtime.Update(dt); } JSApi.JS_FreeValue(ctx, onmessage); JSApi.JS_FreeValue(ctx, globalObject); _runtime.Destroy(); }
private void Run() { var tick = Environment.TickCount; var list = new List <IO.ByteBuffer>(); var context = _runtime.GetMainContext(); var logger = _runtime.GetLogger(); while (_runtime.isRunning) { lock (_inbox) { list.AddRange(_inbox); _inbox.Clear(); } if (list.Count == 0) { Thread.Yield(); } else { JSContext ctx = context; var globalObject = context.GetGlobalObject(); var onmessage = JSApi.JS_GetPropertyStr(context, globalObject, "onmessage"); var callable = JSApi.JS_IsFunction(ctx, onmessage) == 1; for (int i = 0, count = list.Count; i < count; i++) { var byteBuffer = list[i]; if (callable) { unsafe { JSValue data; fixed(byte *buf = byteBuffer.data) { data = JSApi.JS_ReadObject(ctx, buf, byteBuffer.readableBytes, JSApi.JS_READ_OBJ_REFERENCE); } do { if (!data.IsException()) { var evt = JSApi.JS_NewObject(ctx); if (!evt.IsException()) { JSApi.JS_SetProperty(ctx, evt, context.GetAtom("data"), data); var argv = stackalloc JSValue[1] { evt }; var rval = JSApi.JS_Call(ctx, onmessage, globalObject, 1, argv); JSApi.JS_FreeValue(ctx, rval); JSApi.JS_FreeValue(ctx, evt); break; } else { JSApi.JS_FreeValue(ctx, data); } } var exceptionString = ctx.GetExceptionString(); if (logger != null) { logger.Write(LogLevel.Error, exceptionString); } } while (false); } } byteBuffer.Release(); } JSApi.JS_FreeValue(ctx, onmessage); JSApi.JS_FreeValue(ctx, globalObject); list.Clear(); } var now = Environment.TickCount; if (now < tick) { _runtime.Update((now - int.MinValue) + (int.MaxValue - tick)); } else { _runtime.Update(now - tick); } tick = now; } _runtime.Destroy(); }