Sha256: aa2e88b149014734966b1ccd4a85b516865f54ea0ca6e0ac4aa124f2e54cf020

Contents?: true

Size: 1.81 KB

Versions: 5

Compression:

Stored size: 1.81 KB

Contents

require 'stringio'

module V8
  class Context    
    attr_reader :native, :scope
    def initialize(opts = {})
      @native = opts[:with] ? C::Context::New(Access.rubyobject) : C::Context::New()
      @native.enter do
        @native.Global().SetHiddenValue(C::String::New("TheRubyRacer::RubyObject"), C::External::New(opts[:with])) if opts[:with]
        @scope = To.rb(@native.Global())
      end
      yield(self) if block_given?
    end
    
    def eval(javascript, filename = "<eval>", line = 1)
      if IO === javascript || StringIO === javascript
        javascript = javascript.read()
      end
      err = nil
      value = nil
      C::TryCatch.try do |try|
        @native.enter do
          script = C::Script::Compile(To.v8(javascript.to_s), To.v8(filename.to_s))
          if try.HasCaught()
            err = JSError.new(try)
          else
            result = script.Run()
            if try.HasCaught()
              err = JSError.new(try)
            else
              value = To.rb(result)
            end
          end
        end
      end
      raise err if err
      return value
    end
            
    def evaluate(*args)
      self.eval(*args)
    end
    
    def load(filename)
      File.open(filename) do |file|
        evaluate file, filename, 1
      end      
    end
    
    def [](key)
      @scope[key]
    end
    
    def []=(key, value)
      @scope[key] = value
    end

    def self.eval(source)
      new.eval(source)
    end
    
    def V8.eval(*args)
      V8::Context.eval(*args)
    end
  end

  module C
    class Context
      def enter
        if block_given?
          if IsEntered()
            yield(self)
          else
            Enter()
            begin
              yield(self)
            ensure
              Exit()
            end
          end
        end
      end
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
therubyracer-0.7.5 lib/v8/context.rb
therubyracer-0.7.4 lib/v8/context.rb
therubyracer-0.7.3 lib/v8/context.rb
therubyracer-0.7.2 lib/v8/context.rb
therubyracer-0.7.2.pre lib/v8/context.rb