icode: add lit_{null,true,false}_reg
authorJean Privat <jean@pryen.org>
Mon, 27 Jul 2009 06:40:44 +0000 (02:40 -0400)
committerJean Privat <jean@pryen.org>
Mon, 27 Jul 2009 07:37:23 +0000 (03:37 -0400)
Signed-off-by: Jean Privat <jean@pryen.org>

src/icode/icode_builder.nit
src/syntax/icode_generation.nit

index aee4d01..dbb26bd 100644 (file)
@@ -48,7 +48,7 @@ class ICodeBuilder
        # Check that the reciever e is not null (IIs + IAbort)
        fun add_null_reciever_check(e: IRegister)
        do
-               var nul = new_register(module.type_none)
+               var nul = lit_null_reg
                var c = expr(new IIs(e, nul), module.type_bool)
                var iif = new IIf(c)
                stmt(iif)
@@ -135,12 +135,12 @@ class ICodeBuilder
                        seq = iif.else_seq
                        # Do the "x != null" part iff x is nullable
                        if args[0].stype.is_nullable then
-                               var nul = new_register(module.type_none)
+                               var nul = lit_null_reg
                                cond = expr(new IIs(args[0], nul), module.type_bool)
                                iif = new IIf(cond)
                                stmt(iif)
                                seq = iif.then_seq
-                               add_assignment(reg, expr(new INative("TAG_Bool(false)", null), module.type_bool))
+                               add_assignment(reg, lit_false_reg)
                                seq = iif.else_seq
                        end
                        # "x.==(y)"
@@ -159,6 +159,26 @@ class ICodeBuilder
                end
        end
 
+       # Return a literal "null" value
+       fun lit_null_reg: IRegister
+       do
+               return new_register(module.type_none)
+       end
+
+       # Return a literal "true" value
+       fun lit_true_reg: IRegister
+       do
+               var e = new INative("TAG_Bool(true)", null)
+               return expr(e, module.type_bool)
+       end
+
+       # Return a literal "false" value
+       fun lit_false_reg: IRegister
+       do
+               var e = new INative("TAG_Bool(false)", null)
+               return expr(e, module.type_bool)
+       end
+
        # Get a new register
        fun new_register(s: MMType): IRegister
        do
index c9d4438..46c1263 100644 (file)
@@ -887,7 +887,7 @@ redef class AOrExpr
                v.stmt(iif)
                var seq_old = v.seq
                v.seq = iif.then_seq
-               v.add_assignment(reg, v.generate_expr(n_expr))
+               v.add_assignment(reg, v.lit_true_reg)
 
                # Process right operand (in the else)
                v.seq = iif.else_seq
@@ -909,7 +909,7 @@ redef class AAndExpr
                v.stmt(iif)
                var seq_old = v.seq
                v.seq = iif.else_seq
-               v.add_assignment(reg, v.generate_expr(n_expr))
+               v.add_assignment(reg, v.lit_false_reg)
 
                # Process right operand (in the then)
                v.seq = iif.then_seq
@@ -957,14 +957,14 @@ end
 redef class ATrueExpr
        redef fun generate_icode(v)
        do
-               return v.expr(new INative("TAG_Bool(true)", null), stype)
+               return v.lit_true_reg
        end
 end
 
 redef class AFalseExpr
        redef fun generate_icode(v)
        do
-               return v.expr(new INative("TAG_Bool(false)", null), stype)
+               return v.lit_false_reg
        end
 end
 
@@ -1073,7 +1073,7 @@ end
 redef class ANullExpr
        redef fun generate_icode(v)
        do
-               return v.new_register(stype)
+               return v.lit_null_reg
        end
 end