johnson 2.0.0.pre2 → 2.0.0.pre3
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.rdoc +6 -0
- data/ext/tracemonkey/js.cc +4 -4
- data/ext/tracemonkey/js_land_proxy.cc +101 -55
- data/ext/tracemonkey/runtime.cc +11 -22
- data/lib/johnson.rb +1 -1
- data/lib/johnson/js/prelude.js +4 -1
- data/lib/johnson/tracemonkey/runtime.rb +1 -1
- data/test/johnson/tracemonkey/ruby_land_proxy_test.rb +6 -17
- metadata +3 -3
data/CHANGELOG.rdoc
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
=== 2.0.0.pre3 / 2010-03-02
|
2
|
+
|
3
|
+
* convert/protect predicates so that exceptions don't cause stack-jumping SEGVs
|
4
|
+
* various cleanup of ext functions
|
5
|
+
* convert runtime size parameter correctly
|
6
|
+
|
1
7
|
=== 2.0.0.pre2 / 2010-02-23
|
2
8
|
|
3
9
|
* Raise NoMemoryError as appropriate; acccept a size parameter or env variable for runtime size
|
data/ext/tracemonkey/js.cc
CHANGED
@@ -101,13 +101,13 @@ split_addProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
|
|
101
101
|
uintN attrs = 0;
|
102
102
|
JSBool found;
|
103
103
|
|
104
|
-
|
105
|
-
|
106
|
-
if (!JS_ValueToId(cx, *vp, &asId)) {
|
104
|
+
if (!JS_ValueToId(cx, id, &asId)) {
|
107
105
|
return JS_FALSE;
|
108
106
|
}
|
109
107
|
|
110
|
-
|
108
|
+
JS_GetPropertyAttrsGetterAndSetterById(cx, obj, asId, &attrs, &found, &getter, &setter);
|
109
|
+
|
110
|
+
return JS_DefinePropertyById(cx, cpx->inner, asId, *vp, getter, setter, attrs | JSPROP_ENUMERATE);
|
111
111
|
}
|
112
112
|
return JS_TRUE;
|
113
113
|
}
|
@@ -99,35 +99,61 @@ JSBool call_ruby_from_js2(JohnsonRuntime* runtime, VALUE* retval, VALUE self, ID
|
|
99
99
|
return okay;
|
100
100
|
}
|
101
101
|
|
102
|
-
static
|
102
|
+
static VALUE autovivified_p(VALUE self, VALUE name, ID id);
|
103
|
+
|
104
|
+
DECLARE_RUBY_WRAPPER(autovivified_p, VALUE self; VALUE name; ID id);
|
105
|
+
DEFINE_RUBY_WRAPPER(autovivified_p, autovivified_p, ARGLIST3(self, name, id));
|
106
|
+
|
107
|
+
static VALUE autovivified_p(VALUE self, VALUE name, ID UNUSED(id))
|
103
108
|
{
|
104
109
|
return RTEST(rb_funcall(Johnson_TraceMonkey_JSLandProxy(), rb_intern("autovivified?"), 2,
|
105
|
-
self,
|
110
|
+
self, name)) ? Qtrue : Qfalse;
|
106
111
|
}
|
107
112
|
|
108
|
-
static
|
113
|
+
static VALUE const_p(VALUE self, VALUE name, ID id);
|
114
|
+
|
115
|
+
DECLARE_RUBY_WRAPPER(const_p, VALUE self; VALUE name; ID id);
|
116
|
+
DEFINE_RUBY_WRAPPER(const_p, const_p, ARGLIST3(self, name, id));
|
117
|
+
|
118
|
+
static VALUE const_p(VALUE self, VALUE UNUSED(name), VALUE id)
|
109
119
|
{
|
110
|
-
|
111
|
-
|
112
|
-
&&
|
120
|
+
|
121
|
+
return (rb_obj_is_kind_of(self, rb_cModule)
|
122
|
+
&& rb_is_const_id(id)
|
123
|
+
&& RTEST( rb_funcall(self, rb_intern("const_defined?"), 1, ID2SYM(id) ))) ? Qtrue : Qfalse;
|
113
124
|
}
|
114
125
|
|
115
|
-
static
|
126
|
+
static VALUE global_p(VALUE name);
|
127
|
+
|
128
|
+
DECLARE_RUBY_WRAPPER(global_p, VALUE name);
|
129
|
+
DEFINE_RUBY_WRAPPER(global_p, global_p, ARGLIST1(name));
|
130
|
+
|
131
|
+
static VALUE global_p(VALUE name)
|
116
132
|
{
|
117
|
-
return *name == '$' && rb_ary_includes(rb_f_global_variables(),
|
133
|
+
return (*StringValuePtr(name) == '$' && rb_ary_includes(rb_f_global_variables(), name)) ? Qtrue : Qfalse;
|
118
134
|
}
|
119
135
|
|
120
|
-
static
|
136
|
+
static VALUE method_p(VALUE self, VALUE name, ID id);
|
137
|
+
|
138
|
+
DECLARE_RUBY_WRAPPER(method_p, VALUE self; VALUE name; ID id);
|
139
|
+
DEFINE_RUBY_WRAPPER(method_p, method_p, ARGLIST3(self, name, id));
|
140
|
+
|
141
|
+
static VALUE method_p(VALUE self, VALUE UNUSED(name), ID id)
|
121
142
|
{
|
122
|
-
return RTEST( rb_funcall(self, rb_intern("respond_to?"), 1, ID2SYM(
|
143
|
+
return (RTEST( rb_funcall(self, rb_intern("respond_to?"), 1, ID2SYM(id) ) )) ? Qtrue : Qfalse;
|
123
144
|
}
|
124
145
|
|
125
|
-
static
|
146
|
+
static VALUE attribute_p(VALUE self, VALUE name, ID id);
|
147
|
+
|
148
|
+
DECLARE_RUBY_WRAPPER(attribute_p, VALUE self; VALUE name; ID id);
|
149
|
+
DEFINE_RUBY_WRAPPER(attribute_p, attribute_p, ARGLIST3(self, name, id));
|
150
|
+
|
151
|
+
static VALUE attribute_p(VALUE self, VALUE name, ID id)
|
126
152
|
{
|
127
|
-
if (!method_p(self, name))
|
128
|
-
return
|
153
|
+
if (!method_p(self, name, id))
|
154
|
+
return Qfalse;
|
129
155
|
|
130
|
-
VALUE rb_id =
|
156
|
+
VALUE rb_id = id;
|
131
157
|
VALUE rb_method = rb_funcall(self, rb_intern("method"), 1, ID2SYM(rb_id));
|
132
158
|
|
133
159
|
if (TYPE(rb_method) == T_DATA)
|
@@ -139,50 +165,56 @@ static bool attribute_p(VALUE self, char* name)
|
|
139
165
|
Data_Get_Struct(rb_method, METHOD, method);
|
140
166
|
|
141
167
|
if (method && nd_type(method->body) == NODE_IVAR)
|
142
|
-
return
|
168
|
+
return Qtrue;
|
143
169
|
}
|
144
170
|
}
|
145
171
|
|
146
|
-
return RTEST(rb_funcall(Johnson_TraceMonkey_JSLandProxy(),
|
147
|
-
rb_intern("js_property?"), 2, self, ID2SYM(rb_id)));
|
172
|
+
return (RTEST(rb_funcall(Johnson_TraceMonkey_JSLandProxy(),
|
173
|
+
rb_intern("js_property?"), 2, self, ID2SYM(rb_id)))) ? Qtrue : Qfalse;
|
148
174
|
}
|
149
175
|
|
150
|
-
static
|
176
|
+
static VALUE indexable_p(VALUE self);
|
177
|
+
|
178
|
+
DECLARE_RUBY_WRAPPER(indexable_p, VALUE self);
|
179
|
+
DEFINE_RUBY_WRAPPER(indexable_p, indexable_p, ARGLIST1(self));
|
180
|
+
|
181
|
+
static VALUE indexable_p(VALUE self)
|
151
182
|
{
|
152
|
-
return RTEST(rb_funcall(self, rb_intern("respond_to?"), 1, ID2SYM(rb_intern("[]"))));
|
183
|
+
return (RTEST(rb_funcall(self, rb_intern("respond_to?"), 1, ID2SYM(rb_intern("[]"))))) ? Qtrue : Qfalse;
|
153
184
|
}
|
154
185
|
|
155
|
-
static
|
186
|
+
static VALUE has_key_p(VALUE self, VALUE name, ID id);
|
187
|
+
|
188
|
+
DECLARE_RUBY_WRAPPER(has_key_p, VALUE self; VALUE name; ID id);
|
189
|
+
DEFINE_RUBY_WRAPPER(has_key_p, has_key_p, ARGLIST3(self, name, id));
|
190
|
+
|
191
|
+
static VALUE has_key_p(VALUE self, VALUE name, ID UNUSED(id))
|
156
192
|
{
|
157
|
-
return RTEST(rb_funcall(self, rb_intern("respond_to?"), 1, ID2SYM(rb_intern("[]"))))
|
193
|
+
return (RTEST(rb_funcall(self, rb_intern("respond_to?"), 1, ID2SYM(rb_intern("[]"))))
|
158
194
|
&& RTEST(rb_funcall(self, rb_intern("respond_to?"), 1, ID2SYM(rb_intern("key?"))))
|
159
|
-
&& RTEST(rb_funcall(self, rb_intern("key?"), 1,
|
195
|
+
&& RTEST(rb_funcall(self, rb_intern("key?"), 1, name))) ? Qtrue : Qfalse;
|
160
196
|
}
|
161
197
|
|
162
|
-
static
|
163
|
-
{
|
164
|
-
VALUE ruby_context = (VALUE)JS_GetContextPrivate(js_context);
|
165
|
-
|
166
|
-
JohnsonContext* context;
|
167
|
-
Data_Get_Struct(ruby_context, JohnsonContext, context);
|
168
|
-
|
169
|
-
VALUE self = (VALUE)JS_GetInstancePrivate(
|
170
|
-
context->js, obj, JS_GET_CLASS(context->js, obj), NULL);
|
198
|
+
static VALUE respond_to_p(VALUE self, VALUE name, ID id);
|
171
199
|
|
172
|
-
|
200
|
+
DECLARE_RUBY_WRAPPER(respond_to_p, VALUE self; VALUE name; ID id);
|
201
|
+
DEFINE_RUBY_WRAPPER(respond_to_p, respond_to_p, ARGLIST3(self, name, id));
|
173
202
|
|
174
|
-
|
175
|
-
|
203
|
+
static VALUE respond_to_p(VALUE self, VALUE name, ID id)
|
204
|
+
{
|
205
|
+
return (autovivified_p(self, name, id)
|
206
|
+
|| const_p(self, name, id)
|
176
207
|
|| global_p(name)
|
177
|
-
|| attribute_p(self, name)
|
178
|
-
|| method_p(self, name)
|
179
|
-
|| has_key_p(self, name);
|
208
|
+
|| attribute_p(self, name, id)
|
209
|
+
|| method_p(self, name, id)
|
210
|
+
|| has_key_p(self, name, id)) ? Qtrue : Qfalse;
|
180
211
|
}
|
181
212
|
|
182
|
-
static jsval evaluate_js_property_expression(JohnsonRuntime * runtime,
|
183
|
-
|
213
|
+
static jsval evaluate_js_property_expression(JohnsonRuntime * runtime,
|
214
|
+
JSContext * js_context,
|
215
|
+
const char * property, jsval* retval) {
|
184
216
|
assert(strlen(property) < INT_MAX);
|
185
|
-
return JS_EvaluateScript(
|
217
|
+
return JS_EvaluateScript(js_context, runtime->global,
|
186
218
|
property, (unsigned int)strlen(property), "johnson:evaluate_js_property_expression", 1,
|
187
219
|
retval);
|
188
220
|
}
|
@@ -213,7 +245,8 @@ static JSBool get(JSContext* js_context, JSObject* obj, jsval id, jsval* retval)
|
|
213
245
|
|
214
246
|
if (JSVAL_IS_INT(id))
|
215
247
|
{
|
216
|
-
if (indexable_p
|
248
|
+
if (CALL_RUBY_WRAPPER(indexable_p, self))
|
249
|
+
{
|
217
250
|
VALUE idx = INT2FIX(JSVAL_TO_INT(id));
|
218
251
|
JCHECK(call_ruby_from_js(runtime, retval, self, rb_intern("[]"), 1, idx));
|
219
252
|
}
|
@@ -222,19 +255,20 @@ static JSBool get(JSContext* js_context, JSObject* obj, jsval id, jsval* retval)
|
|
222
255
|
}
|
223
256
|
|
224
257
|
char* name = JS_GetStringBytes(JSVAL_TO_STRING(id));
|
225
|
-
VALUE
|
258
|
+
VALUE name_value = rb_str_new2(name);
|
259
|
+
VALUE ruby_id = rb_to_id(name_value);
|
226
260
|
|
227
261
|
// FIXME: we should probably just JS_DefineProperty this, and it shouldn't be enumerable
|
228
262
|
|
229
263
|
if (!strcasecmp("__iterator__", name)) {
|
230
|
-
JCHECK(evaluate_js_property_expression(runtime, "Johnson.Generator.create", retval));
|
264
|
+
JCHECK(evaluate_js_property_expression(runtime, js_context, "Johnson.Generator.create", retval));
|
231
265
|
}
|
232
266
|
|
233
267
|
// if the Ruby object has a dynamic js property with a key
|
234
268
|
// matching the property we're looking for, pull the value out of
|
235
269
|
// that map.
|
236
270
|
|
237
|
-
else if (autovivified_p
|
271
|
+
else if (CALL_RUBY_WRAPPER(autovivified_p, self, name_value, ruby_id))
|
238
272
|
{
|
239
273
|
JCHECK(call_ruby_from_js(runtime, retval, Johnson_TraceMonkey_JSLandProxy(),
|
240
274
|
rb_intern("autovivified"), 2, self, rb_str_new2(name)));
|
@@ -243,14 +277,14 @@ static JSBool get(JSContext* js_context, JSObject* obj, jsval id, jsval* retval)
|
|
243
277
|
// if the Ruby object is a Module or Class and has a matching
|
244
278
|
// const defined, return the converted result of const_get
|
245
279
|
|
246
|
-
else if (const_p
|
280
|
+
else if (CALL_RUBY_WRAPPER(const_p, self, name_value, ruby_id))
|
247
281
|
{
|
248
282
|
JCHECK(call_ruby_from_js(runtime, retval, self, rb_intern("const_get"),
|
249
283
|
1, ID2SYM(ruby_id)));
|
250
284
|
}
|
251
285
|
|
252
286
|
// otherwise, if it's a global, return the global
|
253
|
-
else if (global_p
|
287
|
+
else if (CALL_RUBY_WRAPPER(global_p, name_value))
|
254
288
|
{
|
255
289
|
JCHECK(convert_to_js(runtime, rb_gv_get(name), retval));
|
256
290
|
}
|
@@ -258,7 +292,7 @@ static JSBool get(JSContext* js_context, JSObject* obj, jsval id, jsval* retval)
|
|
258
292
|
// otherwise, if the Ruby object has a an attribute method matching
|
259
293
|
// the property we're trying to get, call it and return the converted result
|
260
294
|
|
261
|
-
else if (attribute_p
|
295
|
+
else if (CALL_RUBY_WRAPPER(attribute_p, self, name_value, ruby_id))
|
262
296
|
{
|
263
297
|
JCHECK(call_ruby_from_js(runtime, retval, self, ruby_id, 0));
|
264
298
|
}
|
@@ -266,7 +300,7 @@ static JSBool get(JSContext* js_context, JSObject* obj, jsval id, jsval* retval)
|
|
266
300
|
// otherwise, if the Ruby object quacks sorta like a hash (it responds to
|
267
301
|
// "[]" and "key?"), index it by key and return the converted result
|
268
302
|
|
269
|
-
else if (has_key_p
|
303
|
+
else if (CALL_RUBY_WRAPPER(has_key_p, self, name_value, ruby_id))
|
270
304
|
{
|
271
305
|
JCHECK(call_ruby_from_js(runtime, retval, self, rb_intern("[]"), 1, rb_str_new2(name)));
|
272
306
|
}
|
@@ -277,7 +311,7 @@ static JSBool get(JSContext* js_context, JSObject* obj, jsval id, jsval* retval)
|
|
277
311
|
// FIXME: this should really wrap the Method for 'name' in a JS class
|
278
312
|
// rather than generating a wrapper Proc
|
279
313
|
|
280
|
-
else if (method_p
|
314
|
+
else if (CALL_RUBY_WRAPPER(method_p, self, name_value, ruby_id))
|
281
315
|
{
|
282
316
|
JCHECK(call_ruby_from_js(runtime, retval, self, rb_intern("method"), 1, rb_str_new2(name)));
|
283
317
|
}
|
@@ -319,7 +353,7 @@ static JSBool set(JSContext* js_context, JSObject* obj, jsval id, jsval* value)
|
|
319
353
|
|
320
354
|
if (JSVAL_IS_INT(id))
|
321
355
|
{
|
322
|
-
if (indexable_p
|
356
|
+
if (CALL_RUBY_WRAPPER(indexable_p, self))
|
323
357
|
{
|
324
358
|
VALUE idx = INT2FIX(JSVAL_TO_INT(id));
|
325
359
|
VALUE val = CONVERT_TO_RUBY(runtime, *value);
|
@@ -403,11 +437,17 @@ static JSBool resolve(JSContext *js_context, JSObject *obj, jsval id, uintN UNUS
|
|
403
437
|
PREPARE_JROOTS(js_context, 1);
|
404
438
|
JROOT(id);
|
405
439
|
|
406
|
-
|
440
|
+
VALUE self =
|
441
|
+
(VALUE)JS_GetInstancePrivate(js_context, obj, JS_GET_CLASS(js_context, obj), NULL);
|
407
442
|
|
408
|
-
|
443
|
+
char* cname = JS_GetStringBytes(JS_ValueToString(js_context, id));
|
444
|
+
|
445
|
+
VALUE name = rb_str_new2(cname);
|
446
|
+
ID ruby_id = rb_intern(cname);
|
447
|
+
|
448
|
+
if (CALL_RUBY_WRAPPER(respond_to_p, self, name, ruby_id))
|
409
449
|
{
|
410
|
-
JCHECK(JS_DefineProperty(js_context, obj,
|
450
|
+
JCHECK(JS_DefineProperty(js_context, obj, cname, JSVAL_VOID,
|
411
451
|
get_and_destroy_resolved_property, set, JSPROP_ENUMERATE));
|
412
452
|
|
413
453
|
*objp = obj;
|
@@ -512,8 +552,9 @@ static JSBool call(JSContext* js_context, JSObject* UNUSED(obj), uintN argc, jsv
|
|
512
552
|
|
513
553
|
bool js_value_is_proxy(JohnsonRuntime* MAYBE_UNUSED(runtime), jsval maybe_proxy)
|
514
554
|
{
|
555
|
+
JSContext* js_context = johnson_get_current_context(runtime);
|
515
556
|
JSClass* klass = JS_GET_CLASS(
|
516
|
-
|
557
|
+
js_context,
|
517
558
|
JSVAL_TO_OBJECT(maybe_proxy));
|
518
559
|
|
519
560
|
return &JSLandProxyClass == klass
|
@@ -565,7 +606,7 @@ JSBool make_js_land_proxy(JohnsonRuntime* runtime, VALUE value, jsval* retval)
|
|
565
606
|
PREPARE_JROOTS(context, 2);
|
566
607
|
|
567
608
|
jsval johnson = JSVAL_NULL;
|
568
|
-
JCHECK(evaluate_js_property_expression(runtime, "Johnson", &johnson));
|
609
|
+
JCHECK(evaluate_js_property_expression(runtime, context, "Johnson", &johnson));
|
569
610
|
JROOT(johnson);
|
570
611
|
|
571
612
|
if (base_value)
|
@@ -618,3 +659,8 @@ JSBool make_js_land_proxy(JohnsonRuntime* runtime, VALUE value, jsval* retval)
|
|
618
659
|
JRETURN;
|
619
660
|
}
|
620
661
|
}
|
662
|
+
|
663
|
+
// Local Variables:
|
664
|
+
// c-basic-offset:2
|
665
|
+
// tab-width:2
|
666
|
+
// End:
|
data/ext/tracemonkey/runtime.cc
CHANGED
@@ -19,6 +19,7 @@ static VALUE global(VALUE self)
|
|
19
19
|
{
|
20
20
|
JohnsonRuntime* runtime;
|
21
21
|
Data_Get_Struct(self, JohnsonRuntime, runtime);
|
22
|
+
JSContext * context = johnson_get_current_context(runtime);
|
22
23
|
return convert_to_ruby(runtime, OBJECT_TO_JSVAL(runtime->global));
|
23
24
|
}
|
24
25
|
|
@@ -27,10 +28,8 @@ static VALUE new_global(VALUE self)
|
|
27
28
|
JohnsonRuntime* runtime;
|
28
29
|
Data_Get_Struct(self, JohnsonRuntime, runtime);
|
29
30
|
JSContext * context = johnson_get_current_context(runtime);
|
30
|
-
|
31
|
-
PREPARE_RUBY_JROOTS(context, 0);
|
32
31
|
JSObject* obj = johnson_create_global_object(context);
|
33
|
-
|
32
|
+
return convert_to_ruby(runtime, OBJECT_TO_JSVAL(obj));
|
34
33
|
}
|
35
34
|
|
36
35
|
static VALUE new_split_global_outer(VALUE self)
|
@@ -38,12 +37,8 @@ static VALUE new_split_global_outer(VALUE self)
|
|
38
37
|
JohnsonRuntime* runtime;
|
39
38
|
Data_Get_Struct(self, JohnsonRuntime, runtime);
|
40
39
|
JSContext * context = johnson_get_current_context(runtime);
|
41
|
-
|
42
|
-
PREPARE_RUBY_JROOTS(context, 0);
|
43
|
-
|
44
40
|
JSObject* new_split_global_outer_object = johnson_create_split_global_outer_object(context);
|
45
|
-
|
46
|
-
JRETURN_RUBY(convert_to_ruby(runtime, OBJECT_TO_JSVAL(new_split_global_outer_object)));
|
41
|
+
return convert_to_ruby(runtime, OBJECT_TO_JSVAL(new_split_global_outer_object));
|
47
42
|
}
|
48
43
|
|
49
44
|
static VALUE new_split_global_inner(VALUE self, VALUE ruby_outer)
|
@@ -51,17 +46,10 @@ static VALUE new_split_global_inner(VALUE self, VALUE ruby_outer)
|
|
51
46
|
JohnsonRuntime* runtime;
|
52
47
|
Data_Get_Struct(self, JohnsonRuntime, runtime);
|
53
48
|
JSContext * context = johnson_get_current_context(runtime);
|
54
|
-
|
55
|
-
PREPARE_RUBY_JROOTS(context, 1);
|
56
|
-
|
57
49
|
jsval outer;
|
58
|
-
|
59
|
-
JCHECK(convert_to_js(runtime,ruby_outer,&outer));
|
60
|
-
JROOT(outer);
|
61
|
-
|
50
|
+
convert_to_js(runtime,ruby_outer,&outer);
|
62
51
|
JSObject* new_inner_object = johnson_create_split_global_inner_object(context,JSVAL_TO_OBJECT(outer));
|
63
|
-
|
64
|
-
JRETURN_RUBY(convert_to_ruby(runtime, OBJECT_TO_JSVAL(new_inner_object)));
|
52
|
+
return convert_to_ruby(runtime, OBJECT_TO_JSVAL(new_inner_object));
|
65
53
|
}
|
66
54
|
|
67
55
|
static VALUE seal(VALUE self, VALUE ruby_object, VALUE deep)
|
@@ -75,11 +63,11 @@ static VALUE seal(VALUE self, VALUE ruby_object, VALUE deep)
|
|
75
63
|
jsval object;
|
76
64
|
|
77
65
|
JCHECK(convert_to_js(runtime,ruby_object,&object));
|
78
|
-
JROOT(object);
|
79
66
|
|
80
|
-
|
67
|
+
JROOT(object);
|
81
68
|
|
82
|
-
|
69
|
+
JCHECK(JS_SealObject(context, JSVAL_TO_OBJECT(object), RTEST(deep) ? JS_TRUE : JS_FALSE));
|
70
|
+
JRETURN_RUBY(Qtrue);
|
83
71
|
}
|
84
72
|
|
85
73
|
static JSTrapStatus trap_handler( JSContext *context,
|
@@ -253,7 +241,8 @@ static VALUE evaluate_compiled_script(VALUE self, VALUE compiled_script, VALUE r
|
|
253
241
|
return Qnil;
|
254
242
|
}
|
255
243
|
|
256
|
-
|
244
|
+
PREPARE_RUBY_JROOTS(context, 0);
|
245
|
+
JRETURN_RUBY(CONVERT_TO_RUBY(runtime, js));
|
257
246
|
}
|
258
247
|
|
259
248
|
#ifdef JS_GC_ZEAL
|
@@ -525,7 +514,7 @@ void init_Johnson_TraceMonkey_Runtime(VALUE tracemonkey)
|
|
525
514
|
rb_define_private_method(klass, "initialize_native", (ruby_callback)initialize_native, 2);
|
526
515
|
|
527
516
|
rb_define_method(klass, "global", (ruby_callback)global, 0);
|
528
|
-
rb_define_method(klass, "new_global", (ruby_callback)
|
517
|
+
rb_define_method(klass, "new_global", (ruby_callback)new_global, 0);
|
529
518
|
|
530
519
|
rb_define_method(klass, "new_split_global_outer", (ruby_callback)new_split_global_outer, 0);
|
531
520
|
rb_define_method(klass, "new_split_global_inner", (ruby_callback)new_split_global_inner, 1);
|
data/lib/johnson.rb
CHANGED
data/lib/johnson/js/prelude.js
CHANGED
@@ -157,7 +157,10 @@ this.__defineGetter__("__FILE__", function() {
|
|
157
157
|
|
158
158
|
Johnson.getStack = function() {
|
159
159
|
try { throw new Error; } catch(e) {
|
160
|
-
return e.stack.
|
160
|
+
return e.stack.
|
161
|
+
replace(/^Error\(\)@:0\n/,"").
|
162
|
+
replace(/^\(\)@[^\n]*prelude\.js[^\n]*\n/,"").
|
163
|
+
replace(/^@:0\n/,"");
|
161
164
|
}
|
162
165
|
};
|
163
166
|
|
@@ -12,7 +12,7 @@ module Johnson #:nodoc:
|
|
12
12
|
@debugger = nil
|
13
13
|
@gcthings = {}
|
14
14
|
@traps = []
|
15
|
-
size = (options[:size] || options["size"] || ENV["JOHNSON_HEAP_SIZE"] || 0x2000000)
|
15
|
+
size = (options[:size] || options["size"] || Integer(ENV["JOHNSON_HEAP_SIZE"] || 0x2000000))
|
16
16
|
options.delete(:size)
|
17
17
|
initialize_native(size, options)
|
18
18
|
super()
|
@@ -252,23 +252,12 @@ module Johnson
|
|
252
252
|
assert_equal(3, z)
|
253
253
|
end
|
254
254
|
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
#
|
262
|
-
# WTF?
|
263
|
-
#
|
264
|
-
# -Aaron
|
265
|
-
#
|
266
|
-
#def test_throwing_in_js_goes_to_ruby
|
267
|
-
# func = @runtime.evaluate('function () { throw "foo"; }')
|
268
|
-
# assert_raise(Johnson::Error) {
|
269
|
-
# func.call
|
270
|
-
# }
|
271
|
-
#end
|
255
|
+
def test_throwing_in_js_goes_to_ruby
|
256
|
+
func = @runtime.evaluate('function () { throw "foo"; }')
|
257
|
+
assert_raise(Johnson::Error) {
|
258
|
+
func.call
|
259
|
+
}
|
260
|
+
end
|
272
261
|
end
|
273
262
|
end
|
274
263
|
end
|
metadata
CHANGED
@@ -6,8 +6,8 @@ version: !ruby/object:Gem::Version
|
|
6
6
|
- 2
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 2.0.0.
|
9
|
+
- pre3
|
10
|
+
version: 2.0.0.pre3
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- John Barnette
|
@@ -19,7 +19,7 @@ autorequire:
|
|
19
19
|
bindir: bin
|
20
20
|
cert_chain: []
|
21
21
|
|
22
|
-
date: 2010-02
|
22
|
+
date: 2010-03-02 00:00:00 -08:00
|
23
23
|
default_executable:
|
24
24
|
dependencies:
|
25
25
|
- !ruby/object:Gem::Dependency
|