From ba6e3e3da62d0d5d654f163792554cf9da8c7e8e Mon Sep 17 00:00:00 2001 From: Tom Burns Date: Mon, 28 Jul 2014 14:12:11 +0000 Subject: [PATCH 1/6] lazily create stacks --- lib/liquid.rb | 1 + lib/liquid/context.rb | 17 +++++++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/lib/liquid.rb b/lib/liquid.rb index bb81745..f196d3b 100644 --- a/lib/liquid.rb +++ b/lib/liquid.rb @@ -41,6 +41,7 @@ module Liquid singleton_class.send(:attr_accessor, :cache_classes) self.cache_classes = true + end require "liquid/version" diff --git a/lib/liquid/context.rb b/lib/liquid/context.rb index faa3da2..b3bd776 100644 --- a/lib/liquid/context.rb +++ b/lib/liquid/context.rb @@ -27,6 +27,12 @@ module Liquid @parsed_variables = Hash.new{ |cache, markup| cache[markup] = variable_parse(markup) } squash_instance_assigns_with_environments + @used_stacks = 0 + @unused_stacks = 0 + @max_stack_depth = 0 + @this_stack_depth = 0 + @this_stack_used = false + if rethrow_errors self.exception_handler = ->(e) { true } end @@ -134,10 +140,13 @@ module Liquid # # context['var] #=> nil def stack(new_scope={}) - push(new_scope) + old_stack_used = @this_stack_used + @this_stack_used = (new_scope != {}) + push(new_scope) if @this_stack_used yield ensure - pop + pop if @this_stack_used + @this_stack_used = old_stack_used end def clear_instance_assigns @@ -146,6 +155,10 @@ module Liquid # Only allow String, Numeric, Hash, Array, Proc, Boolean or Liquid::Drop def []=(key, value) + if !@this_stack_used + @this_stack_used = true + push({}) + end @scopes[0][key] = value end From 6b56bdd74f08800116c34209bd354dc93e6618c8 Mon Sep 17 00:00:00 2001 From: Tom Burns Date: Mon, 28 Jul 2014 14:23:16 +0000 Subject: [PATCH 2/6] remove variables used for counting empty stacks --- lib/liquid/context.rb | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lib/liquid/context.rb b/lib/liquid/context.rb index b3bd776..94bd4f5 100644 --- a/lib/liquid/context.rb +++ b/lib/liquid/context.rb @@ -27,10 +27,6 @@ module Liquid @parsed_variables = Hash.new{ |cache, markup| cache[markup] = variable_parse(markup) } squash_instance_assigns_with_environments - @used_stacks = 0 - @unused_stacks = 0 - @max_stack_depth = 0 - @this_stack_depth = 0 @this_stack_used = false if rethrow_errors From f5e67a12f9a0a0d084fcf4943add4d27c2111a46 Mon Sep 17 00:00:00 2001 From: Tom Burns Date: Mon, 28 Jul 2014 14:24:29 +0000 Subject: [PATCH 3/6] remove added newline in liquid.rb --- lib/liquid.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/liquid.rb b/lib/liquid.rb index f196d3b..bb81745 100644 --- a/lib/liquid.rb +++ b/lib/liquid.rb @@ -41,7 +41,6 @@ module Liquid singleton_class.send(:attr_accessor, :cache_classes) self.cache_classes = true - end require "liquid/version" From e53d102a2c0c5659120b82ff813349cb4fac9263 Mon Sep 17 00:00:00 2001 From: Tom Burns Date: Wed, 30 Jul 2014 14:59:56 +0000 Subject: [PATCH 4/6] use 'unless' instead of 'if !' for simple conditional --- lib/liquid/context.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/liquid/context.rb b/lib/liquid/context.rb index 94bd4f5..6e8ceb8 100644 --- a/lib/liquid/context.rb +++ b/lib/liquid/context.rb @@ -151,7 +151,7 @@ module Liquid # Only allow String, Numeric, Hash, Array, Proc, Boolean or Liquid::Drop def []=(key, value) - if !@this_stack_used + unless @this_stack_used @this_stack_used = true push({}) end From 15f6cabf838cc4059837db6e450fb9c93d094d3b Mon Sep 17 00:00:00 2001 From: Tom Burns Date: Wed, 30 Jul 2014 15:12:22 +0000 Subject: [PATCH 5/6] avoid a hash comparison --- lib/liquid/context.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/liquid/context.rb b/lib/liquid/context.rb index 6e8ceb8..a075b26 100644 --- a/lib/liquid/context.rb +++ b/lib/liquid/context.rb @@ -135,9 +135,9 @@ module Liquid # end # # context['var] #=> nil - def stack(new_scope={}) + def stack(new_scope=nil) old_stack_used = @this_stack_used - @this_stack_used = (new_scope != {}) + @this_stack_used = (new_scope != nil) push(new_scope) if @this_stack_used yield ensure From 794ca9f604ec223c57b7f03b661dcf9930b02534 Mon Sep 17 00:00:00 2001 From: Tom Burns Date: Wed, 30 Jul 2014 15:42:24 +0000 Subject: [PATCH 6/6] make the conditions around stack creation easier to read --- lib/liquid/context.rb | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/liquid/context.rb b/lib/liquid/context.rb index a075b26..efd74cb 100644 --- a/lib/liquid/context.rb +++ b/lib/liquid/context.rb @@ -137,8 +137,13 @@ module Liquid # context['var] #=> nil def stack(new_scope=nil) old_stack_used = @this_stack_used - @this_stack_used = (new_scope != nil) - push(new_scope) if @this_stack_used + if new_scope + push(new_scope) + @this_stack_used = true + else + @this_stack_used = false + end + yield ensure pop if @this_stack_used