Class: Johnson::Runtime

Inherits:
Object
  • Object
show all
Defined in:
lib/johnson/runtime.rb

Overview

An interface to a JavaScript engine.

Direct Known Subclasses

SpiderMonkey::Runtime, TraceMonkey::Runtime

Constant Summary collapse

PRELUDE_PATH =
File.expand_path File.dirname(__FILE__) +
"/js/prelude.js"
PRELUDE =

:nodoc:

IO.read PRELUDE_PATH

Class Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeRuntime

Install the Johnson prelude into this runtime environment.



52
53
54
55
56
# File 'lib/johnson/runtime.rb', line 52

def initialize # :notnew:
  evaluate PRELUDE, PRELUDE_PATH, 1
  global.Johnson.runtime = self
  global['Ruby'] = Object
end

Class Attribute Details

.runtimesObject (readonly)

Returns the value of attribute runtimes.



129
130
131
# File 'lib/johnson/runtime.rb', line 129

def runtimes
  @runtimes
end

Class Method Details

.new(*args) ⇒ Object

Create a new Runtime instance, using the default JavaScript engine.

Optionally takes a parameter specifying which engine to use, but this is deprecated; instead, just create an instance of that engine's runtime directly.

:call-seq:

new(runtime_class=nil,options={})


29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/johnson/runtime.rb', line 29

def self.new(*args)
  return super if self < Johnson::Runtime
  runtime = args.shift
  options = {}
  if runtime
    if runtime.is_a? Hash
      options = runtime
      runtime = nil
    else
      options = args.shift
    end
  end
  if runtime.is_a? Class
    runtime = runtime.new( options )
  elsif runtime
    runtime
  else
    default.new( options )
  end
end

Instance Method Details

#[](key) ⇒ Object

Access the key property of the JavaScript global object.



60
61
62
# File 'lib/johnson/runtime.rb', line 60

def [](key)
  global[key]
end

#[]=(key, value) ⇒ Object

Set the key property of the JavaScript global object to value.



67
68
69
# File 'lib/johnson/runtime.rb', line 67

def []=(key, value)
  global[key] = value
end

#compile(script, filename = nil, linenum = nil, global = nil) ⇒ Object

Compile the JavaScript source in script. If supplied, the script is marked as starting on line linenum of filename.

Raises:



114
115
116
# File 'lib/johnson/runtime.rb', line 114

def compile(script, filename=nil, linenum=nil, global=nil)
  raise NotImplementedError
end

#delegateObject

Deprecated: Previously, returned the underlying JavaScript engine instance. Now returns self.



14
15
16
# File 'lib/johnson/runtime.rb', line 14

def delegate
  self
end

#evaluate(script, filename = nil, linenum = nil) ⇒ Object

Execute the JavaScript source in script. If supplied, the script is marked as starting on line linenum of filename.

Equivalent to calling RubyLandScript#execute on the result of Runtime#compile.



78
79
80
81
82
# File 'lib/johnson/runtime.rb', line 78

def evaluate(script, filename = nil, linenum = nil)
  return nil if script.nil?
  compiled_script = compile(script, filename, linenum)
  evaluate_compiled_script(compiled_script)
end

#evaluate_compiled_script(script, scope = nil) ⇒ Object

Evaluates the given JS script, that should have been returned by a previous call to #compile().

Raises:



121
122
123
# File 'lib/johnson/runtime.rb', line 121

def evaluate_compiled_script(script,scope=nil)
  raise NotImplementedError
end

#globalObject

The JavaScript unique Global Object.

Raises:



86
87
88
# File 'lib/johnson/runtime.rb', line 86

def global
  raise NotImplementedError
end

#load(*files) ⇒ Object

Load and execute the named JavaScript files.

Checks for (and skips) a shebang line at the top of any of them.



94
95
96
97
98
# File 'lib/johnson/runtime.rb', line 94

def load(*files)
  files.map { |f|
    evaluate(File.read(f).gsub(/\A#!.*$/, ''), f, 1)
  }.last
end

#require(*files) ⇒ Object

Search the Ruby load path for each of the named files, and evaluate them if they have not yet been loaded.

Calls Johnson.require() in JavaScript on each filename in turn.



105
106
107
108
109
# File 'lib/johnson/runtime.rb', line 105

def require(*files)
  files.each do |file|
    evaluate("Johnson.require('#{file}');")
  end
end