summaryrefslogtreecommitdiffstats
path: root/lib/puppet/parser
diff options
context:
space:
mode:
authorJesse Wolfe <jes5199@gmail.com>2010-07-19 19:59:01 -0700
committerJesse Wolfe <jes5199@gmail.com>2010-07-19 19:59:04 -0700
commit2af27160b94efa4755187efd99c86d1659683b29 (patch)
treee478abb994e64164061be7d6adc1f2c8147ec9eb /lib/puppet/parser
parent21efa7b282080c69760a17576dff60c01821a963 (diff)
parentd87a2e39d1a6104c52b1213a654ec9d58d0bff7f (diff)
downloadpuppet-2af27160b94efa4755187efd99c86d1659683b29.tar.gz
puppet-2af27160b94efa4755187efd99c86d1659683b29.tar.xz
puppet-2af27160b94efa4755187efd99c86d1659683b29.zip
Merge branch 'master' into next
This is the code for 2.6 RC4
Diffstat (limited to 'lib/puppet/parser')
-rw-r--r--lib/puppet/parser/ast/comparison_operator.rb15
-rw-r--r--lib/puppet/parser/ast/leaf.rb3
-rw-r--r--lib/puppet/parser/compiler.rb23
-rw-r--r--lib/puppet/parser/lexer.rb16
-rw-r--r--lib/puppet/parser/parser_support.rb2
-rw-r--r--lib/puppet/parser/resource.rb9
-rw-r--r--lib/puppet/parser/type_loader.rb28
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