further development of VM (added separate code stack)

--HG--
branch : mung
This commit is contained in:
cecilkorik 2010-11-19 01:30:40 +00:00
parent d3f845144e
commit b11356b0c3
2 changed files with 59 additions and 1 deletions

24
langdoc.txt Executable file
View file

@ -0,0 +1,24 @@
simple program:
while (1)
arg = "message";
send(#7407, arg);
suspend(1.0);
endwhile
bytecode:
startblock 1
stack_literal_int 1
exit_true 1
stack_literal_str "message"
set_var arg
discard_stack 1
get_var arg
stack_literal_obj #7407
call_builtin send
discard_stack 1
stack_literal_float 1.0
call_builtin suspend
discard_stack 1
endblock 1

View file

@ -7,11 +7,19 @@ class VirtualMachine(object):
self.db = db
self.active_task_id = None
self.sleepytime = None
self.codestack = []
self.stack = []
self.contexts = []
self.tasks = {}
self.task_sequence = []
self.ticks_used = 0
self.exception_thrown = None
def pop_code(self):
return self.code_stack.pop()
def push_code(self, code):
self.code_stack.append(code)
def pop(self, count=1):
return [uncoerce(self.stack.pop()) for x in range(count)]
@ -52,11 +60,29 @@ class VirtualMachine(object):
self.stack = task[1]
self.contexts = task[2]
self.ticks_used = task[3]
self.exception_thrown = None
def get_next_task(self):
heapq.heappop(self.task_sequence)
def run_active_task
def uncaught_exception(self):
pass
def run_active_task(self):
task_id = self.active_task_id
while task_id == self.active_task_id and self.code_stack and self.exception_thrown == None:
nextop = self.pop_code()
nextop.execute(self)
if self.exception_thrown != None:
self.uncaught_exception()
self.finished_start_next()
if task_id == self.active_task_id:
self.finished_start_next()
self.finished_start_next
def run(self):
self.sleepytime = None
@ -112,6 +138,14 @@ class CallBuiltin(CodeOp):
funcname, = vm.pop(1)
builtin_map[funcname](vm)
class DiscardStack(CodeOp):
def __init__(self):
pass
def execute(self, vm):
count, = vm.pop(1)
vm.pop(count)
class StartContext(CodeOp):
def execute(self, vm):
vm.push_context()