def visitPropertySetter(self, ctx): name = ctx.children[1].accept(self) argName = ctx.children[3].accept(self) body = ctx.children[6].accept(self) param = Object() param.set = Function([argName], self.environment, body) return (name, param)
def execute_MAKE_OBJECT(self, nr_elements): obj = Object() for i in range(0, nr_elements): key = self.stack.pop() value = self.stack.pop() setattr(obj, key, value) self.stack.push(obj)
def execute_NEW(self, nr_arguments): constructor = self.stack.pop() arguments = [] for i in range(0, nr_arguments): arguments.insert(0, self.stack.pop()) obj = Object() constructor(obj, *arguments) self.stack.push(obj)
def test_043_make_getter(self): f = Function(None, None, None) obj = Object() self.run_test_executor([[OpCode.PUSH, obj], [OpCode.PUSH, f], [OpCode.PUSH, 'test'], [OpCode.MAKE_GETTER]], [obj], {}, {}) self.assertTrue(isinstance(obj.test, Property)) self.assertEqual(obj.test.getter, f) self.assertEqual(obj.test.setter, None)
def test_014_store_member(self): obj = Object() setattr(obj, 'a', -1.0) self.run_test_executor([[OpCode.PUSH, 1.0], [OpCode.PUSH, obj], [OpCode.STORE_MEMBER, 'a']], [1.0], {}, {}) self.assertEqual(obj.a, 1.0) arr = [1.0, 2.0, 4.0] self.run_test_executor([[OpCode.PUSH, -1.0], [OpCode.PUSH, arr], [OpCode.STORE_MEMBER, 1]], [-1.0], {}, {}) self.assertEqual(arr, [1.0, -1.0, 4.0])
def test_024_new(self): def func_new(env): self.assertTrue(env.value("this"), Object) self.assertEqual(env.value('a'), 1.0) self.assertEqual(env.value('b'), 2.0) f = Function(['a', 'b'], Environment(), func_new) self.run_test_executor([[OpCode.PUSH, 1.0], [OpCode.PUSH, 2.0], [OpCode.PUSH, f], [OpCode.NEW, 2]], [Object()], {}, {})
def execute_make_object(self, count): ''' Execute the MAKE_OBJECT instruction ''' arr = self.execute_pop(count * 2) obj = Object() for i in range(0, len(arr), 2): setattr(obj, arr[i], arr[i + 1]) self.stack.push(obj)
def test_013_load_member(self): obj = Object() setattr(obj, 'a', -1.0) self.run_test_executor([[OpCode.PUSH, obj], [OpCode.LOAD_MEMBER, 'a']], [-1.0], {}, {}) arr = [1.0, 2.0, 4.0] self.run_test_executor([[OpCode.PUSH, arr], [OpCode.LOAD_MEMBER, 1]], [2.0], {}, {}) self.run_test_executor( [[OpCode.PUSH, arr], [OpCode.LOAD_MEMBER, 'length']], [3.0], {}, {})
def test_016_store_index(self): obj = Object() setattr(obj, 'a', -1.0) self.run_test_executor([[OpCode.PUSH, 1.0], [OpCode.PUSH, obj], [OpCode.PUSH, 'a'], [OpCode.STORE_INDEX]], [1.0], {}, {}) self.assertEqual(obj.a, 1.0) arr = [1.0, 2.0, 4.0] self.run_test_executor([[OpCode.PUSH, -1.0], [OpCode.PUSH, arr], [OpCode.PUSH, 1], [OpCode.STORE_INDEX]], [-1.0], {}, {}) self.assertEqual(arr, [1.0, -1.0, 4.0])
def test_015_load_index(self): obj = Object() setattr(obj, 'a', -1.0) self.run_test_executor( [[OpCode.PUSH, obj], [OpCode.PUSH, 'a'], [OpCode.LOAD_INDEX]], [-1.0], {}, {}) arr = [1.0, 2.0, 4.0] self.run_test_executor( [[OpCode.PUSH, arr], [OpCode.PUSH, 1], [OpCode.LOAD_INDEX]], [2.0], {}, {}) self.run_test_executor( [[OpCode.PUSH, arr], [OpCode.PUSH, 'length'], [OpCode.LOAD_INDEX]], [3.0], {}, {})
def execute_new(self, argCount): ''' Execute the NEW instruction ''' func = self.stack.pop() args = [] obj = Object() if argCount > 0: args = self.execute_pop(argCount) args = list(reversed(args)) func(obj, *args) self.execute_push(obj)
def visitObjectLiteralExpression(self, ctx): obj = Object() # res is a list of tuples res = ctx.children[0].accept(self) for value in res: if len(value) == 3: prop = Property(obj) if value[0] == 'get': prop.getter = value[-1] else: prop.setter = value[-1] setattr(obj, str(value[1]), prop) else: setattr(obj, str(value[0]), value[1]) return obj
def test_041_make_object(self): (stack, env) = self.run_test_executor( [[OpCode.PUSH, 1.0], [OpCode.PUSH, 'a'], [OpCode.PUSH, 2.0], [OpCode.PUSH, 'b'], [OpCode.MAKE_OBJECT, 2]], [Object()], {}, {}) self.assertEqual(stack[0].a, 1.0) self.assertEqual(stack[0].b, 2.0)
def visitPropertyGetter(self, ctx): name = ctx.children[1].accept(self) body = ctx.children[5].accept(self) param = Object() param.get = Function([], self.environment, body) return (name, param)