From 829dd5323db2771facc865fe753cb34b0a1819a4 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Sat, 11 Oct 2014 11:15:28 -0400 Subject: [PATCH] transform: move up shortcut-range from abstract_compiler to transform Signed-off-by: Jean Privat --- src/compiler/abstract_compiler.nit | 36 +----------------------------------- src/transform.nit | 11 ++++++++++- 2 files changed, 11 insertions(+), 36 deletions(-) diff --git a/src/compiler/abstract_compiler.nit b/src/compiler/abstract_compiler.nit index 58cb346..2897ed9 100644 --- a/src/compiler/abstract_compiler.nit +++ b/src/compiler/abstract_compiler.nit @@ -41,8 +41,6 @@ redef class ToolContext var opt_compile_dir: OptionString = new OptionString("Directory used to generate temporary files", "--compile-dir") # --hardening var opt_hardening: OptionBool = new OptionBool("Generate contracts in the C code against bugs in the compiler", "--hardening") - # --no-shortcut-range - var opt_no_shortcut_range: OptionBool = new OptionBool("Always insantiate a range and its iterator on 'for' loops", "--no-shortcut-range") # --no-check-covariance var opt_no_check_covariance: OptionBool = new OptionBool("Disable type tests of covariant parameters (dangerous)", "--no-check-covariance") # --no-check-attr-isset @@ -71,7 +69,7 @@ redef class ToolContext redef init do super - self.option_context.add_option(self.opt_output, self.opt_dir, self.opt_no_cc, self.opt_no_main, self.opt_make_flags, self.opt_compile_dir, self.opt_hardening, self.opt_no_shortcut_range) + self.option_context.add_option(self.opt_output, self.opt_dir, self.opt_no_cc, self.opt_no_main, self.opt_make_flags, self.opt_compile_dir, self.opt_hardening) self.option_context.add_option(self.opt_no_check_covariance, self.opt_no_check_attr_isset, self.opt_no_check_assert, self.opt_no_check_autocast, self.opt_no_check_null, self.opt_no_check_all) self.option_context.add_option(self.opt_typing_test_metrics, self.opt_invocation_metrics, self.opt_isset_checks_metrics) self.option_context.add_option(self.opt_stacktrace) @@ -2532,38 +2530,6 @@ end redef class AForExpr redef fun stmt(v) do - # Shortcut on explicit range - # Avoid the instantiation of the range and the iterator - var nexpr = self.n_expr - if self.variables.length == 1 and nexpr isa ARangeExpr and not v.compiler.modelbuilder.toolcontext.opt_no_shortcut_range.value then - var from = v.expr(nexpr.n_expr, null) - var to = v.expr(nexpr.n_expr2, null) - var variable = v.variable(variables.first) - var one = v.new_expr("1", v.get_class("Int").mclass_type) - - v.assign(variable, from) - v.add("for(;;) \{ /* shortcut range */") - - var ok - if nexpr isa AOrangeExpr then - ok = v.send(v.get_property("<", variable.mtype), [variable, to]) - else - ok = v.send(v.get_property("<=", variable.mtype), [variable, to]) - end - assert ok != null - v.add("if(!{ok}) break;") - - v.stmt(self.n_block) - - v.add_escape_label(continue_mark) - var succ = v.send(v.get_property("successor", variable.mtype), [variable, one]) - assert succ != null - v.assign(variable, succ) - v.add("\}") - v.add_escape_label(break_mark) - return - end - var cl = v.expr(self.n_expr, null) var it_meth = self.method_iterator assert it_meth != null diff --git a/src/transform.nit b/src/transform.nit index 2a4a230..6c8208a 100644 --- a/src/transform.nit +++ b/src/transform.nit @@ -23,6 +23,15 @@ intrude import semantize::scope redef class ToolContext var transform_phase: Phase = new TransformPhase(self, [typing_phase, auto_super_init_phase]) + + # --no-shortcut-range + var opt_no_shortcut_range: OptionBool = new OptionBool("Always insantiate a range and its iterator on 'for' loops", "--no-shortcut-range") + + redef init + do + super + self.option_context.add_option(self.opt_no_shortcut_range) + end end private class TransformPhase @@ -182,7 +191,7 @@ redef class AForExpr # Shortcut on explicit range # Avoid the instantiation of the range and the iterator - if self.variables.length == 1 and nexpr isa ARangeExpr then + if self.variables.length == 1 and nexpr isa ARangeExpr and not v.phase.toolcontext.opt_no_shortcut_range.value then var variable = variables.first nblock.add v.builder.make_var_assign(variable, nexpr.n_expr) var to = nexpr.n_expr2 -- 1.7.9.5