Sha256: 3720ea028294322e6597e0784fb108ba9bc7fad4c9d4b994cc1d91ecc1c85c61

Contents?: true

Size: 1.2 KB

Versions: 1

Compression:

Stored size: 1.2 KB

Contents

module V8
  class Function < V8::Object
    
    def methodcall(thisObject, *args)
      err = nil
      return_value = nil
      C::TryCatch.try do |try|
        @context.enter do
          this = To.v8(thisObject)
          return_value = To.rb(@native.Call(this, To.v8(args)))
          err = JSError.new(try) if try.HasCaught()
        end
      end
      raise err if err
      return return_value
    end
    
    def call(*args)
      self.methodcall(@context.Global(), *args)
    end
    
    def new(*args)
      @context.enter do
        To.rb(@native.NewInstance(To.v8(args)))
      end
    end

    def self.rubyprotect
      begin
        To.v8(yield)
      rescue Exception => e
        case e
        when SystemExit, NoMemoryError
          raise e
        else
          error = V8::C::Exception::Error(V8::C::String::New(e.message))
          error.SetHiddenValue("TheRubyRacer::Cause", C::External::New(e))
          V8::C::ThrowException(error)
        end
      end
    end

    def self.rubycall(rubycode, *args)
      rubyprotect do
        rubycode.call(*args)
      end
    end

    def self.rubysend(obj, message, *args)
      rubyprotect do
        obj.send(message, *args)
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
therubyracer-0.7.5 lib/v8/function.rb