Sha256: 07c77c79e8dfe90d8824d29887fd5ba037eb832a7b8e098776fdf945fb47dcfc

Contents?: true

Size: 1.35 KB

Versions: 8

Compression:

Stored size: 1.35 KB

Contents

#!/usr/bin/env ruby

require 'opal'

module Opal
  class V8Context
    def initialize
      @builder = Opal::Builder.new
    end

    def run(filename = nil)
      return if @v8

      begin
        require 'v8'
      rescue LoadError
        abort 'therubyracer must be installed'
      end

      @v8 = V8::Context.new
      @v8['console'] = self
      @v8.eval @builder.build 'opal'

      if filename
        if File.exist? filename
          eval_ruby File.read(filename)
        else
          fail "file does not exist: #{filename}"
        end
      end

      run_repl
    end

    def log(*str)
      puts(*str)
    end

    def run_repl
      require 'readline'

      loop do
        # on SIGINT lets just return from the loop..
        trap("SIGINT") { finish; return }
        line = Readline.readline '>> ', true

        # if we type exit, then we need to close down context
        if line == "exit" or line.nil?
          break
        end

        puts "=> #{eval_ruby line}"
      end

      finish
    end

    def eval_ruby(str)
      code = @builder.build_str str, :irb => true, :const_missing => true
      @v8.eval "var $_result = #{code} ($_result == null ? 'nil' : $_result.$inspect());"
    rescue => e
      puts "#{e.message}\n\t#{e.backtrace.join("\n\t")}"
    end

    def finish
      @v8 = nil
    end
  end
end

Opal::V8Context.new.run ARGV.first

Version data entries

8 entries across 8 versions & 1 rubygems

Version Path
opal-0.6.3 bin/opal-repl
opal-0.6.2 bin/opal-repl
opal-0.6.1 bin/opal-repl
opal-0.6.0 bin/opal-repl
opal-0.5.5 bin/opal-repl
opal-0.5.4 bin/opal-repl
opal-0.5.2 bin/opal-repl
opal-0.5.0 bin/opal-repl