예제 #1
0
파일: JsonParser.cs 프로젝트: djlw78/crayon
        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));
        }
예제 #2
0
파일: WindowUtil.cs 프로젝트: falun/crayon
            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();
            }
예제 #3
0
파일: WindowUtil.cs 프로젝트: falun/crayon
 public void InvokeHandler(string token)
 {
     if (token != null && token.Length != 0)
     {
         TranslationHelper.RunInterpreter(
             this.InvokeMenuHandlerFunctionPointer,
             new Value[] { CrayonWrapper.v_buildString(token) });
     }
 }
예제 #4
0
        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);
            }
        }
예제 #5
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);
        }
예제 #6
0
파일: JsonParser.cs 프로젝트: djlw78/crayon
        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();
        }
예제 #7
0
        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);
        }
예제 #8
0
파일: JsonParser.cs 프로젝트: djlw78/crayon
        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()));
        }
예제 #9
0
파일: JsonParser.cs 프로젝트: djlw78/crayon
        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()));
        }
예제 #10
0
        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());
        }
예제 #11
0
 public EventLoop(VmContext vm)
 {
     this.vm = vm;
     CrayonWrapper.vmSetEventLoopObj(vm, this);
 }
예제 #12
0
        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;
            }
        }
예제 #13
0
        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()));
        }
예제 #14
0
 internal static EventLoop GetEventLoop(Interpreter.Structs.VmContext vm)
 {
     return((EventLoop)CrayonWrapper.vmGetEventLoopObj(vm));
 }
예제 #15
0
파일: JsonParser.cs 프로젝트: falun/crayon
 private static Value WrapInteger(int value)
 {
     return(CrayonWrapper.v_buildInteger(value));
 }