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 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