class Daedalus::DependencyGrapher::ExpressionEvaluator

Public Class Methods

new(expression) click to toggle source
   # File lib/daedalus/dependency_grapher.rb
27 def initialize(expression)
28   @expression = expression
29 end

Public Instance Methods

evaluate(defines) click to toggle source
   # File lib/daedalus/dependency_grapher.rb
31 def evaluate(defines)
32   # Stage0: eliminate comments
33   @expression.gsub!(/(\/\/.*)$/, "")
34   @expression.gsub!(/(\/\*.*\*\/)/, "")
35 
36   # Stage1: find 'defined's and evaluate
37   #         replace defined with boolean evaluation value
38   re = /((!|\s*)?defined((\(|\s+)(\s*[^) ]+)(\)|\s|$)))/o
39   @expression.gsub!(re) do |expr|
40     m = expr.match(re)
41     negate = m[2] == "!"
42     key = m[5].strip
43 
44     value = defines.include? key
45     value = !value if negate
46     value ? "true" : "false"
47   end
48 
49   # Stage2: scan macro-defined keywords
50   #         replace with actual value (true or false)
51   # this covers patterns like __clang__ and __x86_64__
52   @expression.gsub!(/__[A-Za-z0-9_]+__/) do |expr|
53     if defines.include?(expr)
54       defines[expr].to_s
55     elsif integer?(expr)
56       expr
57     else
58       '0'
59     end
60   end
61 
62   # this covers other patters.
63   @expression.gsub!(/[A-Z0-9_]{4,}/) do |expr|
64     if defines.include?(expr)
65       defines[expr].to_s
66     elsif integer?(expr)
67       expr
68     else
69       '0'
70     end
71   end
72 
73   # Stage3: Evaluate with ruby eval()
74   eval(@expression)
75 end

Private Instance Methods

integer?(str) click to toggle source
   # File lib/daedalus/dependency_grapher.rb
78 def integer?(str)
79   Integer(str)
80   true
81 rescue
82   false
83 end