h8 0.5.0 → 0.5.1
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.
- checksums.yaml +4 -4
- data/ext/h8/h8.cpp +11 -0
- data/ext/h8/h8.h +1 -1
- data/ext/h8/ruby_gate.cpp +18 -12
- data/lib/h8/context.rb +30 -3
- data/lib/h8/errors.rb +4 -0
- data/lib/h8/version.rb +1 -1
- data/lib/scripts/globals.coffee +6 -0
- data/spec/ruby_gate_spec.rb +37 -6
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1fbec1007c8688390ed4e78bcb8fb828d6f1335a
|
4
|
+
data.tar.gz: 1fc40b29112ab15dc624aea10bb21e7e136d353c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 886728e46a82de26977f1c3d517b1ec2d719ed9828cc47782eb6f13fe520928af145e409aab5de52b5ea780f9301f5983a4fe85827f2f6dd9b5155e155c283a5
|
7
|
+
data.tar.gz: 848d3efdb932098ac8d756e9bee535f222c6af8a66e4dcb17203024c9d70152767692535c8eb12067b48c51652de9b2a4bf8c54d949a5d8394e41aa628c7296a
|
data/ext/h8/h8.cpp
CHANGED
@@ -56,11 +56,18 @@ void h8::JsTimeoutError::raise() const {
|
|
56
56
|
rb_raise(js_timeout_exception, "timeout expired");
|
57
57
|
}
|
58
58
|
|
59
|
+
//static void prototype_cb(Local<String> prop,const PropertyCallbackInfo<Value>& info) {
|
60
|
+
// puts("PROTOCB!");
|
61
|
+
// info.GetReturnValue().Set(info.This()->GetPrototype());
|
62
|
+
//}
|
63
|
+
|
59
64
|
void h8::H8::SetupGateTemplate(const Local<ObjectTemplate>& templ) {
|
60
65
|
templ->SetInternalFieldCount(2);
|
61
66
|
templ->SetCallAsFunctionHandler(&RubyGate::ObjectCallback);
|
62
67
|
templ->SetNamedPropertyHandler(RubyGate::mapGet, RubyGate::mapSet, 0, RubyGate::mapDelete);
|
63
68
|
templ->SetIndexedPropertyHandler(RubyGate::indexGet, RubyGate::indexSet);
|
69
|
+
// templ->SetAccessor(String::NewFromUtf8(isolate, "prototype"),
|
70
|
+
// prototype_cb);
|
64
71
|
}
|
65
72
|
|
66
73
|
h8::H8::H8()
|
@@ -95,6 +102,10 @@ h8::H8::H8()
|
|
95
102
|
persistent_context.Reset(isolate, context);
|
96
103
|
gate_function_template.Reset(isolate,ft);
|
97
104
|
gate_function.Reset(isolate,fn);
|
105
|
+
|
106
|
+
ft->Set(String::NewFromUtf8(isolate, "prototype"),
|
107
|
+
ft->GetFunction());
|
108
|
+
|
98
109
|
}
|
99
110
|
|
100
111
|
|
data/ext/h8/h8.h
CHANGED
@@ -233,7 +233,7 @@ public:
|
|
233
233
|
private:
|
234
234
|
friend VALUE h8::context_alloc(VALUE klass);
|
235
235
|
void invoke(v8::Handle<v8::Script> script, Local<Value>& result);
|
236
|
-
|
236
|
+
void SetupGateTemplate(const Local<ObjectTemplate>& templ);
|
237
237
|
|
238
238
|
Isolate *isolate;
|
239
239
|
VALUE self;
|
data/ext/h8/ruby_gate.cpp
CHANGED
@@ -75,6 +75,12 @@ h8::RubyGate::RubyGate(H8* _context, Handle<Object> instance, VALUE object) :
|
|
75
75
|
|
76
76
|
void h8::RubyGate::mapGet(Local<String> name,
|
77
77
|
const PropertyCallbackInfo<Value> &info) {
|
78
|
+
v8::String::Utf8Value val(name);
|
79
|
+
if( strcmp(*val, "prototype") == 0 ) {
|
80
|
+
info.GetReturnValue().Set(info.This()->GetPrototype());
|
81
|
+
return;
|
82
|
+
}
|
83
|
+
|
78
84
|
Local<Value> loc = info.This()->GetRealNamedPropertyInPrototypeChain(name);
|
79
85
|
if (!loc.IsEmpty())
|
80
86
|
info.GetReturnValue().Set(loc);
|
@@ -220,14 +226,14 @@ void h8::RubyGate::setProperty(Local<String> name, Local<Value> value,
|
|
220
226
|
with_gvl(this, [&] {
|
221
227
|
VALUE rb_args = rb_ary_new2(3);
|
222
228
|
rb_ary_push(rb_args, context->to_ruby(value)); // value
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
+
rb_ary_push(rb_args, ruby_object);// object
|
230
|
+
VALUE method = context->to_ruby(name);
|
231
|
+
method = rb_str_cat2(method, "=");
|
232
|
+
rb_ary_push(rb_args, method);// name=
|
233
|
+
rescued_call(rb_args, secure_call, [&] (VALUE res) {
|
234
|
+
info.GetReturnValue().Set(context->to_js(res));
|
235
|
+
});
|
229
236
|
});
|
230
|
-
});
|
231
237
|
}
|
232
238
|
|
233
239
|
void h8::RubyGate::deleteProperty(Local<String> name,
|
@@ -235,12 +241,12 @@ void h8::RubyGate::deleteProperty(Local<String> name,
|
|
235
241
|
with_gvl(this, [&] {
|
236
242
|
VALUE rb_args = rb_ary_new2(2);
|
237
243
|
rb_ary_push(rb_args, context->to_ruby(name)); // name
|
238
|
-
|
244
|
+
rb_ary_push(rb_args, ruby_object);// object
|
239
245
|
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
246
|
+
rescued_call(rb_args, ruby_delete_handler, [&] (VALUE res) {
|
247
|
+
auto success = Boolean::New(isolate(), res == Qnil ? false : true );
|
248
|
+
info.GetReturnValue().Set(success);
|
249
|
+
});
|
244
250
|
});
|
245
251
|
}
|
246
252
|
|
data/lib/h8/context.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'thread'
|
2
2
|
require 'h8'
|
3
|
+
require 'json'
|
3
4
|
|
4
5
|
class Array
|
5
6
|
def _select_js callable
|
@@ -7,6 +8,26 @@ class Array
|
|
7
8
|
callable.call item
|
8
9
|
}
|
9
10
|
end
|
11
|
+
|
12
|
+
def indexOf item
|
13
|
+
index(item) || -1
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class String
|
18
|
+
def indexOf item
|
19
|
+
index(item) || -1
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
class Object
|
24
|
+
def __to_json
|
25
|
+
if respond_to?(:as_json)
|
26
|
+
as_json
|
27
|
+
else
|
28
|
+
JSON[JSON[self]]
|
29
|
+
end
|
30
|
+
end
|
10
31
|
end
|
11
32
|
|
12
33
|
module H8
|
@@ -19,7 +40,12 @@ module H8
|
|
19
40
|
_set_var '___create_ruby_class', -> (cls, args) {
|
20
41
|
_do_create_ruby_class cls, args
|
21
42
|
}
|
22
|
-
|
43
|
+
|
44
|
+
self[:debug] = -> (*args) {
|
45
|
+
puts args.join(' ')
|
46
|
+
}
|
47
|
+
|
48
|
+
noglobals or execute_script 'globals.coffee'
|
23
49
|
end
|
24
50
|
|
25
51
|
# set variables from keyword arguments to this context
|
@@ -76,6 +102,7 @@ module H8
|
|
76
102
|
# It has very complex logic so the security model update should be done somehow
|
77
103
|
# else.
|
78
104
|
def self.secure_call instance, method, args=nil
|
105
|
+
# p [:sc, instance, method, args]
|
79
106
|
if instance.is_a?(Array)
|
80
107
|
method == 'select' and method = '_select_js'
|
81
108
|
end
|
@@ -177,9 +204,9 @@ module H8
|
|
177
204
|
@@cache = {}
|
178
205
|
|
179
206
|
def execute_script name
|
180
|
-
p [:exs, name]
|
207
|
+
# p [:exs, name]
|
181
208
|
script = @@cache[name] ||= begin
|
182
|
-
p 'cache miss'
|
209
|
+
# p 'cache miss'
|
183
210
|
script = open(File.join(@@base, name), 'r').read
|
184
211
|
name.downcase.end_with?('.coffee') ? H8::Coffee.compile(script) : script
|
185
212
|
end
|
data/lib/h8/errors.rb
CHANGED
data/lib/h8/version.rb
CHANGED
data/lib/scripts/globals.coffee
CHANGED
data/spec/ruby_gate_spec.rb
CHANGED
@@ -368,11 +368,42 @@ describe 'ruby gate' do
|
|
368
368
|
end
|
369
369
|
|
370
370
|
it 'should access ruby and java array functions' do
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
371
|
+
begin
|
372
|
+
cxt = H8::Context.new
|
373
|
+
src = cxt[:h] = [1, 20, 3, 4, 5]
|
374
|
+
cxt.eval("h.reverse()").should == [5, 4, 3, 20, 1]
|
375
|
+
cxt.eval("h.sort()").should == [1, 3, 4, 5, 20]
|
376
|
+
cxt.eval("h.select(function(x){return x >=4;}).sort()").should == [4, 5, 20]
|
377
|
+
cxt.eval("h.indexOf(20)").should == 1
|
378
|
+
cxt.eval("h.indexOf(21)").should == -1
|
379
|
+
rescue H8::NestedError => e
|
380
|
+
puts e.ruby_error.backtrace.join("\n")
|
381
|
+
raise
|
382
|
+
end
|
383
|
+
end
|
384
|
+
|
385
|
+
it 'should access ruby string functions' do
|
386
|
+
begin
|
387
|
+
cxt = H8::Context.new
|
388
|
+
src = cxt[:h] = "Hello!"
|
389
|
+
cxt.eval("h.indexOf('ll')").should == 2
|
390
|
+
cxt.eval("h.indexOf('meow')").should == -1
|
391
|
+
rescue H8::NestedError => e
|
392
|
+
puts e.ruby_error.backtrace.join("\n")
|
393
|
+
raise
|
394
|
+
end
|
395
|
+
end
|
396
|
+
|
397
|
+
it 'should process to_json' do
|
398
|
+
begin
|
399
|
+
cxt = H8::Context.new
|
400
|
+
src = cxt[:h] = { 'hello' => 'world' }
|
401
|
+
cxt.eval("JSON.stringify(h)").should == "{\"hello\":\"world\"}"
|
402
|
+
rescue H8::NestedError => e
|
403
|
+
puts e.ruby_error.backtrace.join("\n")
|
404
|
+
raise
|
405
|
+
end
|
406
|
+
|
376
407
|
end
|
377
408
|
|
378
409
|
it 'should pass varargs' do
|
@@ -458,7 +489,7 @@ describe 'ruby gate' do
|
|
458
489
|
# We call gated ruby object with wrong number of args
|
459
490
|
# which in turn causes attempt to call not callable result:
|
460
491
|
expect(-> { cxt.eval('g1.checkself(12)') }).to raise_error(H8::NestedError) { |e|
|
461
|
-
|
492
|
+
e.ruby_error.should be_instance_of(NoMethodError)
|
462
493
|
}
|
463
494
|
end
|
464
495
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: h8
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- sergeych
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-04-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|