diff --git a/icode.py b/icode.py index b870a3c6af35..33e8526f65ce 100644 --- a/icode.py +++ b/icode.py @@ -4,7 +4,8 @@ from nodes import ( FuncDef, IntExpr, MypyFile, ReturnStmt, NameExpr, WhileStmt, AssignmentStmt, Node, Var, OpExpr, Block, CallExpr, IfStmt, ParenExpr, - UnaryExpr, ExpressionStmt, CoerceExpr, TypeDef, MemberExpr, TypeInfo + UnaryExpr, ExpressionStmt, CoerceExpr, TypeDef, MemberExpr, TypeInfo, + VarDef ) import nodes from visitor import NodeVisitor @@ -414,6 +415,18 @@ class IcodeBuilder(NodeVisitor): stmt.accept(self) return -1 + int visit_var_def(self, VarDef d): + assert len(d.items) == 1 + var = d.items[0][0] + if d.kind == nodes.LDEF: + reg = self.add_local(var) + if d.init: + self.accept(d.init, reg) + elif d.kind == nodes.GDEF and d.init: + init = self.accept(d.init) + self.add(SetGR(var.full_name(), init)) + return -1 + int visit_expression_stmt(self, ExpressionStmt s): self.accept(s.expr) return -1 diff --git a/test/data/cgen-basic.test b/test/data/cgen-basic.test index c255f05f61b3..c3c39040d606 100644 --- a/test/data/cgen-basic.test +++ b/test/data/cgen-basic.test @@ -105,6 +105,30 @@ void f(): print(j) # 0 f() +[case testLocalWithExplicitType] +class A: pass +void f(): + int x = 2 + print(x) # 2 + int y + print(y) # 0 + y = 3 + print(y) # 3 + A a + print(a) # None +f() + +[case testGlobalWithExplicitType] +class A: pass +int x = 2 +print(x) # 2 +int y +print(y) # 0 +y = 3 +print(y) # 3 +A a +print(a) # None + -- TODO -- integer overflows and underflows -- stack overflow diff --git a/test/data/icode-basic.test b/test/data/icode-basic.test index ab345b97f9d4..796be2db2683 100644 --- a/test/data/icode-basic.test +++ b/test/data/icode-basic.test @@ -357,3 +357,30 @@ L1: L2: r1 = None return r1 + +[case testLocalWithExplicitType] +void f(): + int x = 2 + int y + y = 3 + A a +[out] +def f: + r0 = 2 + r1 = 3 + r2 = None + return r2 + +[case testGlobalWithExplicitType] +class A: pass +int x = 2 +int y +y = 3 +[out] +def __init: + r0 = 2 + __main__.x = r0 + r1 = 3 + __main__.y = r1 + r2 = None + return r2