From 3b4ee84a306b287920d5a15238727a94e63d9996 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Mon, 27 Jul 2009 02:40:44 -0400 Subject: [PATCH] icode: add lit_{null,true,false}_reg Signed-off-by: Jean Privat --- src/icode/icode_builder.nit | 26 +++++++++++++++++++++++--- src/syntax/icode_generation.nit | 10 +++++----- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/src/icode/icode_builder.nit b/src/icode/icode_builder.nit index aee4d01..dbb26bd 100644 --- a/src/icode/icode_builder.nit +++ b/src/icode/icode_builder.nit @@ -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 diff --git a/src/syntax/icode_generation.nit b/src/syntax/icode_generation.nit index c9d4438..46c1263 100644 --- a/src/syntax/icode_generation.nit +++ b/src/syntax/icode_generation.nit @@ -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 -- 1.7.9.5