Mercurial > py-js
diff py.js @ 0:e985e6d762b9 default tip
Origination.
author | Atul Varma <varmaa@toolness.com> |
---|---|
date | Wed, 24 Sep 2008 16:47:18 -0700 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/py.js Wed Sep 24 16:47:18 2008 -0700 @@ -0,0 +1,50 @@ +function Py(code) { + if ('Py' in this) + throw new Error("Py() must be called with 'new' keyword"); + + var self = this; + + var co_code = code.co_code; + var co_consts = code.co_consts; + var co_names = code.co_names; + + var ops = {}; + var stack = []; + var globals = {}; + var locals = {}; + + ops.LOAD_CONST = function LOAD_CONST(index) { + stack.push(co_consts[index]); + }; + + ops.LOAD_NAME = function LOAD_NAME(index) { + stack.push(locals[co_names[index]]); + }; + + ops.BINARY_ADD = function BINARY_ADD() { + stack.push(stack.pop() + stack.pop()); + }; + + ops.STORE_NAME = function STORE_NAME(index) { + locals[co_names[index]] = stack.pop(); + }; + + ops.STORE_GLOBAL = function STORE_GLOBAL(index) { + globals[co_names[index]] = stack.pop(); + }; + + ops.RETURN_VALUE = function RETURN_VALUE() { + self.returnValue = stack.pop(); + }; + + for (var i = 0; i < co_code.ops.length; i++) { + var op = co_code.ops[i].op; + var arg = co_code.ops[i].arg; + if (!(op in ops)) + throw new Error('No implementation for op ' + op); + ops[op](arg); + } + + self.locals = locals; + self.globals = globals; +}