public void Execute(Machine machine, Stack<object> stack, Scope scope, Instruction instr) { int length; string name; switch (instr) { default: throw new VMException("Something just went horribly wrong. Variable instructlet is not supposed to receive {0}", instr.ToString()); case Instruction.SetVar: length = (int)machine.TakeByte(); name = machine.TakeBytes(length).AsString(); machine.ExecuteNextInstructlet(); scope.SetVariable(name, stack.Pop()); break; case Instruction.GetVar: length = (int)machine.TakeByte(); name = machine.TakeBytes((int)length).AsString(); stack.Push(scope.GetVariable(name)); break; } }
public void Execute(Machine machine, Stack<object> stack, Scope scope, Instruction instr) { Instruction type = (Instruction)machine.TakeByte(); switch (type) { default: throw new VMException("Unhandled literal type: {0}", type.ToString()); case Instruction.TypeNumeral: byte[] numBytes = machine.TakeBytes(8); stack.Push(numBytes.AsDouble()); break; case Instruction.TypeString: double length = machine.TakeBytes(8).AsDouble(); string text = machine.TakeBytes((int)length * sizeof(char)).AsString(); stack.Push(text); break; case Instruction.TypeBoolean: stack.Push(Convert.ToBoolean(machine.TakeByte())); break; } }
public void Execute(Machine machine, Stack<object> stack, Scope scope, Instruction instr) { List<byte> funcBytecode = new List<byte>(); int nameLength = (int)machine.TakeByte(); string name = machine.TakeBytes(nameLength * sizeof(char)).AsString(); double funcLength = machine.TakeBytes(8).AsDouble(); funcBytecode.AddRange(machine.TakeBytes((int)funcLength)); scope.SetFunction(name, new Function(name, funcBytecode.ToArray())); }
public void Execute(Machine machine, Stack<object> stack, Scope scope, Instruction instr) { int length = (int)machine.TakeByte(); string name = machine.TakeBytes(length * sizeof(char)).AsString(); scope.GetFunction(name).Call(machine); }