예제 #1
0
def test_binop1(compile_expr):
    frame = compile_expr('1 + 2')

    assert frame.code == [
        ops.LoadConst(0),
        ops.LoadConst(1),
        ops.BinaryAdd(),
    ]
    assert frame.consts == [
        obj.LNumber(1.0),
        obj.LNumber(2.0),
    ]
예제 #2
0
def test_arith1(compile_expr):
    frame = compile_expr('1 - 2')

    assert frame.code == [
        ops.LoadConst(0),
        ops.LoadConst(1),
        ops.BinarySubtract(),
    ]
    assert frame.consts == [
        obj.LNumber(1.0),
        obj.LNumber(2.0),
    ]
예제 #3
0
def test_ass3(compile_stmt):
    frame = compile_stmt('a = 1 - 2')

    assert frame.code == [
        ops.LoadConst(0),
        ops.LoadConst(1),
        ops.BinarySubtract(),
        ops.StoreName(0),
    ]
    assert frame.consts == [
        obj.LNumber(1.0),
        obj.LNumber(2.0),
    ]
    assert frame.vars == [
        obj.LVar('a'),
    ]
예제 #4
0
def test_call1(compile_expr):
    frame = compile_expr('print(1)')

    assert frame.code == [ops.LoadConst(0), ops.LoadName(0), ops.Call()]
    assert frame.consts == [
        obj.LNumber(1.0),
    ]
    assert frame.vars == [obj.LVar('print')]
예제 #5
0
파일: frame.py 프로젝트: y372465774/luna
    def run(self):
        while self.pc < len(self.code):
            op = self.code[self.pc]

            if type(op) == ops.BinaryAdd:
                x = self.stack.pop()
                y = self.stack.pop()
                v = obj.LNumber(y.value + x.value)
                self.stack.append(v)

            elif type(op) == ops.BinarySubtract:
                x = self.stack.pop()
                y = self.stack.pop()
                v = obj.LNumber(y.value - x.value)
                self.stack.append(v)

            elif type(op) == ops.Call:
                func = self.stack.pop()
                arg = self.stack.pop()
                if type(arg) == obj.LVar:
                    arg = self.env[arg]
                func(arg)

            elif type(op) == ops.LoadConst:
                self.stack.append(self.consts[op.index])

            elif type(op) == ops.LoadName:
                lvar = self.vars[op.index]
                value = self.env.get(lvar)
                if value is None:
                    value = getattr(builtin, 'lua_' + lvar.value)
                self.stack.append(value)

            elif type(op) == ops.StoreName:
                var = self.vars[op.index]
                val = self.stack.pop()
                if type(val) == obj.LVar:
                    val = self.env[val]
                self.env[var] = val

            self.pc += 1

        return self
예제 #6
0
def test_ass1(compile_stmt):
    frame = compile_stmt('a = 1')

    assert frame.code == [
        ops.LoadConst(0),
        ops.LoadConst(1),
        ops.StoreName(),
    ]
    assert frame.consts == [
        obj.LVar('a'),
        obj.LNumber(1.0),
    ]
예제 #7
0
def test_call1(compile_stmt):
    frame = compile_stmt('print(1)')

    assert frame.code == [
        ops.LoadConst(0),
        ops.LoadConst(1),
        ops.Call(),
    ]
    assert frame.consts == [
        obj.LVar('print'),
        obj.LNumber(1.0),
    ]
예제 #8
0
 def visit_number(self, node, vc):
     return obj.LNumber(float(node.value))
예제 #9
0
파일: _test_vm.py 프로젝트: y372465774/luna
def test_ass1(interp_stmt):
    frame = interp_stmt('a = 1')
    assert frame.env == {
        obj.LVar('a'): obj.LNumber(1.0),
    }