diff options
Diffstat (limited to 'lib/puppet/parser')
-rw-r--r-- | lib/puppet/parser/ast/comparison_operator.rb | 15 | ||||
-rw-r--r-- | lib/puppet/parser/ast/leaf.rb | 3 | ||||
-rw-r--r-- | lib/puppet/parser/compiler.rb | 23 | ||||
-rw-r--r-- | lib/puppet/parser/lexer.rb | 16 | ||||
-rw-r--r-- | lib/puppet/parser/parser_support.rb | 2 | ||||
-rw-r--r-- | lib/puppet/parser/resource.rb | 9 | ||||
-rw-r--r-- | lib/puppet/parser/type_loader.rb | 28 |
7 files changed, 39 insertions, 57 deletions
diff --git a/lib/puppet/parser/ast/comparison_operator.rb b/lib/puppet/parser/ast/comparison_operator.rb index c8694bbff..039c81df8 100644 --- a/lib/puppet/parser/ast/comparison_operator.rb +++ b/lib/puppet/parser/ast/comparison_operator.rb @@ -16,17 +16,16 @@ class Puppet::Parser::AST def evaluate(scope) # evaluate the operands, should return a boolean value lval = @lval.safeevaluate(scope) - rval = @rval.safeevaluate(scope) - # convert to number if operands are number - lval = Puppet::Parser::Scope.number?(lval) || lval - rval = Puppet::Parser::Scope.number?(rval) || rval + case @operator + when "==","!=" + @rval.evaluate_match(lval, scope) ? @operator == '==' : @operator == '!=' + else + rval = @rval.safeevaluate(scope) + rval = Puppet::Parser::Scope.number?(rval) || rval + lval = Puppet::Parser::Scope.number?(lval) || lval - # return result - unless @operator == '!=' lval.send(@operator,rval) - else - lval != rval end end diff --git a/lib/puppet/parser/ast/leaf.rb b/lib/puppet/parser/ast/leaf.rb index 3b9163d9c..49f430278 100644 --- a/lib/puppet/parser/ast/leaf.rb +++ b/lib/puppet/parser/ast/leaf.rb @@ -17,6 +17,9 @@ class Puppet::Parser::AST obj = obj.downcase if obj.respond_to?(:downcase) value = value.downcase if value.respond_to?(:downcase) + obj = Puppet::Parser::Scope.number?(obj) || obj + value = Puppet::Parser::Scope.number?(value) || value + # "" == undef for case/selector/if obj == value or (obj == "" and value == :undef) end diff --git a/lib/puppet/parser/compiler.rb b/lib/puppet/parser/compiler.rb index 85980722c..a901c0dd6 100644 --- a/lib/puppet/parser/compiler.rb +++ b/lib/puppet/parser/compiler.rb @@ -251,19 +251,7 @@ class Puppet::Parser::Compiler # evaluate_generators loop. def evaluate_definitions exceptwrap do - if ary = unevaluated_resources - evaluated = false - ary.each do |resource| - if not resource.virtual? - resource.evaluate - evaluated = true - end - end - # If we evaluated, let the loop know. - return evaluated - else - return false - end + !unevaluated_resources.each { |resource| resource.evaluate }.empty? end end @@ -482,12 +470,7 @@ class Puppet::Parser::Compiler # Return an array of all of the unevaluated resources. These will be definitions, # which need to get evaluated into native resources. def unevaluated_resources - ary = resources.reject { |resource| resource.builtin? or resource.evaluated? } - - if ary.empty? - return nil - else - return ary - end + # The order of these is significant for speed due to short-circuting + resources.reject { |resource| resource.evaluated? or resource.virtual? or resource.builtin_type? } end end diff --git a/lib/puppet/parser/lexer.rb b/lib/puppet/parser/lexer.rb index 6a9f1cfc4..1e10ff96c 100644 --- a/lib/puppet/parser/lexer.rb +++ b/lib/puppet/parser/lexer.rb @@ -540,15 +540,17 @@ class Puppet::Parser::Lexer [ str[0..-2],str[-1,1] ] end - def tokenize_interpolated_string(token_type) + def tokenize_interpolated_string(token_type,preamble='') value,terminator = slurpstring('"$') - token_queue << [TOKENS[token_type[terminator]],value] - while terminator == '$' and not @scanner.scan(/\{/) - token_queue << [TOKENS[:VARIABLE],@scanner.scan(%r{(\w*::)*\w+|[0-9]})] - value,terminator = slurpstring('"$') - token_queue << [TOKENS[DQ_continuation_token_types[terminator]],value] + token_queue << [TOKENS[token_type[terminator]],preamble+value] + if terminator != '$' or @scanner.scan(/\{/) + token_queue.shift + elsif var_name = @scanner.scan(%r{(\w*::)*\w+|[0-9]}) + token_queue << [TOKENS[:VARIABLE],var_name] + tokenize_interpolated_string(DQ_continuation_token_types) + else + tokenize_interpolated_string(token_type,token_queue.pop.last + terminator) end - token_queue.shift end # just parse a string, not a whole file diff --git a/lib/puppet/parser/parser_support.rb b/lib/puppet/parser/parser_support.rb index 4f3a4ddff..c0fd37178 100644 --- a/lib/puppet/parser/parser_support.rb +++ b/lib/puppet/parser/parser_support.rb @@ -111,7 +111,7 @@ class Puppet::Parser::Parser end def import(file) - known_resource_types.loader.import(file, @lexer.file) + known_resource_types.loader.import_if_possible(file, @lexer.file) end def initialize(env) diff --git a/lib/puppet/parser/resource.rb b/lib/puppet/parser/resource.rb index 3cccf4f3e..c956a1106 100644 --- a/lib/puppet/parser/resource.rb +++ b/lib/puppet/parser/resource.rb @@ -32,12 +32,9 @@ class Puppet::Parser::Resource < Puppet::Resource end # Set up some boolean test methods - [:translated, :override, :evaluated].each do |method| - newmeth = (method.to_s + "?").intern - define_method(newmeth) do - self.send(method) - end - end + def translated?; !!@translated; end + def override?; !!@override; end + def evaluated?; !!@evaluated; end def [](param) param = symbolize(param) diff --git a/lib/puppet/parser/type_loader.rb b/lib/puppet/parser/type_loader.rb index cb8657f0c..c33f90d11 100644 --- a/lib/puppet/parser/type_loader.rb +++ b/lib/puppet/parser/type_loader.rb @@ -70,7 +70,7 @@ class Puppet::Parser::TypeLoader def initialize(env) self.environment = env - @loaded = [] + @loaded = {} @loading = Helper.new @imported = {} @@ -79,10 +79,13 @@ class Puppet::Parser::TypeLoader def load_until(namespaces, name) return nil if name == "" # special-case main. name2files(namespaces, name).each do |filename| - modname = nil - import_if_possible(filename) do - modname = import(filename) - @loaded << filename + modname = begin + import_if_possible(filename) + rescue Puppet::ImportError => detail + # We couldn't load the item + # I'm not convienced we should just drop these errors, but this + # preserves existing behaviours. + nil end if result = yield(filename) Puppet.info "Automatically imported #{name} from #{filename}" @@ -124,23 +127,18 @@ class Puppet::Parser::TypeLoader parser.parse end - private - # Utility method factored out of load for handling thread-safety. # This isn't tested in the specs, because that's basically impossible. - def import_if_possible(file, &blk) - return if @loaded.include?(file) - begin + def import_if_possible(file, current_file = nil) + @loaded[file] || begin case @loading.owner_of(file) when :this_thread - return + nil when :another_thread - return import_if_possible(file, &blk) + import_if_possible(file,current_file) when :nobody - blk.call + @loaded[file] = import(file,current_file) end - rescue Puppet::ImportError => detail - # We couldn't load the item ensure @loading.done_with(file) end |