diff --git a/lib/rhino/context.rb b/lib/rhino/context.rb index 39de833..e0b008f 100644 --- a/lib/rhino/context.rb +++ b/lib/rhino/context.rb @@ -1,12 +1,47 @@ module Rhino +# ==Overview +# All Javascript must be executed in a context which represents the execution environment in +# which scripts will run. The environment consists of the standard javascript objects +# and functions like Object, String, Array, etc... as well as any objects or functions which +# have been defined in it. e.g. +# +# Context.open do |cxt| +# cxt['num'] = 5 +# cxt.eval('num + 5') #=> 10 +# end +# +# == Multiple Contexts. +# The same object may appear in any number of contexts, but only one context may be executing javascript code +# in any given thread. If a new context is opened in a thread in which a context is already opened, the second +# context will "mask" the old context e.g. +# +# six = 6 +# Context.open do |cxt| +# cxt['num'] = 5 +# cxt.eval('num') # => 5 +# Context.open do |cxt| +# cxt['num'] = 10 +# cxt.eval('num') # => 10 +# cxt.eval('++num') # => 11 +# end +# cxt.eval('num') # => 5 +# end +# +# == Notes +# While there are many similarities between Rhino::Context and Java::OrgMozillaJavascript::Context, they are not +# the same thing and should not be confused. + class Context attr_reader :scope class << self - def open(options = {}) + + # initalize a new context with a fresh set of standard objects. All operations on the context + # should be performed in the block that is passed. + def open(options = {}, &block) ContextFactory.new.call do |native| - yield new(native, options) + block.call(new(native, options)) end end @@ -29,25 +64,35 @@ module Rhino end end + # Read a value from the global scope of this context def [](k) @scope[k] end - + + # Set a value in the global scope of this context. This value will be visible to all the + # javascript that is executed in this context. def []=(k,v) @scope[k] = v end - - def eval(str) - str = str.to_s + + # Evaluate a string of javascript in this context: + # * source - the javascript source code to evaluate + # * source_name - associated name for this source code. Mainly useful for backtraces. + # * line_number - associate this number with the first line of executing source. Mainly useful for backtraces + def eval(source, source_name = "", line_number = 1) + source = source.to_s begin scope = To.javascript(@scope) - result = @native.evaluateString(scope, str, "", 1, nil) + result = @native.evaluateString(scope, source, source_name, line_number, nil) To.ruby result rescue J::RhinoException => e raise Rhino::RhinoError, e end end - + + # Set the maximum number of instructions that this context will execute. + # If this instruction limit is exceeded, then a Rhino::RunawayScriptError + # will be raised def instruction_limit=(limit) @native.setInstructionObserverThreshold(limit); @native.factory.instruction_limit = limit @@ -55,7 +100,7 @@ module Rhino end - class ContextFactory < J::ContextFactory + class ContextFactory < J::ContextFactory #:nodoc: def observeInstructionCount(cxt, count) raise RunawayScriptError, "script exceeded allowable instruction count" if count > @limit @@ -67,7 +112,7 @@ module Rhino end - class RhinoError < StandardError + class RhinoError < StandardError #:nodoc: def initialize(native) @native = native end @@ -81,5 +126,5 @@ module Rhino end end - class RunawayScriptError < StandardError; end + class RunawayScriptError < StandardError; end #:nodoc: end \ No newline at end of file diff --git a/lib/rhino/java.rb b/lib/rhino/java.rb index 741ba7d..8b84110 100644 --- a/lib/rhino/java.rb +++ b/lib/rhino/java.rb @@ -2,13 +2,16 @@ require 'java' require 'rhino/rhino-1.7R2.jar' module Rhino + # This module contains all the native Rhino objects implemented in Java + # e.g. + # Rhino::J::NativeObject # => org.mozilla.javascript.NativeObject module J import "org.mozilla.javascript" end end unless Object.method_defined?(:tap) - class Object + class Object #:nodoc: def tap yield self self diff --git a/lib/rhino/native_function.rb b/lib/rhino/native_function.rb index d1fd45e..8fc8df1 100644 --- a/lib/rhino/native_function.rb +++ b/lib/rhino/native_function.rb @@ -1,5 +1,14 @@ module Rhino + + # Wraps a function that has been defined in Javascript so that it can + # be referenced and called from javascript. e.g. + # + # plus = Rhino::Context.open do |cx| + # cx.eval('function(lhs, rhs) {return lhs + rhs}') + # end + # plus.call(5,4) # => 9 + # class NativeFunction < NativeObject def call(*args) begin