class Nydp::Evaluator
Attributes
name[RW]
ns[RW]
Public Class Methods
mk_manifest(name, class_list)
click to toggle source
# File lib/nydp/runner.rb, line 88 def self.mk_manifest name, class_list class_expr = <<KLA #{class_list.map {|k| "require '#{k}'" }.join("\n")} class #{name} def self.build ns #{class_list.map {|k| "#{k}.new(ns).call" }.join("\n ")} end end KLA File.open("rubycode/#{name}.rb", "w") { |f| fullpath = File.expand_path("rubycode/#{name}.rb") Nydp.logger.info "writing #{fullpath}" if Nydp.logger f.write class_expr } end
new(ns, name)
click to toggle source
# File lib/nydp/runner.rb, line 74 def initialize ns, name @name = name @ns = ns @rubydir = FileUtils.mkdir_p "rubycode" end
Public Instance Methods
compile_expr(expr)
click to toggle source
# File lib/nydp/runner.rb, line 80 def compile_expr expr begin Compiler.compile(expr, nil, ns) rescue StandardError => e raise Nydp::Error, "failed to compile #{expr._nydp_inspect}" end end
eval_compiled(compiled_expr, precompiled, src, manifest)
click to toggle source
# File lib/nydp/runner.rb, line 162 def eval_compiled compiled_expr, precompiled, src, manifest return nil unless precompiled digest = Digest::SHA256.hexdigest(precompiled.inspect) cname = "#{GENERATED_CLASS_PREFIX}_#{digest.upcase}" kla = mk_ruby_class src, precompiled, compiled_expr, cname manifest << cname kla.new(ns).call rescue Exception => e raise Nydp::Error, "failed to eval #{compiled_expr._nydp_inspect} from src #{src._nydp_inspect}" end
evaluate(expr, manifest=[])
click to toggle source
# File lib/nydp/runner.rb, line 177 def evaluate expr, manifest=[] precompiled = ns.apply :"pre-compile-new-expression", expr compiled = compile_expr precompiled # TODO : we don't need this step if the class already exists! Do it later only when we need it eval_compiled compiled, precompiled, expr, manifest end
mk_ruby_class(src, precompiled, compiled_expr, cname)
click to toggle source
# File lib/nydp/runner.rb, line 148 def mk_ruby_class src, precompiled, compiled_expr, cname begin require cname self.class.const_get(cname) rescue LoadError => e # compiled_expr = compile_expr precompiled # TODO : delete line in #evaluate and uncomment this one fname = "rubycode/#{cname}.rb" txt = mk_ruby_source src, precompiled, compiled_expr, cname eval(txt, nil, fname) || raise("failed to generate class #{cname} from src #{src}") end end
mk_ruby_source(src, precompiled, compiled_expr, cname)
click to toggle source
# File lib/nydp/runner.rb, line 116 def mk_ruby_source src, precompiled, compiled_expr, cname srcs = [] ruby_expr = compiled_expr.compile_to_ruby " ", srcs six = 0 srcs = srcs.map { |s| s = " @@src_#{six} = #{s.inspect}" six += 1 s } class_expr = "class #{cname} < Nydp::Runner::CompiledExpression #{srcs.join("\n")} def src #{src.inspect.inspect} end def precompiled #{precompiled.inspect.inspect} end def call #{ruby_expr} end end #{cname} " File.open("rubycode/#{cname}.rb", "w") { |f| f.write class_expr } class_expr end