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