johnson 1.1.2 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG.rdoc +12 -0
- data/Manifest.txt +6 -4
- data/README.rdoc +2 -8
- data/Rakefile +11 -11
- data/bin/johnson +1 -3
- data/ext/spidermonkey/context.c +3 -2
- data/ext/spidermonkey/conversions.c +61 -27
- data/ext/spidermonkey/conversions.h +13 -0
- data/ext/spidermonkey/debugger.c +13 -5
- data/ext/spidermonkey/debugger.h +1 -0
- data/ext/spidermonkey/extconf.rb +2 -3
- data/ext/spidermonkey/jroot.h +11 -1
- data/ext/spidermonkey/js_land_proxy.c +21 -11
- data/ext/spidermonkey/ruby_land_proxy.c +116 -41
- data/ext/spidermonkey/ruby_land_proxy.h +21 -0
- data/ext/spidermonkey/runtime.c +85 -19
- data/ext/spidermonkey/runtime.h +2 -0
- data/ext/spidermonkey/spidermonkey.c +3 -1
- data/lib/johnson.rb +19 -27
- data/lib/johnson/cli.rb +2 -1
- data/{js/johnson → lib/johnson/js}/cli.js +0 -0
- data/lib/johnson/js/core.js +34 -0
- data/lib/johnson/js/prelude.js +149 -0
- data/lib/johnson/ruby_land_proxy.rb +113 -0
- data/lib/johnson/runtime.rb +92 -33
- data/lib/johnson/spidermonkey.rb +12 -0
- data/lib/johnson/spidermonkey/js_land_proxy.rb +10 -8
- data/lib/johnson/spidermonkey/ruby_land_proxy.rb +10 -47
- data/lib/johnson/spidermonkey/runtime.rb +11 -31
- data/test/johnson/conversions/array_test.rb +41 -3
- data/test/johnson/conversions/string_test.rb +12 -0
- data/test/johnson/custom_conversions_test.rb +50 -0
- data/test/johnson/prelude_test.rb +23 -0
- data/test/johnson/runtime_test.rb +82 -2
- data/test/johnson/spidermonkey/ruby_land_proxy_test.rb +17 -1
- data/test/johnson/spidermonkey/runtime_test.rb +24 -0
- data/vendor/spidermonkey/jsprf.c +2 -0
- metadata +22 -9
- data/js/johnson/prelude.js +0 -80
- data/lib/johnson/version.rb +0 -3
- data/lib/rails/init.rb +0 -37
@@ -63,7 +63,9 @@ module Johnson
|
|
63
63
|
end
|
64
64
|
|
65
65
|
def test_calling_non_functions_complains
|
66
|
-
|
66
|
+
o = @runtime.evaluate("new Object()")
|
67
|
+
assert_equal(false, o.respond_to?(:call))
|
68
|
+
assert_raise(NoMethodError) { o.call }
|
67
69
|
end
|
68
70
|
|
69
71
|
def test_functions_can_be_called
|
@@ -102,6 +104,20 @@ module Johnson
|
|
102
104
|
assert_equal(42, proxy["bar"])
|
103
105
|
end
|
104
106
|
|
107
|
+
def test_can_be_indexed_by_symbol
|
108
|
+
proxy = @runtime.evaluate("x = { foo: 42 }")
|
109
|
+
assert_kind_of(Johnson::SpiderMonkey::RubyLandProxy, proxy)
|
110
|
+
|
111
|
+
assert_equal(42, proxy[:foo])
|
112
|
+
|
113
|
+
proxy[:foo] = 99
|
114
|
+
proxy[:bar] = 42
|
115
|
+
|
116
|
+
assert_js_equal(99, "x.foo")
|
117
|
+
assert_equal(99, proxy[:foo])
|
118
|
+
assert_equal(42, proxy[:bar])
|
119
|
+
end
|
120
|
+
|
105
121
|
def test_multilevel_indexing_works
|
106
122
|
proxy = @runtime.evaluate("x = { foo: { bar: 42 , baz: function() { return 42 } } }")
|
107
123
|
assert_equal(42, proxy["foo"]["bar"])
|
@@ -12,6 +12,30 @@ module Johnson
|
|
12
12
|
Johnson::SpiderMonkey::Runtime.new
|
13
13
|
}
|
14
14
|
end
|
15
|
+
|
16
|
+
def test_default_is_no_debugger
|
17
|
+
assert_equal false, @runtime.debugger?
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_only_accepts_real_debugger_instance
|
21
|
+
assert_raises(TypeError) {
|
22
|
+
@runtime.debugger = 17
|
23
|
+
}
|
24
|
+
assert_raises(TypeError) {
|
25
|
+
@runtime.debugger = "Yes please!"
|
26
|
+
}
|
27
|
+
assert_raises(TypeError) {
|
28
|
+
@runtime.debugger = Object.new
|
29
|
+
}
|
30
|
+
assert_raises(TypeError) {
|
31
|
+
@runtime.debugger = @runtime
|
32
|
+
}
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_reports_a_debugger_is_registered
|
36
|
+
@runtime.debugger = Johnson::SpiderMonkey::Debugger.new(nil)
|
37
|
+
assert @runtime.debugger?
|
38
|
+
end
|
15
39
|
end
|
16
40
|
end
|
17
41
|
end
|
data/vendor/spidermonkey/jsprf.c
CHANGED
@@ -58,6 +58,8 @@
|
|
58
58
|
*/
|
59
59
|
#ifdef HAVE_VA_COPY
|
60
60
|
#define VARARGS_ASSIGN(foo, bar) VA_COPY(foo,bar)
|
61
|
+
#elif defined(va_copy)
|
62
|
+
#define VARARGS_ASSIGN(foo, bar) va_copy(foo,bar)
|
61
63
|
#elif defined(HAVE_VA_LIST_AS_ARRAY)
|
62
64
|
#define VARARGS_ASSIGN(foo, bar) foo[0] = bar[0]
|
63
65
|
#else
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: johnson
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John Barnette
|
@@ -12,18 +12,28 @@ autorequire:
|
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
14
|
|
15
|
-
date:
|
15
|
+
date: 2010-01-25 00:00:00 -08:00
|
16
16
|
default_executable:
|
17
17
|
dependencies:
|
18
18
|
- !ruby/object:Gem::Dependency
|
19
|
-
name:
|
19
|
+
name: gemcutter
|
20
20
|
type: :development
|
21
21
|
version_requirement:
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.
|
26
|
+
version: 0.2.1
|
27
|
+
version:
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: rake-compiler
|
30
|
+
type: :development
|
31
|
+
version_requirement:
|
32
|
+
version_requirements: !ruby/object:Gem::Requirement
|
33
|
+
requirements:
|
34
|
+
- - ~>
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: "0.6"
|
27
37
|
version:
|
28
38
|
- !ruby/object:Gem::Dependency
|
29
39
|
name: hoe
|
@@ -33,7 +43,7 @@ dependencies:
|
|
33
43
|
requirements:
|
34
44
|
- - ">="
|
35
45
|
- !ruby/object:Gem::Version
|
36
|
-
version: 2.
|
46
|
+
version: 2.5.0
|
37
47
|
version:
|
38
48
|
description: |-
|
39
49
|
Johnson wraps JavaScript in a loving Ruby embrace. It embeds the
|
@@ -83,12 +93,13 @@ files:
|
|
83
93
|
- ext/spidermonkey/runtime.h
|
84
94
|
- ext/spidermonkey/spidermonkey.c
|
85
95
|
- ext/spidermonkey/spidermonkey.h
|
86
|
-
- js/johnson/cli.js
|
87
|
-
- js/johnson/prelude.js
|
88
96
|
- lib/johnson.rb
|
89
97
|
- lib/johnson/cli.rb
|
90
98
|
- lib/johnson/cli/options.rb
|
91
99
|
- lib/johnson/error.rb
|
100
|
+
- lib/johnson/js/cli.js
|
101
|
+
- lib/johnson/js/core.js
|
102
|
+
- lib/johnson/js/prelude.js
|
92
103
|
- lib/johnson/nodes.rb
|
93
104
|
- lib/johnson/nodes/binary_node.rb
|
94
105
|
- lib/johnson/nodes/for.rb
|
@@ -99,7 +110,9 @@ files:
|
|
99
110
|
- lib/johnson/nodes/ternary_node.rb
|
100
111
|
- lib/johnson/parser.rb
|
101
112
|
- lib/johnson/parser/syntax_error.rb
|
113
|
+
- lib/johnson/ruby_land_proxy.rb
|
102
114
|
- lib/johnson/runtime.rb
|
115
|
+
- lib/johnson/spidermonkey.rb
|
103
116
|
- lib/johnson/spidermonkey/context.rb
|
104
117
|
- lib/johnson/spidermonkey/debugger.rb
|
105
118
|
- lib/johnson/spidermonkey/immutable_node.rb
|
@@ -107,7 +120,6 @@ files:
|
|
107
120
|
- lib/johnson/spidermonkey/mutable_tree_visitor.rb
|
108
121
|
- lib/johnson/spidermonkey/ruby_land_proxy.rb
|
109
122
|
- lib/johnson/spidermonkey/runtime.rb
|
110
|
-
- lib/johnson/version.rb
|
111
123
|
- lib/johnson/visitable.rb
|
112
124
|
- lib/johnson/visitors.rb
|
113
125
|
- lib/johnson/visitors/dot_visitor.rb
|
@@ -115,7 +127,6 @@ files:
|
|
115
127
|
- lib/johnson/visitors/enumerating_visitor.rb
|
116
128
|
- lib/johnson/visitors/sexp_visitor.rb
|
117
129
|
- lib/johnson/visitors/visitor.rb
|
118
|
-
- lib/rails/init.rb
|
119
130
|
- test/helper.rb
|
120
131
|
- test/johnson/browser_test.rb
|
121
132
|
- test/johnson/conversions/array_test.rb
|
@@ -129,6 +140,7 @@ files:
|
|
129
140
|
- test/johnson/conversions/struct_test.rb
|
130
141
|
- test/johnson/conversions/symbol_test.rb
|
131
142
|
- test/johnson/conversions/thread_test.rb
|
143
|
+
- test/johnson/custom_conversions_test.rb
|
132
144
|
- test/johnson/error_test.rb
|
133
145
|
- test/johnson/extensions_test.rb
|
134
146
|
- test/johnson/nodes/array_literal_test.rb
|
@@ -458,6 +470,7 @@ test_files:
|
|
458
470
|
- test/johnson/conversions/struct_test.rb
|
459
471
|
- test/johnson/conversions/symbol_test.rb
|
460
472
|
- test/johnson/conversions/thread_test.rb
|
473
|
+
- test/johnson/custom_conversions_test.rb
|
461
474
|
- test/johnson/error_test.rb
|
462
475
|
- test/johnson/extensions_test.rb
|
463
476
|
- test/johnson/nodes/array_literal_test.rb
|
data/js/johnson/prelude.js
DELETED
@@ -1,80 +0,0 @@
|
|
1
|
-
var Johnson = {};
|
2
|
-
|
3
|
-
Johnson.Symbol = function(string) {
|
4
|
-
this.string = string;
|
5
|
-
};
|
6
|
-
|
7
|
-
Johnson.Symbol.prototype = {
|
8
|
-
toString: function() {
|
9
|
-
return this.string;
|
10
|
-
},
|
11
|
-
|
12
|
-
inspect: function() {
|
13
|
-
return ":" + this.toString();
|
14
|
-
}
|
15
|
-
};
|
16
|
-
|
17
|
-
Johnson.symbolCache = {};
|
18
|
-
|
19
|
-
Johnson.symbolize = function(string) {
|
20
|
-
if (!Johnson.symbolCache[string])
|
21
|
-
Johnson.symbolCache[string] = new Johnson.Symbol(string);
|
22
|
-
|
23
|
-
return Johnson.symbolCache[string];
|
24
|
-
};
|
25
|
-
|
26
|
-
Object.defineProperty(String.prototype, "toSymbol", function() {
|
27
|
-
return Johnson.symbolize(this.toString());
|
28
|
-
}, Object.READ_ONLY | Object.NON_DELETABLE);
|
29
|
-
|
30
|
-
Johnson.Generator = function(enumerableProxy) {
|
31
|
-
this.items = enumerableProxy.toArray();
|
32
|
-
this.index = 0;
|
33
|
-
};
|
34
|
-
|
35
|
-
Johnson.Generator.prototype.hasNext = function() {
|
36
|
-
var len = this.items.length;
|
37
|
-
if (typeof len != 'number') len = this.items.length();
|
38
|
-
return this.index < len;
|
39
|
-
}
|
40
|
-
|
41
|
-
Johnson.Generator.prototype.next = function() {
|
42
|
-
if (this.hasNext()) {
|
43
|
-
return this.items[this.index++];
|
44
|
-
}
|
45
|
-
throw StopIteration;
|
46
|
-
}
|
47
|
-
|
48
|
-
Johnson.Generator.create = function() {
|
49
|
-
return new Johnson.Generator(this);
|
50
|
-
}
|
51
|
-
|
52
|
-
Johnson.required = {};
|
53
|
-
|
54
|
-
Johnson.require = function(file) {
|
55
|
-
file = Ruby.File.join(Ruby.File.dirname(file),
|
56
|
-
Ruby.File.basename(file, ".js") + ".js");
|
57
|
-
|
58
|
-
if(Johnson.required[file]) return false;
|
59
|
-
|
60
|
-
for(var directory in Ruby["$LOAD_PATH"]) {
|
61
|
-
var path = Ruby.File.join(directory, file);
|
62
|
-
|
63
|
-
if(Ruby.File.send("file?", path)) {
|
64
|
-
Johnson.required[file] = true;
|
65
|
-
Johnson.runtime.load(path);
|
66
|
-
|
67
|
-
return true;
|
68
|
-
}
|
69
|
-
}
|
70
|
-
|
71
|
-
throw Ruby.LoadError;
|
72
|
-
}
|
73
|
-
|
74
|
-
this.__defineGetter__("__FILE__", function() {
|
75
|
-
try { throw new Error; } catch(e) {
|
76
|
-
return e.stack.split("\n")[2].split("@")[1].split(":").slice(0,-1).join(":");
|
77
|
-
}
|
78
|
-
})
|
79
|
-
|
80
|
-
null; // no need to marshal a result
|
data/lib/johnson/version.rb
DELETED
data/lib/rails/init.rb
DELETED
@@ -1,37 +0,0 @@
|
|
1
|
-
require 'johnson'
|
2
|
-
|
3
|
-
class EJSHandler < ActionView::TemplateHandler
|
4
|
-
class EJSProxy # :nodoc:
|
5
|
-
def initialize(controller)
|
6
|
-
@controller = controller
|
7
|
-
end
|
8
|
-
|
9
|
-
def key?(pooperty)
|
10
|
-
@controller.instance_variables.include?("@#{pooperty}")
|
11
|
-
end
|
12
|
-
|
13
|
-
def [](pooperty)
|
14
|
-
@controller.instance_variable_get("@#{pooperty}")
|
15
|
-
end
|
16
|
-
|
17
|
-
def []=(pooperty, value)
|
18
|
-
@controller.instance_variable_set("@#{pooperty}", value)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
def initialize(view)
|
23
|
-
@view = view
|
24
|
-
end
|
25
|
-
|
26
|
-
def render(template)
|
27
|
-
ctx = Johnson::Runtime.new
|
28
|
-
ctx.evaluate('Johnson.require("johnson/template");')
|
29
|
-
ctx['template'] = template.source
|
30
|
-
ctx['controller'] = @view.controller
|
31
|
-
ctx['at'] = EJSProxy.new(@view.controller)
|
32
|
-
|
33
|
-
ctx.evaluate('Johnson.templatize(template).call(at)')
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
ActionView::Template.register_template_handler("ejs", EJSHandler)
|