Created
December 22, 2017 06:07
-
-
Save dested/22b4fc55fb1b4b92166ddd6d50a36533 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| function Evaluate(method, parameters) { | |
| var instructionsOld = method.Instructions; | |
| var stack = new Array(method.MaxStack); | |
| var locals = new Array(method.LocalCount); | |
| // var True = this.True; | |
| // var False = this.False; | |
| var lastStack; | |
| var tempQ; | |
| var tempIndex1; | |
| var tempParameters; | |
| var tempIndex2; | |
| var stackIndex = 0; | |
| var i = -1; | |
| var j; | |
| var instruction; | |
| while (true) { | |
| i++; | |
| // coutner++; | |
| instruction = instructionsOld[i]; | |
| switch (instruction.Type) { | |
| case "AddInt": | |
| tempIndex1 = stackIndex - 2; | |
| tempIndex2 = stackIndex - 1; | |
| stack[tempIndex1] = stack[tempIndex1] + stack[tempIndex2]; | |
| stackIndex = tempIndex2; | |
| break; | |
| case "AddString": | |
| tempIndex1 = stackIndex - 2; | |
| tempIndex2 = stackIndex - 1; | |
| stack[tempIndex1] = stack[tempIndex1] + stack[tempIndex2]; | |
| stackIndex = tempIndex2; | |
| break; | |
| case "AddIntString": | |
| tempIndex1 = stackIndex - 2; | |
| tempIndex2 = stackIndex - 1; | |
| stack[tempIndex1] = stack[tempIndex1] + stack[tempIndex2]; | |
| stackIndex = tempIndex2; | |
| break; | |
| case "AddStringInt": | |
| tempIndex1 = stackIndex - 2; | |
| tempIndex2 = stackIndex - 1; | |
| stack[tempIndex1] = stack[tempIndex1] + stack[tempIndex2]; | |
| stackIndex = tempIndex2; | |
| break; | |
| case "Goto": | |
| i = instruction.GotoIndex; | |
| break; | |
| case "Subtract": | |
| tempIndex1 = stackIndex - 2; | |
| tempIndex2 = stackIndex - 1; | |
| stack[tempIndex1] = stack[tempIndex1] - stack[tempIndex2]; | |
| stackIndex = tempIndex2; | |
| break; | |
| case "Multiply": | |
| tempIndex1 = stackIndex - 2; | |
| tempIndex2 = stackIndex - 1; | |
| stack[tempIndex1] = stack[tempIndex1] * stack[tempIndex2]; | |
| stackIndex = tempIndex2; | |
| break; | |
| case "Divide": | |
| tempIndex1 = stackIndex - 2; | |
| tempIndex2 = stackIndex - 1; | |
| stack[tempIndex1] = stack[tempIndex1] / stack[tempIndex2]; | |
| stackIndex = tempIndex2; | |
| break; | |
| case "And": | |
| tempIndex1 = stackIndex - 2; | |
| tempIndex2 = stackIndex - 1; | |
| stack[tempIndex1] = (stack[tempIndex1] && stack[tempIndex2]); | |
| stackIndex = tempIndex2; | |
| break; | |
| case "Or": | |
| tempIndex1 = stackIndex - 2; | |
| tempIndex2 = stackIndex - 1; | |
| stack[tempIndex1] = (stack[tempIndex1] || stack[tempIndex2]); | |
| stackIndex = tempIndex2; | |
| break; | |
| case "Not": | |
| tempIndex1 = stackIndex - 1; | |
| stack[tempIndex1] = (!stack[tempIndex1]); | |
| break; | |
| case "LessThanEqual": | |
| tempIndex1 = stackIndex - 2; | |
| tempIndex2 = stackIndex - 1; | |
| stack[tempIndex1] = (stack[tempIndex1] <= stack[tempIndex2]); | |
| stackIndex = tempIndex2; | |
| break; | |
| case "BoolEqual": | |
| tempIndex1 = stackIndex - 2; | |
| tempIndex2 = stackIndex - 1; | |
| stack[tempIndex1] = (stack[tempIndex1].Equals(stack[tempIndex2])); | |
| stackIndex = tempIndex2; | |
| break; | |
| case "IntEqual": | |
| tempIndex1 = stackIndex - 2; | |
| tempIndex2 = stackIndex - 1; | |
| stack[tempIndex1] = (stack[tempIndex1].Equals(stack[tempIndex2])); | |
| stackIndex = tempIndex2; | |
| break; | |
| case "StringEqual": | |
| tempIndex1 = stackIndex - 2; | |
| tempIndex2 = stackIndex - 1; | |
| stack[tempIndex1] = stack[tempIndex1] == stack[tempIndex2]; | |
| stackIndex = tempIndex2; | |
| break; | |
| case "LessThan": | |
| tempIndex1 = stackIndex - 2; | |
| tempIndex2 = stackIndex - 1; | |
| stack[tempIndex1] = (stack[tempIndex1] < stack[tempIndex2]); | |
| stackIndex = tempIndex2; | |
| break; | |
| case "GreaterThanEqual": | |
| tempIndex1 = stackIndex - 2; | |
| tempIndex2 = stackIndex - 1; | |
| stack[tempIndex1] = (stack[tempIndex1] >= stack[tempIndex2]); | |
| stackIndex = tempIndex2; | |
| break; | |
| case "GreaterThan": | |
| tempIndex1 = stackIndex - 2; | |
| tempIndex2 = stackIndex - 1; | |
| stack[tempIndex1] = (stack[tempIndex1] > stack[tempIndex2]); | |
| stackIndex = tempIndex2; | |
| break; | |
| case "GetParam": | |
| stack[stackIndex++] = parameters[instruction.ParamIndex]; | |
| break; | |
| case "GetParam0": | |
| stack[stackIndex++] = parameters[0]; | |
| break; | |
| case "GetParam1": | |
| stack[stackIndex++] = parameters[1]; | |
| break; | |
| case "GetParam2": | |
| stack[stackIndex++] = parameters[2]; | |
| break; | |
| case "GetParam3": | |
| stack[stackIndex++] = parameters[3]; | |
| break; | |
| case "GetIntConstant": | |
| stack[stackIndex++] = instruction.IntConstant; | |
| break; | |
| case "GetIntConstant0": | |
| stack[stackIndex++] = 0; | |
| break; | |
| case "GetIntConstant1": | |
| stack[stackIndex++] = 1; | |
| break; | |
| case "GetIntConstant2": | |
| stack[stackIndex++] = 2; | |
| break; | |
| case "GetIntConstant3": | |
| stack[stackIndex++] = 3; | |
| break; | |
| case "GetIntConstant4": | |
| stack[stackIndex++] = 4; | |
| break; | |
| case "GetBoolConstant": | |
| stack[stackIndex++] = instruction.BoolConstant; | |
| break; | |
| case "GetStringConstant": | |
| stack[stackIndex++] = instruction.StringConstant; | |
| break; | |
| case "StoreField": | |
| lastStack = stack[--stackIndex]; | |
| lastStack.Fields[instruction.VariableID] = stack[--stackIndex]; | |
| break; | |
| case "StoreToReference": | |
| lastStack = stack[stackIndex - 2]; | |
| //same as store field without discarding the stack object | |
| lastStack.Fields[instruction.VariableID] = stack[--stackIndex]; | |
| break; | |
| case "StoreLocal": | |
| locals[instruction.VariableID] = stack[--stackIndex]; | |
| break; | |
| case "GetField": | |
| tempIndex1 = stackIndex - 1; | |
| stack[tempIndex1] = stack[tempIndex1].Fields[instruction.VariableID]; | |
| break; | |
| case "PlusPlusLocal": | |
| locals[instruction.VariableID]++; | |
| break; | |
| case "PlusPlusField": | |
| lastStack = stack[--stackIndex]; | |
| lastStack.Fields[instruction.VariableID]++; | |
| break; | |
| case "GetLocal": | |
| stack[stackIndex++] = locals[instruction.VariableID]; | |
| break; | |
| case "CreateReference": | |
| lastStack = createInstance(instruction.VariableID); | |
| if (instruction.VariableID > -1) { | |
| Evaluate(Methods[instruction.MethodID], [lastStack]); | |
| } | |
| stack[stackIndex++] = lastStack; | |
| break; | |
| case "CreateArray": | |
| lastStack = createArray(); | |
| stack[stackIndex++] = lastStack; | |
| break; | |
| case "CallMethod": | |
| tempParameters = new Array(instruction.ParamCount + 1); | |
| for (j = instruction.ParamCount; j >= 0; j--) { | |
| tempParameters[j] = stack[--stackIndex]; | |
| } | |
| stack[stackIndex++] = Evaluate(Methods[instruction.MethodID], tempParameters); | |
| break; | |
| case "CallInternal": | |
| tempParameters = new Array(instruction.ParamCount); | |
| for (j = instruction.ParamCount - 1; j >= 0; j--) { | |
| tempParameters[j] = stack[--stackIndex]; | |
| } | |
| stack[stackIndex++] = InternalMethods[instruction.MethodID](tempParameters); | |
| break; | |
| case "BreakpointInstruction": | |
| break; | |
| case "AddToArray": | |
| lastStack = stack[--stackIndex]; | |
| var dmb = stack[stackIndex - 1]; | |
| dmb.Items[dmb.CurrentArrayLength++] = lastStack; | |
| break; | |
| case "RemoveToArray": | |
| // throw new Exception("g"); | |
| lastStack = stack[--stackIndex]; | |
| tempQ = stack[stackIndex - 1]; | |
| tempParameters = tempQ.Items; | |
| for (j = tempQ.CurrentArraySize - 1; j >= 0; j--) { | |
| if (tempParameters[j].Equals(lastStack)) { | |
| tempQ.RemoveAtArray(j); | |
| } | |
| } | |
| break; | |
| case "InsertToArray": | |
| tempParameters = new Array(2); | |
| for (j = 2 - 1; j >= 0; j--) { | |
| tempParameters[j] = stack[--stackIndex]; | |
| } | |
| for (j = stack[stackIndex - 1].CurrentArraySize - 1; j >= tempParameters[0]; j--) { | |
| ArrayItems[j + 1] = ArrayItems[j]; | |
| } | |
| stack[stackIndex - 1].Items[tempParameters[0]] = tempParameters[1]; | |
| stack[stackIndex - 1].CurrentArraySize++; | |
| break; | |
| case "LengthOfArray": | |
| lastStack = stack[--stackIndex]; | |
| stack[stackIndex++] = lastStack.CurrentArrayLength; | |
| break; | |
| case "ArrayElem": | |
| lastStack = stack[--stackIndex]; | |
| stack[stackIndex - 1] = stack[stackIndex - 1].Items[lastStack]; | |
| break; | |
| case "Return": | |
| if (instruction.EmptyReturn) return null; | |
| return stack[--stackIndex]; | |
| break; | |
| case "PopStack": | |
| stackIndex--; | |
| break; | |
| case "IsTrue": | |
| if (stack[--stackIndex]) { | |
| continue; | |
| } | |
| else { | |
| if (instruction.ElseLine == -1) i = instruction.IfLine; | |
| else i = instruction.ElseLine; | |
| } | |
| break; | |
| default: | |
| throw "Fuck"; | |
| } | |
| } | |
| return null; | |
| } | |
| function createInstance(count) { | |
| return { | |
| Fields: new Array(count) | |
| }; | |
| } | |
| function createArray() { | |
| return { | |
| Items: new Array(18), | |
| CurrentArrayLength: 0 | |
| }; | |
| } | |
| counter = 0; | |
| InternalMethods = [function (f) { | |
| counter++; | |
| document.getElementById('someID').innerHTML += f[0]; | |
| }, function (f) { | |
| counter++; | |
| document.getElementById('someID').innerHTML += f[0]+"<br />"; | |
| }, function (f) { | |
| counter++; | |
| document.getElementById('someID').innerHTML += f[0]; | |
| }, function (f) { | |
| return 0; | |
| } //document.getElementById('someID').innerHTML = ""; | |
| , function (f) { | |
| return input(); | |
| }, function (f) { | |
| return 0; | |
| }]; | |
| function doSome() { | |
| var dccc = Evaluate(Methods[0], [createInstance(0)]); | |
| alert(counter); | |
| } | |
| Methods = [{ | |
| MaxStack: 5, | |
| LocalCount: 4, | |
| Instructions: [{ | |
| Type: "CreateArray" | |
| }, | |
| { | |
| Type: "GetParam0" | |
| }, | |
| { | |
| Type: "StoreField", | |
| VariableID: 0 | |
| }, | |
| { | |
| Type: "CreateArray" | |
| }, | |
| { | |
| Type: "GetParam0" | |
| }, | |
| { | |
| Type: "StoreField", | |
| VariableID: 1 | |
| }, | |
| { | |
| Type: "CreateArray" | |
| }, | |
| { | |
| Type: "GetParam0" | |
| }, | |
| { | |
| Type: "StoreField", | |
| VariableID: 2 | |
| }, | |
| { | |
| Type: "GetIntConstant", | |
| IntConstant: 20 | |
| }, | |
| { | |
| Type: "StoreLocal", | |
| VariableID: 0 | |
| }, | |
| { | |
| Type: "GetStringConstant", | |
| StringConstant: 'START' | |
| }, | |
| { | |
| Type: "CallInternal", | |
| ParamCount: 1, | |
| MethodID: 2 | |
| }, | |
| { | |
| Type: "PopStack" | |
| }, | |
| { | |
| Type: "GetParam0" | |
| }, | |
| { | |
| Type: "GetIntConstant1" | |
| }, | |
| { | |
| Type: "GetLocal", | |
| VariableID: 0 | |
| }, | |
| { | |
| Type: "GetIntConstant1" | |
| }, | |
| { | |
| Type: "CallMethod", | |
| ParamCount: 3, | |
| MethodID: 2 | |
| }, | |
| { | |
| Type: "StoreLocal", | |
| VariableID: 2 | |
| }, | |
| { | |
| Type: "GetIntConstant0" | |
| }, | |
| { | |
| Type: "StoreLocal", | |
| VariableID: 3 | |
| }, | |
| { | |
| Type: "GetLocal", | |
| VariableID: 3 | |
| }, | |
| { | |
| Type: "GetLocal", | |
| VariableID: 2 | |
| }, | |
| { | |
| Type: "LengthOfArray" | |
| }, | |
| { | |
| Type: "LessThan" | |
| }, | |
| { | |
| Type: "IsTrue", | |
| IfLine: -1, | |
| ElseLine: 37 | |
| }, | |
| { | |
| Type: "GetLocal", | |
| VariableID: 2 | |
| }, | |
| { | |
| Type: "GetLocal", | |
| VariableID: 3 | |
| }, | |
| { | |
| Type: "ArrayElem" | |
| }, | |
| { | |
| Type: "StoreLocal", | |
| VariableID: 1 | |
| }, | |
| { | |
| Type: "GetParam0" | |
| }, | |
| { | |
| Type: "GetField", | |
| VariableID: 0 | |
| }, | |
| { | |
| Type: "GetLocal", | |
| VariableID: 1 | |
| }, | |
| { | |
| Type: "AddToArray" | |
| }, | |
| { | |
| Type: "PopStack" | |
| }, | |
| { | |
| Type: "PlusPlusLocal", | |
| VariableID: 3 | |
| }, | |
| { | |
| Type: "Goto", | |
| GotoIndex: 21 | |
| }, | |
| { | |
| Type: "GetParam0" | |
| }, | |
| { | |
| Type: "CallMethod", | |
| ParamCount: 0, | |
| MethodID: 1 | |
| }, | |
| { | |
| Type: "PopStack" | |
| }, | |
| { | |
| Type: "GetParam0" | |
| }, | |
| { | |
| Type: "GetLocal", | |
| VariableID: 0 | |
| }, | |
| { | |
| Type: "GetIntConstant1" | |
| }, | |
| { | |
| Type: "Subtract" | |
| }, | |
| { | |
| Type: "GetStringConstant", | |
| StringConstant: '1' | |
| }, | |
| { | |
| Type: "GetStringConstant", | |
| StringConstant: '3' | |
| }, | |
| { | |
| Type: "GetStringConstant", | |
| StringConstant: '2' | |
| }, | |
| { | |
| Type: "CallMethod", | |
| ParamCount: 4, | |
| MethodID: 3 | |
| }, | |
| { | |
| Type: "PopStack" | |
| }, | |
| { | |
| Type: "GetStringConstant", | |
| StringConstant: 'DONE' | |
| }, | |
| { | |
| Type: "CallInternal", | |
| ParamCount: 1, | |
| MethodID: 2 | |
| }, | |
| { | |
| Type: "PopStack" | |
| }, | |
| { | |
| Type: "Return", | |
| EmptyReturn: true | |
| }] | |
| }, | |
| { | |
| MaxStack: 2, | |
| LocalCount: 13, | |
| Instructions: [{ | |
| Type: "GetIntConstant1" | |
| }, | |
| { | |
| Type: "StoreLocal", | |
| VariableID: 0 | |
| }, | |
| { | |
| Type: "GetStringConstant", | |
| StringConstant: ' ' | |
| }, | |
| { | |
| Type: "StoreLocal", | |
| VariableID: 1 | |
| }, | |
| { | |
| Type: "GetStringConstant", | |
| StringConstant: '0' | |
| }, | |
| { | |
| Type: "StoreLocal", | |
| VariableID: 2 | |
| }, | |
| { | |
| Type: "GetIntConstant0" | |
| }, | |
| { | |
| Type: "StoreLocal", | |
| VariableID: 3 | |
| }, | |
| { | |
| Type: "GetParam0" | |
| }, | |
| { | |
| Type: "GetField", | |
| VariableID: 0 | |
| }, | |
| { | |
| Type: "StoreLocal", | |
| VariableID: 5 | |
| }, | |
| { | |
| Type: "GetIntConstant0" | |
| }, | |
| { | |
| Type: "StoreLocal", | |
| VariableID: 6 | |
| }, | |
| { | |
| Type: "GetLocal", | |
| VariableID: 6 | |
| }, | |
| { | |
| Type: "GetLocal", | |
| VariableID: 5 | |
| }, | |
| { | |
| Type: "LengthOfArray" | |
| }, | |
| { | |
| Type: "LessThan" | |
| }, | |
| { | |
| Type: "IsTrue", | |
| IfLine: -1, | |
| ElseLine: 44 | |
| }, | |
| { | |
| Type: "GetLocal", | |
| VariableID: 5 | |
| }, | |
| { | |
| Type: "GetLocal", | |
| VariableID: 6 | |
| }, | |
| { | |
| Type: "ArrayElem" | |
| }, | |
| { | |
| Type: "StoreLocal", | |
| VariableID: 4 | |
| }, | |
| { | |
| Type: "GetLocal", | |
| VariableID: 3 | |
| }, | |
| { | |
| Type: "GetLocal", | |
| VariableID: 0 | |
| }, | |
| { | |
| Type: "CallInternal", | |
| ParamCount: 2, | |
| MethodID: 5 | |
| }, | |
| { | |
| Type: "PopStack" | |
| }, | |
| { | |
| Type: "GetLocal", | |
| VariableID: 4 | |
| }, | |
| { | |
| Type: "GetIntConstant", | |
| IntConstant: 10 | |
| }, | |
| { | |
| Type: "LessThan" | |
| }, | |
| { | |
| Type: "IsTrue", | |
| IfLine: 32, | |
| ElseLine: -1 | |
| }, | |
| { | |
| Type: "GetLocal", | |
| VariableID: 2 | |
| }, | |
| { | |
| Type: "CallInternal", | |
| ParamCount: 1, | |
| MethodID: 1 | |
| }, | |
| { | |
| Type: "PopStack" | |
| }, | |
| { | |
| Type: "GetLocal", | |
| VariableID: 4 | |
| }, | |
| { | |
| Type: "CallInternal", | |
| ParamCount: 1, | |
| MethodID: 1 | |
| }, | |
| { | |
| Type: "PopStack" | |
| }, | |
| { | |
| Type: "GetLocal", | |
| VariableID: 1 | |
| }, | |
| { | |
| Type: "CallInternal", | |
| ParamCount: 1, | |
| MethodID: 1 | |
| }, | |
| { | |
| Type: "PopStack" | |
| }, | |
| { | |
| Type: "GetLocal", | |
| VariableID: 0 | |
| }, | |
| { | |
| Type: "GetIntConstant1" | |
| }, | |
| { | |
| Type: "AddInt" | |
| }, | |
| { | |
| Type: "StoreLocal", | |
| VariableID: 0 | |
| }, | |
| { | |
| Type: "PlusPlusLocal", | |
| VariableID: 6 | |
| }, | |
| { | |
| Type: "Goto", | |
| GotoIndex: 12 | |
| }, | |
| { | |
| Type: "GetIntConstant1" | |
| }, | |
| { | |
| Type: "StoreLocal", | |
| VariableID: 0 | |
| }, | |
| { | |
| Type: "GetLocal", | |
| VariableID: 3 | |
| }, | |
| { | |
| Type: "GetIntConstant3" | |
| }, | |
| { | |
| Type: "AddInt" | |
| }, | |
| { | |
| Type: "StoreLocal", | |
| VariableID: 3 | |
| }, | |
| { | |
| Type: "GetParam0" | |
| }, | |
| { | |
| Type: "GetField", | |
| VariableID: 1 | |
| }, | |
| { | |
| Type: "StoreLocal", | |
| VariableID: 8 | |
| }, | |
| { | |
| Type: "GetIntConstant0" | |
| }, | |
| { | |
| Type: "StoreLocal", | |
| VariableID: 9 | |
| }, | |
| { | |
| Type: "GetLocal", | |
| VariableID: 9 | |
| }, | |
| { | |
| Type: "GetLocal", | |
| VariableID: 8 | |
| }, | |
| { | |
| Type: "LengthOfArray" | |
| }, | |
| { | |
| Type: "LessThan" | |
| }, | |
| { | |
| Type: "IsTrue", | |
| IfLine: -1, | |
| ElseLine: 87 | |
| }, | |
| { | |
| Type: "GetLocal", | |
| VariableID: 8 | |
| }, | |
| { | |
| Type: "GetLocal", | |
| VariableID: 9 | |
| }, | |
| { | |
| Type: "ArrayElem" | |
| }, | |
| { | |
| Type: "StoreLocal", | |
| VariableID: 7 | |
| }, | |
| { | |
| Type: "GetLocal", | |
| VariableID: 3 | |
| }, | |
| { | |
| Type: "GetLocal", | |
| VariableID: 0 | |
| }, | |
| { | |
| Type: "CallInternal", | |
| ParamCount: 2, | |
| MethodID: 5 | |
| }, | |
| { | |
| Type: "PopStack" | |
| }, | |
| { | |
| Type: "GetLocal", | |
| VariableID: 7 | |
| }, | |
| { | |
| Type: "GetIntConstant", | |
| IntConstant: 10 | |
| }, | |
| { | |
| Type: "LessThan" | |
| }, | |
| { | |
| Type: "IsTrue", | |
| IfLine: 75, | |
| ElseLine: -1 | |
| }, | |
| { | |
| Type: "GetLocal", | |
| VariableID: 2 | |
| }, | |
| { | |
| Type: "CallInternal", | |
| ParamCount: 1, | |
| MethodID: 1 | |
| }, | |
| { | |
| Type: "PopStack" | |
| }, | |
| { | |
| Type: "GetLocal", | |
| VariableID: 7 | |
| }, | |
| { | |
| Type: "CallInternal", | |
| ParamCount: 1, | |
| MethodID: 1 | |
| }, | |
| { | |
| Type: "PopStack" | |
| }, | |
| { | |
| Type: "GetLocal", | |
| VariableID: 1 | |
| }, | |
| { | |
| Type: "CallInternal", | |
| ParamCount: 1, | |
| MethodID: 1 | |
| }, | |
| { | |
| Type: "PopStack" | |
| }, | |
| { | |
| Type: "GetLocal", | |
| VariableID: 0 | |
| }, | |
| { | |
| Type: "GetIntConstant1" | |
| }, | |
| { | |
| Type: "AddInt" | |
| }, | |
| { | |
| Type: "StoreLocal", | |
| VariableID: 0 | |
| }, | |
| { | |
| Type: "PlusPlusLocal", | |
| VariableID: 9 | |
| }, | |
| { | |
| Type: "Goto", | |
| GotoIndex: 55 | |
| }, | |
| { | |
| Type: "GetIntConstant1" | |
| }, | |
| { | |
| Type: "StoreLocal", | |
| VariableID: 0 | |
| }, | |
| { | |
| Type: "GetLocal", | |
| VariableID: 3 | |
| }, | |
| { | |
| Type: "GetIntConstant3" | |
| }, | |
| { | |
| Type: "AddInt" | |
| }, | |
| { | |
| Type: "StoreLocal", | |
| VariableID: 3 | |
| }, | |
| { | |
| Type: "GetParam0" | |
| }, | |
| { | |
| Type: "GetField", | |
| VariableID: 2 | |
| }, | |
| { | |
| Type: "StoreLocal", | |
| VariableID: 11 | |
| }, | |
| { | |
| Type: "GetIntConstant0" | |
| }, | |
| { | |
| Type: "StoreLocal", | |
| VariableID: 12 | |
| }, | |
| { | |
| Type: "GetLocal", | |
| VariableID: 12 | |
| }, | |
| { | |
| Type: "GetLocal", | |
| VariableID: 11 | |
| }, | |
| { | |
| Type: "LengthOfArray" | |
| }, | |
| { | |
| Type: "LessThan" | |
| }, | |
| { | |
| Type: "IsTrue", | |
| IfLine: -1, | |
| ElseLine: 130 | |
| }, | |
| { | |
| Type: "GetLocal", | |
| VariableID: 11 | |
| }, | |
| { | |
| Type: "GetLocal", | |
| VariableID: 12 | |
| }, | |
| { | |
| Type: "ArrayElem" | |
| }, | |
| { | |
| Type: "StoreLocal", | |
| VariableID: 10 | |
| }, | |
| { | |
| Type: "GetLocal", | |
| VariableID: 3 | |
| }, | |
| { | |
| Type: "GetLocal", | |
| VariableID: 0 | |
| }, | |
| { | |
| Type: "CallInternal", | |
| ParamCount: 2, | |
| MethodID: 5 | |
| }, | |
| { | |
| Type: "PopStack" | |
| }, | |
| { | |
| Type: "GetLocal", | |
| VariableID: 10 | |
| }, | |
| { | |
| Type: "GetIntConstant", | |
| IntConstant: 10 | |
| }, | |
| { | |
| Type: "LessThan" | |
| }, | |
| { | |
| Type: "IsTrue", | |
| IfLine: 118, | |
| ElseLine: -1 | |
| }, | |
| { | |
| Type: "GetLocal", | |
| VariableID: 2 | |
| }, | |
| { | |
| Type: "CallInternal", | |
| ParamCount: 1, | |
| MethodID: 1 | |
| }, | |
| { | |
| Type: "PopStack" | |
| }, | |
| { | |
| Type: "GetLocal", | |
| VariableID: 10 | |
| }, | |
| { | |
| Type: "CallInternal", | |
| ParamCount: 1, | |
| MethodID: 1 | |
| }, | |
| { | |
| Type: "PopStack" | |
| }, | |
| { | |
| Type: "GetLocal", | |
| VariableID: 1 | |
| }, | |
| { | |
| Type: "CallInternal", | |
| ParamCount: 1, | |
| MethodID: 1 | |
| }, | |
| { | |
| Type: "PopStack" | |
| }, | |
| { | |
| Type: "GetLocal", | |
| VariableID: 0 | |
| }, | |
| { | |
| Type: "GetIntConstant1" | |
| }, | |
| { | |
| Type: "AddInt" | |
| }, | |
| { | |
| Type: "StoreLocal", | |
| VariableID: 0 | |
| }, | |
| { | |
| Type: "PlusPlusLocal", | |
| VariableID: 12 | |
| }, | |
| { | |
| Type: "Goto", | |
| GotoIndex: 98 | |
| }, | |
| { | |
| Type: "Return", | |
| EmptyReturn: true | |
| }] | |
| }, | |
| { | |
| MaxStack: 2, | |
| LocalCount: 2, | |
| Instructions: [{ | |
| Type: "GetParam1" | |
| }, | |
| { | |
| Type: "StoreLocal", | |
| VariableID: 0 | |
| }, | |
| { | |
| Type: "CreateArray" | |
| }, | |
| { | |
| Type: "StoreLocal", | |
| VariableID: 1 | |
| }, | |
| { | |
| Type: "GetLocal", | |
| VariableID: 0 | |
| }, | |
| { | |
| Type: "GetParam2" | |
| }, | |
| { | |
| Type: "LessThan" | |
| }, | |
| { | |
| Type: "IsTrue", | |
| IfLine: 16, | |
| ElseLine: -1 | |
| }, | |
| { | |
| Type: "GetLocal", | |
| VariableID: 1 | |
| }, | |
| { | |
| Type: "GetLocal", | |
| VariableID: 0 | |
| }, | |
| { | |
| Type: "AddToArray" | |
| }, | |
| { | |
| Type: "PopStack" | |
| }, | |
| { | |
| Type: "GetLocal", | |
| VariableID: 0 | |
| }, | |
| { | |
| Type: "GetParam3" | |
| }, | |
| { | |
| Type: "AddInt" | |
| }, | |
| { | |
| Type: "StoreLocal", | |
| VariableID: 0 | |
| }, | |
| { | |
| Type: "Goto", | |
| GotoIndex: 3 | |
| }, | |
| { | |
| Type: "GetLocal", | |
| VariableID: 1 | |
| }, | |
| { | |
| Type: "Return", | |
| EmptyReturn: false | |
| }, | |
| { | |
| Type: "Return", | |
| EmptyReturn: true | |
| }] | |
| }, | |
| { | |
| MaxStack: 5, | |
| LocalCount: 0, | |
| Instructions: [{ | |
| Type: "GetParam1" | |
| }, | |
| { | |
| Type: "GetIntConstant0" | |
| }, | |
| { | |
| Type: "GreaterThan" | |
| }, | |
| { | |
| Type: "IsTrue", | |
| IfLine: 27, | |
| ElseLine: -1 | |
| }, | |
| { | |
| Type: "GetParam0" | |
| }, | |
| { | |
| Type: "GetParam1" | |
| }, | |
| { | |
| Type: "GetIntConstant1" | |
| }, | |
| { | |
| Type: "Subtract" | |
| }, | |
| { | |
| Type: "GetParam2" | |
| }, | |
| { | |
| Type: "GetParam", | |
| ParamIndex: 4 | |
| }, | |
| { | |
| Type: "GetParam3" | |
| }, | |
| { | |
| Type: "CallMethod", | |
| ParamCount: 4, | |
| MethodID: 3 | |
| }, | |
| { | |
| Type: "PopStack" | |
| }, | |
| { | |
| Type: "GetParam0" | |
| }, | |
| { | |
| Type: "GetParam1" | |
| }, | |
| { | |
| Type: "GetParam2" | |
| }, | |
| { | |
| Type: "GetParam3" | |
| }, | |
| { | |
| Type: "CallMethod", | |
| ParamCount: 3, | |
| MethodID: 4 | |
| }, | |
| { | |
| Type: "PopStack" | |
| }, | |
| { | |
| Type: "GetParam0" | |
| }, | |
| { | |
| Type: "GetParam1" | |
| }, | |
| { | |
| Type: "GetIntConstant1" | |
| }, | |
| { | |
| Type: "Subtract" | |
| }, | |
| { | |
| Type: "GetParam", | |
| ParamIndex: 4 | |
| }, | |
| { | |
| Type: "GetParam3" | |
| }, | |
| { | |
| Type: "GetParam2" | |
| }, | |
| { | |
| Type: "CallMethod", | |
| ParamCount: 4, | |
| MethodID: 3 | |
| }, | |
| { | |
| Type: "PopStack" | |
| }, | |
| { | |
| Type: "Return", | |
| EmptyReturn: true | |
| }] | |
| }, | |
| { | |
| MaxStack: 3, | |
| LocalCount: 0, | |
| Instructions: [{ | |
| Type: "GetIntConstant0" | |
| }, | |
| { | |
| Type: "GetIntConstant0" | |
| }, | |
| { | |
| Type: "CallInternal", | |
| ParamCount: 2, | |
| MethodID: 5 | |
| }, | |
| { | |
| Type: "PopStack" | |
| }, | |
| { | |
| Type: "CallInternal", | |
| ParamCount: 0, | |
| MethodID: 3 | |
| }, | |
| { | |
| Type: "PopStack" | |
| }, | |
| { | |
| Type: "GetStringConstant", | |
| StringConstant: 'Disk ' | |
| }, | |
| { | |
| Type: "CallInternal", | |
| ParamCount: 1, | |
| MethodID: 1 | |
| }, | |
| { | |
| Type: "PopStack" | |
| }, | |
| { | |
| Type: "GetParam1" | |
| }, | |
| { | |
| Type: "CallInternal", | |
| ParamCount: 1, | |
| MethodID: 1 | |
| }, | |
| { | |
| Type: "PopStack" | |
| }, | |
| { | |
| Type: "GetStringConstant", | |
| StringConstant: ' From ' | |
| }, | |
| { | |
| Type: "CallInternal", | |
| ParamCount: 1, | |
| MethodID: 1 | |
| }, | |
| { | |
| Type: "PopStack" | |
| }, | |
| { | |
| Type: "GetParam2" | |
| }, | |
| { | |
| Type: "CallInternal", | |
| ParamCount: 1, | |
| MethodID: 1 | |
| }, | |
| { | |
| Type: "PopStack" | |
| }, | |
| { | |
| Type: "GetStringConstant", | |
| StringConstant: ' To ' | |
| }, | |
| { | |
| Type: "CallInternal", | |
| ParamCount: 1, | |
| MethodID: 1 | |
| }, | |
| { | |
| Type: "PopStack" | |
| }, | |
| { | |
| Type: "GetParam3" | |
| }, | |
| { | |
| Type: "CallInternal", | |
| ParamCount: 1, | |
| MethodID: 2 | |
| }, | |
| { | |
| Type: "PopStack" | |
| }, | |
| { | |
| Type: "GetParam2" | |
| }, | |
| { | |
| Type: "GetStringConstant", | |
| StringConstant: '1' | |
| }, | |
| { | |
| Type: "StringEqual" | |
| }, | |
| { | |
| Type: "GetParam3" | |
| }, | |
| { | |
| Type: "GetStringConstant", | |
| StringConstant: '2' | |
| }, | |
| { | |
| Type: "StringEqual" | |
| }, | |
| { | |
| Type: "And" | |
| }, | |
| { | |
| Type: "IsTrue", | |
| IfLine: 43, | |
| ElseLine: -1 | |
| }, | |
| { | |
| Type: "GetParam0" | |
| }, | |
| { | |
| Type: "GetField", | |
| VariableID: 0 | |
| }, | |
| { | |
| Type: "GetParam1" | |
| }, | |
| { | |
| Type: "RemoveToArray" | |
| }, | |
| { | |
| Type: "PopStack" | |
| }, | |
| { | |
| Type: "GetParam0" | |
| }, | |
| { | |
| Type: "GetField", | |
| VariableID: 1 | |
| }, | |
| { | |
| Type: "GetIntConstant0" | |
| }, | |
| { | |
| Type: "GetParam1" | |
| }, | |
| { | |
| Type: "InsertToArray" | |
| }, | |
| { | |
| Type: "PopStack" | |
| }, | |
| { | |
| Type: "Return", | |
| EmptyReturn: true | |
| }, | |
| { | |
| Type: "GetParam2" | |
| }, | |
| { | |
| Type: "GetStringConstant", | |
| StringConstant: '1' | |
| }, | |
| { | |
| Type: "StringEqual" | |
| }, | |
| { | |
| Type: "GetParam3" | |
| }, | |
| { | |
| Type: "GetStringConstant", | |
| StringConstant: '3' | |
| }, | |
| { | |
| Type: "StringEqual" | |
| }, | |
| { | |
| Type: "And" | |
| }, | |
| { | |
| Type: "IsTrue", | |
| IfLine: 63, | |
| ElseLine: -1 | |
| }, | |
| { | |
| Type: "GetParam0" | |
| }, | |
| { | |
| Type: "GetField", | |
| VariableID: 0 | |
| }, | |
| { | |
| Type: "GetParam1" | |
| }, | |
| { | |
| Type: "RemoveToArray" | |
| }, | |
| { | |
| Type: "PopStack" | |
| }, | |
| { | |
| Type: "GetParam0" | |
| }, | |
| { | |
| Type: "GetField", | |
| VariableID: 2 | |
| }, | |
| { | |
| Type: "GetIntConstant0" | |
| }, | |
| { | |
| Type: "GetParam1" | |
| }, | |
| { | |
| Type: "InsertToArray" | |
| }, | |
| { | |
| Type: "PopStack" | |
| }, | |
| { | |
| Type: "Return", | |
| EmptyReturn: true | |
| }, | |
| { | |
| Type: "GetParam2" | |
| }, | |
| { | |
| Type: "GetStringConstant", | |
| StringConstant: '2' | |
| }, | |
| { | |
| Type: "StringEqual" | |
| }, | |
| { | |
| Type: "GetParam3" | |
| }, | |
| { | |
| Type: "GetStringConstant", | |
| StringConstant: '1' | |
| }, | |
| { | |
| Type: "StringEqual" | |
| }, | |
| { | |
| Type: "And" | |
| }, | |
| { | |
| Type: "IsTrue", | |
| IfLine: 83, | |
| ElseLine: -1 | |
| }, | |
| { | |
| Type: "GetParam0" | |
| }, | |
| { | |
| Type: "GetField", | |
| VariableID: 1 | |
| }, | |
| { | |
| Type: "GetParam1" | |
| }, | |
| { | |
| Type: "RemoveToArray" | |
| }, | |
| { | |
| Type: "PopStack" | |
| }, | |
| { | |
| Type: "GetParam0" | |
| }, | |
| { | |
| Type: "GetField", | |
| VariableID: 0 | |
| }, | |
| { | |
| Type: "GetIntConstant0" | |
| }, | |
| { | |
| Type: "GetParam1" | |
| }, | |
| { | |
| Type: "InsertToArray" | |
| }, | |
| { | |
| Type: "PopStack" | |
| }, | |
| { | |
| Type: "Return", | |
| EmptyReturn: true | |
| }, | |
| { | |
| Type: "GetParam2" | |
| }, | |
| { | |
| Type: "GetStringConstant", | |
| StringConstant: '2' | |
| }, | |
| { | |
| Type: "StringEqual" | |
| }, | |
| { | |
| Type: "GetParam3" | |
| }, | |
| { | |
| Type: "GetStringConstant", | |
| StringConstant: '3' | |
| }, | |
| { | |
| Type: "StringEqual" | |
| }, | |
| { | |
| Type: "And" | |
| }, | |
| { | |
| Type: "IsTrue", | |
| IfLine: 103, | |
| ElseLine: -1 | |
| }, | |
| { | |
| Type: "GetParam0" | |
| }, | |
| { | |
| Type: "GetField", | |
| VariableID: 1 | |
| }, | |
| { | |
| Type: "GetParam1" | |
| }, | |
| { | |
| Type: "RemoveToArray" | |
| }, | |
| { | |
| Type: "PopStack" | |
| }, | |
| { | |
| Type: "GetParam0" | |
| }, | |
| { | |
| Type: "GetField", | |
| VariableID: 2 | |
| }, | |
| { | |
| Type: "GetIntConstant0" | |
| }, | |
| { | |
| Type: "GetParam1" | |
| }, | |
| { | |
| Type: "InsertToArray" | |
| }, | |
| { | |
| Type: "PopStack" | |
| }, | |
| { | |
| Type: "Return", | |
| EmptyReturn: true | |
| }, | |
| { | |
| Type: "GetParam2" | |
| }, | |
| { | |
| Type: "GetStringConstant", | |
| StringConstant: '3' | |
| }, | |
| { | |
| Type: "StringEqual" | |
| }, | |
| { | |
| Type: "GetParam3" | |
| }, | |
| { | |
| Type: "GetStringConstant", | |
| StringConstant: '2' | |
| }, | |
| { | |
| Type: "StringEqual" | |
| }, | |
| { | |
| Type: "And" | |
| }, | |
| { | |
| Type: "IsTrue", | |
| IfLine: 123, | |
| ElseLine: -1 | |
| }, | |
| { | |
| Type: "GetParam0" | |
| }, | |
| { | |
| Type: "GetField", | |
| VariableID: 2 | |
| }, | |
| { | |
| Type: "GetParam1" | |
| }, | |
| { | |
| Type: "RemoveToArray" | |
| }, | |
| { | |
| Type: "PopStack" | |
| }, | |
| { | |
| Type: "GetParam0" | |
| }, | |
| { | |
| Type: "GetField", | |
| VariableID: 1 | |
| }, | |
| { | |
| Type: "GetIntConstant0" | |
| }, | |
| { | |
| Type: "GetParam1" | |
| }, | |
| { | |
| Type: "InsertToArray" | |
| }, | |
| { | |
| Type: "PopStack" | |
| }, | |
| { | |
| Type: "Return", | |
| EmptyReturn: true | |
| }, | |
| { | |
| Type: "GetParam2" | |
| }, | |
| { | |
| Type: "GetStringConstant", | |
| StringConstant: '3' | |
| }, | |
| { | |
| Type: "StringEqual" | |
| }, | |
| { | |
| Type: "GetParam3" | |
| }, | |
| { | |
| Type: "GetStringConstant", | |
| StringConstant: '1' | |
| }, | |
| { | |
| Type: "StringEqual" | |
| }, | |
| { | |
| Type: "And" | |
| }, | |
| { | |
| Type: "IsTrue", | |
| IfLine: 143, | |
| ElseLine: -1 | |
| }, | |
| { | |
| Type: "GetParam0" | |
| }, | |
| { | |
| Type: "GetField", | |
| VariableID: 2 | |
| }, | |
| { | |
| Type: "GetParam1" | |
| }, | |
| { | |
| Type: "RemoveToArray" | |
| }, | |
| { | |
| Type: "PopStack" | |
| }, | |
| { | |
| Type: "GetParam0" | |
| }, | |
| { | |
| Type: "GetField", | |
| VariableID: 0 | |
| }, | |
| { | |
| Type: "GetIntConstant0" | |
| }, | |
| { | |
| Type: "GetParam1" | |
| }, | |
| { | |
| Type: "InsertToArray" | |
| }, | |
| { | |
| Type: "PopStack" | |
| }, | |
| { | |
| Type: "Return", | |
| EmptyReturn: true | |
| }, | |
| { | |
| Type: "Return", | |
| EmptyReturn: true | |
| }] | |
| }]; | |
| /* ACG | |
| Class Main | |
| Peg1=Create Int| | |
| Peg2=Create Int| | |
| Peg3=Create Int| | |
| Method Creator() | |
| counts=20 | |
| WriteLine("START") | |
| Loop This.MuRange(1,counts,1) Into R | |
| This.Peg1.Add(R) | |
| EndLoop | |
| This.Draw() | |
| This. doHanoi(counts-1, "1", "3", "2") | |
| WriteLine("DONE") | |
| EndMethod | |
| Method Draw() | |
| i=1 | |
| s=" " | |
| s2="0" | |
| G=0 | |
| Loop This.Peg1 Into P1 | |
| SetConsolePosition(G, i) | |
| if P1<10 | |
| Write(s2) | |
| Endif | |
| Write(P1) | |
| Write(s) | |
| i=i+1 | |
| EndLoop | |
| i=1 | |
| G=G+3 | |
| Loop This.Peg2 Into P2 | |
| SetConsolePosition(G, i) | |
| if P2<10 | |
| Write(s2) | |
| Endif | |
| Write(P2) | |
| Write(s) | |
| i=i+1 | |
| EndLoop | |
| i=1 | |
| G=G+3 | |
| Loop This.Peg3 Into P3 | |
| SetConsolePosition(G, i) | |
| if P3<10 | |
| Write(s2) | |
| Endif | |
| Write(P3) | |
| Write(s) | |
| i=i+1 | |
| EndLoop | |
| EndMethod | |
| Method MuRange(start,finish,countr) | |
| i=start | |
| items=Create Int| | |
| Loop While i<finish | |
| items.Add(i) | |
| i=i+countr | |
| EndLoop | |
| Return items | |
| EndMethod | |
| Method doHanoi(n, f, t, u) | |
| if n >0 | |
| This. doHanoi(n - 1, f, u, t) | |
| This. Move(n,f,t) | |
| ! This.Draw() | |
| This. doHanoi(n - 1, u, t, f) | |
| EndIf | |
| EndMethod | |
| Method Move(n,f,t) | |
| SetConsolePosition(0,0) | |
| ClearScreen() | |
| Write("Disk ") | |
| Write(n) | |
| Write(" From ") | |
| Write(f) | |
| Write(" To ") | |
| WriteLine(t) | |
| //ReadLine() | |
| if f="1" And (t="2") | |
| This.Peg1.Remove(n) | |
| This.Peg2.Insert(0,n) | |
| Return | |
| EndIf | |
| if f="1" And (t="3") | |
| This.Peg1.Remove(n) | |
| This.Peg3.Insert(0,n) | |
| Return | |
| EndIf | |
| if f="2" And (t="1") | |
| This.Peg2.Remove(n) | |
| This.Peg1.Insert(0,n) | |
| Return | |
| EndIf | |
| if f="2" And (t="3") | |
| This.Peg2.Remove(n) | |
| This.Peg3.Insert(0,n) | |
| Return | |
| EndIf | |
| if f="3" And (t="2") | |
| This.Peg3.Remove(n) | |
| This.Peg2.Insert(0,n) | |
| Return | |
| EndIf | |
| if f="3" And (t="1") | |
| This.Peg3.Remove(n) | |
| This.Peg1.Insert(0,n) | |
| Return | |
| EndIf | |
| EndMethod | |
| EndClass | |
| */ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment