class ERuby

Public Class Methods

import(filename) click to toggle source
# File lib/knj/erb/include.rb, line 25
def self.import(filename)
  ERuby.load_settings if !@settings_loaded
  
  filename = File.expand_path(filename)
  pwd = Dir.pwd
  Dir.chdir(File.dirname(filename))
  
  fpath = "#{KnjEruby.filepath}/cache/#{filename.gsub("/", "_").gsub(".", "_")}"
  pi = Php4r.pathinfo(filename)
  cachename = fpath + ".cache"
  
  filetime = File.mtime(filename)
  cacheexists = File.exists?(cachename)
  cachetime = File.mtime(cachename) if File.exists?(cachename)
  
  if !cacheexists or filetime > cachetime
    KnjEruby.load_file(File.basename(filename), {:cachename => cachename})
    cachetime = File.mtime(cachename)
    reload_cache = true
  end
  
  if @java_compile
    if !@eruby_java_cache[cachename] or reload_cache
      #@eruby_java_cache[cachename] = @java_engine.compile(File.read(cachename))
      @eruby_java_cache[cachename] = File.read(cachename)
    end
    
    #@eruby_java_cache[cachename].eval
    eval(@eruby_java_cache[cachename])
  elsif @inseq_cache
    if @inseq_rbc
      bytepath = pi["dirname"] + "/" + pi["basename"] + ".rbc"
      byteexists = File.exists?(bytepath)
      bytetime = File.mtime(bytepath) if File.exists?(bytepath)
      
      if !File.exists?(bytepath) or cachetime > bytetime
        res = RubyVM::InstructionSequence.compile_file(filename)
        data = Marshal.dump(res.to_a)
        File.open(bytepath, "w+") do |fp|
          fp.write(data)
        end
      end
    end
    
    if @inseq_rbc
      res = Marshal.load(File.read(bytepath))
      RubyVM::InstructionSequence.load(res).eval
    else
      if !@eruby_rbyte[cachename] or reload_cache
        @eruby_rbyte[cachename] = RubyVM::InstructionSequence.new(File.read(cachename))
        #@eruby_rbyte[cachename] = RubyVM::InstructionSequence.compile_file(cachename)
        @eruby_rbyte[cachename].eval
      else
        _buf = ""
        @eruby_rbyte[cachename].eval
        if _buf
          print _buf
        end
      end
    end
  else
    eruby = KnjEruby.load_file(File.basename(filename), {:cachename => cachename})
    print eruby.evaluate
  end
  
  Dir.chdir(pwd)
end
load_settings() click to toggle source
# File lib/knj/erb/include.rb, line 2
def self.load_settings
  @settings_loaded = true
  @inseq_cache = false
  @inseq_rbc = false
  @java_compile = false
  
  if RUBY_PLATFORM == "java"
    @java_compile = true
    @java_factory = javax.script.ScriptEngineManager.new
    @java_engine = @java_factory.getEngineByName("jruby")
    @eruby_java_cache = {}
  elsif RUBY_VERSION.slice(0..2) == "1.9" and RubyVM::InstructionSequence.respond_to?(:compile_file)
    @eruby_rbyte = {}
    @inseq_cache = true
    
    if RubyVM::InstructionSequence.respond_to?(:load)
      @inseq_rbc = true
    end
  end
  
  @inseq_rbc = false #this is not possible yet in Ruby... maybe in 1.9.3?
end