duktape 1.3.0.6 → 2.6.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -27,7 +27,6 @@ static rb_encoding *utf16enc;
27
27
  static VALUE sDefaultFilename;
28
28
  static ID id_complex_object;
29
29
 
30
- static void error_handler(duk_context *, int, const char *);
31
30
  static int ctx_push_hash_element(VALUE key, VALUE val, VALUE extra);
32
31
 
33
32
  static unsigned long
@@ -38,11 +37,15 @@ utf8_to_uv(const char *p, long *lenp);
38
37
 
39
38
  struct state {
40
39
  duk_context *ctx;
40
+ int is_fatal;
41
41
  VALUE complex_object;
42
42
  int was_complex;
43
43
  VALUE blocks;
44
44
  };
45
45
 
46
+ static void error_handler(void *, const char *);
47
+ static void check_fatal(struct state *);
48
+
46
49
  static void ctx_dealloc(void *ptr)
47
50
  {
48
51
  struct state *state = (struct state *)ptr;
@@ -58,7 +61,14 @@ static void ctx_mark(struct state *state)
58
61
 
59
62
  static VALUE ctx_alloc(VALUE klass)
60
63
  {
61
- duk_context *ctx = duk_create_heap(NULL, NULL, NULL, NULL, error_handler);
64
+ struct state *state = malloc(sizeof(struct state));
65
+
66
+ duk_context *ctx = duk_create_heap(NULL, NULL, NULL, state, error_handler);
67
+
68
+ state->ctx = ctx;
69
+ state->is_fatal = 0;
70
+ state->complex_object = oComplexObject;
71
+ state->blocks = rb_ary_new();
62
72
 
63
73
  // Undefine require property
64
74
  duk_push_global_object(ctx);
@@ -66,50 +76,9 @@ static VALUE ctx_alloc(VALUE klass)
66
76
  duk_del_prop(ctx, -2);
67
77
  duk_set_top(ctx, 0);
68
78
 
69
- struct state *state = malloc(sizeof(struct state));
70
- state->ctx = ctx;
71
- state->complex_object = oComplexObject;
72
- state->blocks = rb_ary_new();
73
79
  return Data_Wrap_Struct(klass, ctx_mark, ctx_dealloc, state);
74
80
  }
75
81
 
76
- static VALUE error_code_class(int code) {
77
- switch (code) {
78
- case DUK_ERR_UNIMPLEMENTED_ERROR:
79
- return eUnimplementedError;
80
- case DUK_ERR_UNSUPPORTED_ERROR:
81
- return eUnsupportedError;
82
- case DUK_ERR_INTERNAL_ERROR:
83
- return eInternalError;
84
- case DUK_ERR_ALLOC_ERROR:
85
- return eAllocError;
86
- case DUK_ERR_ASSERTION_ERROR:
87
- return eAssertionError;
88
- case DUK_ERR_API_ERROR:
89
- return eAPIError;
90
- case DUK_ERR_UNCAUGHT_ERROR:
91
- return eUncaughtError;
92
-
93
- case DUK_ERR_ERROR:
94
- return eError;
95
- case DUK_ERR_EVAL_ERROR:
96
- return eEvalError;
97
- case DUK_ERR_RANGE_ERROR:
98
- return eRangeError;
99
- case DUK_ERR_REFERENCE_ERROR:
100
- return eReferenceError;
101
- case DUK_ERR_SYNTAX_ERROR:
102
- return eSyntaxError;
103
- case DUK_ERR_TYPE_ERROR:
104
- return eTypeError;
105
- case DUK_ERR_URI_ERROR:
106
- return eURIError;
107
-
108
- default:
109
- return eInternalError;
110
- }
111
- }
112
-
113
82
  static VALUE error_name_class(const char* name)
114
83
  {
115
84
  if (strcmp(name, "EvalError") == 0) {
@@ -251,13 +220,17 @@ static void ctx_push_ruby_object(struct state *state, VALUE obj)
251
220
 
252
221
  switch (TYPE(obj)) {
253
222
  case T_FIXNUM:
254
- duk_push_int(ctx, NUM2INT(obj));
223
+ duk_push_number(ctx, NUM2LONG(obj));
255
224
  return;
256
225
 
257
226
  case T_FLOAT:
258
227
  duk_push_number(ctx, NUM2DBL(obj));
259
228
  return;
260
229
 
230
+ case T_BIGNUM:
231
+ duk_push_number(ctx, NUM2DBL(obj));
232
+ return;
233
+
261
234
  case T_SYMBOL:
262
235
  #ifdef HAVE_RB_SYM2STR
263
236
  obj = rb_sym2str(obj);
@@ -351,6 +324,7 @@ static VALUE ctx_eval_string(int argc, VALUE *argv, VALUE self)
351
324
  {
352
325
  struct state *state;
353
326
  Data_Get_Struct(self, struct state, state);
327
+ check_fatal(state);
354
328
 
355
329
  VALUE source;
356
330
  VALUE filename;
@@ -395,6 +369,7 @@ static VALUE ctx_exec_string(int argc, VALUE *argv, VALUE self)
395
369
  {
396
370
  struct state *state;
397
371
  Data_Get_Struct(self, struct state, state);
372
+ check_fatal(state);
398
373
 
399
374
  VALUE source;
400
375
  VALUE filename;
@@ -488,6 +463,7 @@ static VALUE ctx_get_prop(VALUE self, VALUE prop)
488
463
  {
489
464
  struct state *state;
490
465
  Data_Get_Struct(self, struct state, state);
466
+ check_fatal(state);
491
467
 
492
468
  ctx_get_nested_prop(state, prop);
493
469
 
@@ -513,10 +489,10 @@ static VALUE ctx_call_prop(int argc, VALUE* argv, VALUE self)
513
489
  {
514
490
  struct state *state;
515
491
  Data_Get_Struct(self, struct state, state);
492
+ check_fatal(state);
516
493
 
517
494
  VALUE prop;
518
- VALUE *prop_args;
519
- rb_scan_args(argc, argv, "1*", &prop, &prop_args);
495
+ rb_scan_args(argc, argv, "1*", &prop, NULL);
520
496
 
521
497
  ctx_get_nested_prop(state, prop);
522
498
 
@@ -587,6 +563,8 @@ static VALUE ctx_define_function(VALUE self, VALUE prop)
587
563
 
588
564
  // get the context
589
565
  Data_Get_Struct(self, struct state, state);
566
+ check_fatal(state);
567
+
590
568
  ctx = state->ctx;
591
569
 
592
570
  // the c function is available in the global scope
@@ -628,9 +606,37 @@ static VALUE ctx_is_valid(VALUE self)
628
606
  }
629
607
  }
630
608
 
631
- static void error_handler(duk_context *ctx, int code, const char *msg)
609
+ /*
610
+ * :nodoc:
611
+ *
612
+ * Invokes duk_fatal(). Only used for testing.
613
+ */
614
+ static VALUE ctx_invoke_fatal(VALUE self)
632
615
  {
633
- clean_raise(ctx, error_code_class(code), "%s", msg);
616
+ struct state *state;
617
+ Data_Get_Struct(self, struct state, state);
618
+
619
+ duk_fatal(state->ctx, "induced fatal error");
620
+
621
+ return Qnil;
622
+ }
623
+
624
+ static void error_handler(void *udata, const char *msg)
625
+ {
626
+ struct state *state = (struct state *)udata;
627
+
628
+ if (msg == NULL) {
629
+ msg = "fatal error";
630
+ }
631
+ state->is_fatal = 1;
632
+ rb_raise(eInternalError, "%s", msg);
633
+ }
634
+
635
+ static void check_fatal(struct state *state)
636
+ {
637
+ if (state->is_fatal) {
638
+ rb_raise(eInternalError, "fatal error");
639
+ }
634
640
  }
635
641
 
636
642
  VALUE complex_object_instance(VALUE self)
@@ -718,6 +724,7 @@ void Init_duktape_ext()
718
724
  rb_define_method(cContext, "call_prop", ctx_call_prop, -1);
719
725
  rb_define_method(cContext, "define_function", ctx_define_function, 1);
720
726
  rb_define_method(cContext, "_valid?", ctx_is_valid, 0);
727
+ rb_define_method(cContext, "_invoke_fatal", ctx_invoke_fatal, 0);
721
728
 
722
729
  oComplexObject = rb_obj_alloc(cComplexObject);
723
730
  rb_define_singleton_method(cComplexObject, "instance", complex_object_instance, 0);
@@ -1,3 +1,3 @@
1
1
  module Duktape
2
- VERSION = "1.3.0.6"
2
+ VERSION = "2.6.0.0"
3
3
  end
metadata CHANGED
@@ -1,16 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: duktape
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0.6
4
+ version: 2.6.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Magnus Holm
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-03-27 00:00:00.000000000 Z
11
+ date: 2021-01-31 00:00:00.000000000 Z
12
12
  dependencies: []
13
- description:
13
+ description:
14
14
  email: judofyr@gmail.com
15
15
  executables: []
16
16
  extensions:
@@ -30,7 +30,7 @@ homepage: https://github.com/judofyr/duktape.rb
30
30
  licenses:
31
31
  - MIT
32
32
  metadata: {}
33
- post_install_message:
33
+ post_install_message:
34
34
  rdoc_options: []
35
35
  require_paths:
36
36
  - lib
@@ -45,9 +45,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
45
45
  - !ruby/object:Gem::Version
46
46
  version: '0'
47
47
  requirements: []
48
- rubyforge_project:
49
- rubygems_version: 2.2.2
50
- signing_key:
48
+ rubygems_version: 3.0.3
49
+ signing_key:
51
50
  specification_version: 4
52
51
  summary: Bindings to the Duktape JavaScript interpreter
53
52
  test_files: []