private static Value ParseJsonList(VmGlobals globals, char[] rawValue, int length, Index i) { i.Value++; // '[' SkipWhitespace(rawValue, length, i); List <Value> items = new List <Value>(); while (i.Value < length && rawValue[i.Value] != ']') { if (items.Count > 0) { PopExpected(rawValue, length, i, ","); SkipWhitespace(rawValue, length, i); } Value item = ParseJsonThing(globals, rawValue, length, i); SkipWhitespace(rawValue, length, i); items.Add(item); } if (i.Value < length) { PopExpected(rawValue, length, i, "]"); } return(CrayonWrapper.buildList(items)); }
private void SizeChangedHandler(int newWidth, int newHeight) { int menuHeight = this.MenuShown ? this.MainMenuStrip.Height : 0; this.sizeRelay[0] = CrayonWrapper.v_buildInteger(newWidth); this.sizeRelay[1] = CrayonWrapper.v_buildInteger(newHeight - menuHeight); this.RunRenderer(); }
public void InvokeHandler(string token) { if (token != null && token.Length != 0) { TranslationHelper.RunInterpreter( this.InvokeMenuHandlerFunctionPointer, new Value[] { CrayonWrapper.v_buildString(token) }); } }
private void Update() { int vmStatus = CrayonWrapper.v_runInterpreter(this.executionContextId); if (vmStatus == 1 || // Finished vmStatus == 3) // Error { // Because sometimes once isn't enough. this.Close(); this.Exit(); System.Environment.Exit(0); } }
public static void CheckLoaderIsDone( object[] imageLoaderNativeData, object[] nativeImageDataNativeData, List <Value> output) { int status = 0; lock (imageLoaderNativeData[3]) { status = (int)imageLoaderNativeData[2]; } output[0] = CrayonWrapper.v_buildInteger(status); }
private static Value ParseJsonNumber(VmGlobals globals, char[] rawValue, int length, Index i) { int sign = 1; char c = rawValue[i.Value]; if (c == '-') { sign = -1; i.Value++; } StringBuilder sb = new StringBuilder(); while (i.Value < length) { c = rawValue[i.Value++]; if (c != '.' && (c < '0' || c > '9')) { i.Value--; break; } else { sb.Append(c); } } string stringValue = sb.ToString(); if (stringValue.Contains('.')) { double value; if (double.TryParse(stringValue, out value)) { return(CrayonWrapper.buildFloat(globals, value * sign)); } } else { int value; if (int.TryParse(stringValue, out value)) { return(CrayonWrapper.buildInteger(globals, value * sign)); } } throw new JsonParserException(); }
private static UniversalBitmap NormalizeBitmap(UniversalBitmap bitmap) { int oldWidth = bitmap.Width; int oldHeight = bitmap.Height; int newWidth = CrayonWrapper.nextPowerOf2(oldWidth); int newHeight = CrayonWrapper.nextPowerOf2(oldHeight); if (newWidth == oldWidth && newHeight == oldHeight) { return(bitmap); } UniversalBitmap newBmp = new UniversalBitmap(newWidth, newHeight); newBmp.GetActiveDrawingSession().Draw(bitmap, 0, 0, 0, 0, oldWidth, oldHeight).Flush(); return(newBmp); }
private static Value ParseJsonDictionary(VmGlobals globals, char[] rawValue, int length, Index i) { int stringTypeId = globals.stringEmpty.type; i.Value++; // '{' SkipWhitespace(rawValue, length, i); List <string> keys = new List <string>(); List <Value> values = new List <Value>(); while (i.Value < length && rawValue[i.Value] != '}') { if (keys.Count > 0) { PopExpected(rawValue, length, i, ","); SkipWhitespace(rawValue, length, i); } Value key = ParseJsonThing(globals, rawValue, length, i); if (key.type != stringTypeId) { throw new JsonParserException(); } SkipWhitespace(rawValue, length, i); PopExpected(rawValue, length, i, ":"); SkipWhitespace(rawValue, length, i); Value value = ParseJsonThing(globals, rawValue, length, i); SkipWhitespace(rawValue, length, i); keys.Add((string)key.internalValue); values.Add(value); } if (i.Value < length) { i.Value++; // '}' } else { throw new JsonParserException(); // EOF } return(CrayonWrapper.buildStringDictionary(globals, keys.ToArray(), values.ToArray())); }
private static Value ParseJsonString(VmGlobals globals, char[] rawValue, int length, Index i) { i.Value++; // opening quote StringBuilder sb = new StringBuilder(); while (i.Value < length && rawValue[i.Value] != '"') { char c = rawValue[i.Value++]; if (c == '\\') { switch (rawValue[i.Value++]) { case '\\': c = '\\'; break; case '"': c = '"'; break; case '\'': c = '\''; break; case 'n': c = '\n'; break; case 't': c = '\t'; break; case 'r': c = '\r'; break; case '0': c = '\0'; break; default: throw new JsonParserException(); } } sb.Append(c); } if (i.Value >= length) { throw new JsonParserException(); } i.Value++; // closing quote return(CrayonWrapper.buildString(globals, sb.ToString())); }
private Value ConvertNativeArg(object na) { if (na == null) { return(vm.globalNull); } if (na is Value) { return((Value)na); // allow mixed native/Value } if (na is bool) { return((bool)na ? vm.globalTrue : vm.globalFalse); } if (na is string) { return(CrayonWrapper.buildString(vm.globals, (string)na)); } if (na is int) { return(CrayonWrapper.buildInteger(vm.globals, (int)na)); } if (na is double) { return(CrayonWrapper.buildFloat(vm.globals, (double)na)); } if (na is float) { return(CrayonWrapper.buildFloat(vm.globals, (float)na)); } if (na is object[]) { List <Value> list = new List <Value>(((object[])na).Select(a => ConvertNativeArg(a))); return(CrayonWrapper.buildList(list)); } throw new NotImplementedException("Unsupported type for native arg: " + na.GetType()); }
public EventLoop(VmContext vm) { this.vm = vm; CrayonWrapper.vmSetEventLoopObj(vm, this); }
private void RunEventLoopIteration(EventLoopInvocation invocation) { // Debugger.INSTANCE.FlushMessageQueue(); if (invocation == null) { return; } InterpreterResult result; if (invocation.StartFromBeginning) { result = CrayonWrapper.startVm(vm); } else if (invocation.FunctionPointer != null) { Value[] args = invocation.FunctionPointerArgs; if (args == null) { object[] nativeArgs = invocation.FunctionPointerNativeArgs; args = new Value[nativeArgs.Length]; for (int i = 0; i < args.Length; ++i) { args[i] = ConvertNativeArg(nativeArgs[i]); } } result = CrayonWrapper.runInterpreterWithFunctionPointer(vm, invocation.FunctionPointer, args); } else { result = CrayonWrapper.runInterpreter(vm, invocation.ExecutionContextId); } switch (result.status) { case 1: // execution context is FINISHED if (result.isRootContext) { this.KillEventLoop(); } break; case 2: // SUSPEND // do nothing. break; case 3: // FATAL ERROR if (result.isRootContext) { this.KillEventLoop(); } break; case 5: // RE-INVOKE, possibly with a delay ResumeExecutionAfterDelay(result.executionContextId, result.reinvokeDelay); break; case 7: // BREAKPOINT // do nothing break; } if (!this.IsEventLoopAlive && this.completionCallback != null) { this.completionCallback(); this.completionCallback = null; } }
private static Value ParseJsonString(VmGlobals globals, char[] rawValue, int length, Index i) { i.Value++; // opening quote StringBuilder sb = new StringBuilder(); while (i.Value < length && rawValue[i.Value] != '"') { char c = rawValue[i.Value++]; if (c == '\\') { switch (rawValue[i.Value++]) { case '\\': sb.Append('\\'); break; case '"': sb.Append('"'); break; case '\'': sb.Append('\''); break; case 'n': sb.Append('\n'); break; case 't': sb.Append('\t'); break; case 'r': sb.Append('\r'); break; case '0': sb.Append('\0'); break; case 'u': if (i.Value + 4 < length) { char u1 = rawValue[i.Value]; char u2 = rawValue[i.Value + 1]; char u3 = rawValue[i.Value + 2]; char u4 = rawValue[i.Value + 3]; i.Value += 4; string hexValue = "" + u1 + u2 + u3 + u4; int value; if (!int.TryParse(hexValue, System.Globalization.NumberStyles.HexNumber, null, out value)) { throw new JsonParserException(); } sb.Append((char)value); } else { throw new JsonParserException(); } break; default: throw new JsonParserException(); } } else { sb.Append(c); } } if (i.Value >= length) { throw new JsonParserException(); } i.Value++; // closing quote return(CrayonWrapper.buildString(globals, sb.ToString())); }
internal static EventLoop GetEventLoop(Interpreter.Structs.VmContext vm) { return((EventLoop)CrayonWrapper.vmGetEventLoopObj(vm)); }
private static Value WrapInteger(int value) { return(CrayonWrapper.v_buildInteger(value)); }