h8 0.5.0 → 0.5.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c3c42fdc46126f4cd9b55893dcf773b531f27dfb
4
- data.tar.gz: 2b6b7b9157cd99488987657a34cbbf3449b504a8
3
+ metadata.gz: 1fbec1007c8688390ed4e78bcb8fb828d6f1335a
4
+ data.tar.gz: 1fc40b29112ab15dc624aea10bb21e7e136d353c
5
5
  SHA512:
6
- metadata.gz: 7e4443044d235df479575c0db14d79060c3318364c8c535920d3ca4f2b074a1100813c56e8121cbf2946d9db293c82bfd0a81d252b28eda823b6563f0eac48a0
7
- data.tar.gz: 5d5fa89d8992e39fd03264b2323f78965c55cfc4dada8d2aa9bb57b3e139807a0077e81af3143c5aec9bc0218617b369d7679bfe5bb087a816c681b95e75fa88
6
+ metadata.gz: 886728e46a82de26977f1c3d517b1ec2d719ed9828cc47782eb6f13fe520928af145e409aab5de52b5ea780f9301f5983a4fe85827f2f6dd9b5155e155c283a5
7
+ data.tar.gz: 848d3efdb932098ac8d756e9bee535f222c6af8a66e4dcb17203024c9d70152767692535c8eb12067b48c51652de9b2a4bf8c54d949a5d8394e41aa628c7296a
@@ -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
 
@@ -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
- static void SetupGateTemplate(const Local<ObjectTemplate>& templ);
236
+ void SetupGateTemplate(const Local<ObjectTemplate>& templ);
237
237
 
238
238
  Isolate *isolate;
239
239
  VALUE self;
@@ -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
- rb_ary_push(rb_args, ruby_object); // object
224
- VALUE method = context->to_ruby(name);
225
- method = rb_str_cat2(method, "=");
226
- rb_ary_push(rb_args, method); // name=
227
- rescued_call(rb_args, secure_call, [&] (VALUE res) {
228
- info.GetReturnValue().Set(context->to_js(res));
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
- rb_ary_push(rb_args, ruby_object); // object
244
+ rb_ary_push(rb_args, ruby_object);// object
239
245
 
240
- rescued_call(rb_args, ruby_delete_handler, [&] (VALUE res) {
241
- auto success = Boolean::New(isolate(), res == Qnil ? false : true );
242
- info.GetReturnValue().Set(success);
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
 
@@ -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
- # noglobals or execute_script 'globals.coffee'
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
@@ -44,6 +44,10 @@ module H8
44
44
  class NestedError < JsError
45
45
  # The uncaught ruby exception
46
46
  attr :ruby_error
47
+
48
+ def to_s
49
+ ruby_error.to_s
50
+ end
47
51
  end
48
52
 
49
53
  # Script execution is timed out (see H8::Context#eval timeout parameter)
@@ -1,3 +1,3 @@
1
1
  module H8
2
- VERSION = "0.5.0"
2
+ VERSION = "0.5.1"
3
3
  end
@@ -3,3 +3,9 @@
3
3
 
4
4
  @globalsIncluded = true
5
5
 
6
+ RubyGate.prototype.toJSON = ->
7
+ src = @__to_json
8
+ res = {}
9
+ for key in src.keys()
10
+ res[key] = src[key]
11
+ res
@@ -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
- cxt = H8::Context.new
372
- src = cxt[:h] = [1,20,3,4,5]
373
- cxt.eval("h.reverse()").should == [5, 4, 3, 20, 1]
374
- cxt.eval("h.sort()").should == [1,3,4,5,20]
375
- cxt.eval("h.select(function(x){return x >=4;}).sort()").should == [4, 5, 20]
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
- e.ruby_error.should be_instance_of(NoMethodError)
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.0
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-03-21 00:00:00.000000000 Z
11
+ date: 2015-04-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler