debase-ruby_core_source 3.2.2 → 3.3.0

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.
Files changed (126) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +10 -0
  3. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/addr2line.h +3 -1
  4. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/ccan/list/list.h +4 -2
  5. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/dln.h +1 -0
  6. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/eval_intern.h +4 -2
  7. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/insns.inc +2 -0
  8. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/insns_info.inc +280 -198
  9. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/internal/array.h +8 -1
  10. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/internal/bits.h +6 -6
  11. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/internal/class.h +53 -3
  12. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/internal/cmdlineopt.h +2 -0
  13. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/internal/cont.h +3 -0
  14. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/internal/encoding.h +3 -0
  15. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/internal/error.h +3 -0
  16. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/internal/gc.h +3 -0
  17. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/internal/hash.h +1 -0
  18. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/internal/imemo.h +0 -1
  19. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/internal/object.h +1 -0
  20. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/internal/parse.h +7 -32
  21. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/internal/random.h +1 -0
  22. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/internal/string.h +0 -1
  23. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/internal/symbol.h +3 -0
  24. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/internal/thread.h +4 -0
  25. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/internal/transcode.h +3 -0
  26. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/internal/variable.h +5 -4
  27. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/internal/vm.h +9 -2
  28. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/iseq.h +5 -1
  29. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/method.h +7 -7
  30. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/node.h +22 -19
  31. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/node_name.inc +4 -2
  32. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/optunifs.inc +1 -1
  33. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/parse.h +16 -5
  34. data/lib/debase/ruby_core_source/ruby-3.3.0-p0/parser_node.h +32 -0
  35. data/lib/debase/ruby_core_source/ruby-3.3.0-p0/prism_compile.h +29 -0
  36. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/ractor_core.h +7 -1
  37. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/regint.h +8 -0
  38. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/regparse.h +2 -1
  39. data/lib/debase/ruby_core_source/ruby-3.3.0-p0/revision.h +5 -0
  40. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/rjit.h +6 -8
  41. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/rjit_c.h +0 -1
  42. data/lib/debase/ruby_core_source/ruby-3.3.0-p0/rubyparser.h +1403 -0
  43. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/shape.h +32 -32
  44. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/symbol.h +1 -2
  45. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/thread_none.h +1 -0
  46. data/lib/debase/ruby_core_source/ruby-3.3.0-p0/thread_pthread.h +166 -0
  47. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/thread_win32.h +1 -1
  48. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/variable.h +11 -2
  49. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/version.h +8 -4
  50. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/vm.inc +225 -185
  51. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/vm_callinfo.h +12 -1
  52. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/vm_core.h +128 -16
  53. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/vm_insnhelper.h +4 -14
  54. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/vmtc.inc +2 -0
  55. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/yjit.h +10 -8
  56. data/lib/debase/ruby_core_source/version.rb +1 -1
  57. metadata +121 -120
  58. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/parser_node.h +0 -133
  59. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/revision.h +0 -5
  60. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/rubyparser.h +0 -628
  61. data/lib/debase/ruby_core_source/ruby-3.3.0-preview2/thread_pthread.h +0 -126
  62. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/builtin.h +0 -0
  63. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/ccan/build_assert/build_assert.h +0 -0
  64. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/ccan/check_type/check_type.h +0 -0
  65. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/ccan/container_of/container_of.h +0 -0
  66. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/ccan/str/str.h +0 -0
  67. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/constant.h +0 -0
  68. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/darray.h +0 -0
  69. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/debug_counter.h +0 -0
  70. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/encindex.h +0 -0
  71. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/hrtime.h +0 -0
  72. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/id.h +0 -0
  73. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/id_table.h +0 -0
  74. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/internal/basic_operators.h +0 -0
  75. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/internal/bignum.h +0 -0
  76. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/internal/compar.h +0 -0
  77. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/internal/compile.h +0 -0
  78. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/internal/compilers.h +0 -0
  79. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/internal/complex.h +0 -0
  80. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/internal/dir.h +0 -0
  81. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/internal/enc.h +0 -0
  82. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/internal/enum.h +0 -0
  83. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/internal/enumerator.h +0 -0
  84. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/internal/eval.h +0 -0
  85. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/internal/file.h +0 -0
  86. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/internal/fixnum.h +0 -0
  87. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/internal/inits.h +0 -0
  88. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/internal/io.h +0 -0
  89. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/internal/load.h +0 -0
  90. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/internal/loadpath.h +0 -0
  91. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/internal/math.h +0 -0
  92. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/internal/missing.h +0 -0
  93. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/internal/numeric.h +0 -0
  94. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/internal/proc.h +0 -0
  95. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/internal/process.h +0 -0
  96. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/internal/ractor.h +0 -0
  97. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/internal/range.h +0 -0
  98. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/internal/rational.h +0 -0
  99. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/internal/re.h +0 -0
  100. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/internal/ruby_parser.h +2 -2
  101. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/internal/sanitizers.h +0 -0
  102. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/internal/serial.h +0 -0
  103. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/internal/signal.h +0 -0
  104. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/internal/static_assert.h +0 -0
  105. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/internal/struct.h +0 -0
  106. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/internal/time.h +0 -0
  107. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/internal/util.h +0 -0
  108. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/internal/warnings.h +0 -0
  109. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/internal.h +0 -0
  110. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/known_errors.inc +0 -0
  111. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/optinsn.inc +0 -0
  112. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/parser_bits.h +0 -0
  113. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/parser_st.h +0 -0
  114. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/parser_value.h +0 -0
  115. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/probes_helper.h +0 -0
  116. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/regenc.h +0 -0
  117. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/ruby_assert.h +0 -0
  118. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/ruby_atomic.h +0 -0
  119. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/siphash.h +0 -0
  120. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/timev.h +0 -0
  121. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/transcode_data.h +0 -0
  122. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/vm_call_iseq_optimized.inc +0 -0
  123. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/vm_debug.h +0 -0
  124. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/vm_exec.h +0 -0
  125. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/vm_opts.h +0 -0
  126. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview2 → ruby-3.3.0-p0}/vm_sync.h +0 -0
@@ -43,6 +43,7 @@ enum vm_call_flag_bits {
43
43
 
44
44
  struct rb_callinfo_kwarg {
45
45
  int keyword_len;
46
+ int references;
46
47
  VALUE keywords[];
47
48
  };
48
49
 
@@ -199,6 +200,9 @@ vm_ci_dump(const struct rb_callinfo *ci)
199
200
  static inline const struct rb_callinfo *
200
201
  vm_ci_new_(ID mid, unsigned int flag, unsigned int argc, const struct rb_callinfo_kwarg *kwarg, const char *file, int line)
201
202
  {
203
+ if (kwarg) {
204
+ ((struct rb_callinfo_kwarg *)kwarg)->references++;
205
+ }
202
206
  if (USE_EMBED_CI && VM_CI_EMBEDDABLE_P(mid, flag, argc, kwarg)) {
203
207
  RB_DEBUG_COUNTER_INC(ci_packed);
204
208
  return vm_ci_new_id(mid, flag, argc, kwarg);
@@ -296,6 +300,7 @@ struct rb_callcache {
296
300
  #define VM_CALLCACHE_UNMARKABLE FL_FREEZE
297
301
  #define VM_CALLCACHE_ON_STACK FL_EXIVAR
298
302
 
303
+ /* VM_CALLCACHE_IVAR used for IVAR/ATTRSET/STRUCT_AREF/STRUCT_ASET methods */
299
304
  #define VM_CALLCACHE_IVAR IMEMO_FL_USER0
300
305
  #define VM_CALLCACHE_BF IMEMO_FL_USER1
301
306
  #define VM_CALLCACHE_SUPER IMEMO_FL_USER2
@@ -483,6 +488,12 @@ vm_cc_call_set(const struct rb_callcache *cc, vm_call_handler call)
483
488
  *(vm_call_handler *)&cc->call_ = call;
484
489
  }
485
490
 
491
+ static inline void
492
+ set_vm_cc_ivar(const struct rb_callcache *cc)
493
+ {
494
+ *(VALUE *)&cc->flags |= VM_CALLCACHE_IVAR;
495
+ }
496
+
486
497
  static inline void
487
498
  vm_cc_attr_index_set(const struct rb_callcache *cc, attr_index_t index, shape_id_t dest_shape_id)
488
499
  {
@@ -494,7 +505,7 @@ vm_cc_attr_index_set(const struct rb_callcache *cc, attr_index_t index, shape_id
494
505
  VM_ASSERT(IMEMO_TYPE_P(cc, imemo_callcache));
495
506
  VM_ASSERT(cc != vm_cc_empty());
496
507
  *attr_value = (attr_index_t)(index + 1) | ((uintptr_t)(dest_shape_id) << SHAPE_FLAG_SHIFT);
497
- *(VALUE *)&cc->flags |= VM_CALLCACHE_IVAR;
508
+ set_vm_cc_ivar(cc);
498
509
  }
499
510
 
500
511
  static inline bool
@@ -524,6 +524,8 @@ struct rb_iseq_constant_body {
524
524
  #if USE_YJIT
525
525
  // YJIT stores some data on each iseq.
526
526
  void *yjit_payload;
527
+ // Used to estimate how frequently this ISEQ gets called
528
+ uint64_t yjit_calls_at_interv;
527
529
  #endif
528
530
  };
529
531
 
@@ -634,15 +636,51 @@ typedef struct rb_vm_struct {
634
636
  struct rb_ractor_struct *lock_owner;
635
637
  unsigned int lock_rec;
636
638
 
637
- // barrier
638
- bool barrier_waiting;
639
- unsigned int barrier_cnt;
640
- rb_nativethread_cond_t barrier_cond;
641
-
642
639
  // join at exit
643
640
  rb_nativethread_cond_t terminate_cond;
644
641
  bool terminate_waiting;
642
+
643
+ #ifndef RUBY_THREAD_PTHREAD_H
644
+ bool barrier_waiting;
645
+ unsigned int barrier_cnt;
646
+ rb_nativethread_cond_t barrier_cond;
647
+ #endif
645
648
  } sync;
649
+
650
+ // ractor scheduling
651
+ struct {
652
+ rb_nativethread_lock_t lock;
653
+ struct rb_ractor_struct *lock_owner;
654
+ bool locked;
655
+
656
+ rb_nativethread_cond_t cond; // GRQ
657
+ unsigned int snt_cnt; // count of shared NTs
658
+ unsigned int dnt_cnt; // count of dedicated NTs
659
+
660
+ unsigned int running_cnt;
661
+
662
+ unsigned int max_cpu;
663
+ struct ccan_list_head grq; // // Global Ready Queue
664
+ unsigned int grq_cnt;
665
+
666
+ // running threads
667
+ struct ccan_list_head running_threads;
668
+
669
+ // threads which switch context by timeslice
670
+ struct ccan_list_head timeslice_threads;
671
+
672
+ struct ccan_list_head zombie_threads;
673
+
674
+ // true if timeslice timer is not enable
675
+ bool timeslice_wait_inf;
676
+
677
+ // barrier
678
+ rb_nativethread_cond_t barrier_complete_cond;
679
+ rb_nativethread_cond_t barrier_release_cond;
680
+ bool barrier_waiting;
681
+ unsigned int barrier_waiting_cnt;
682
+ unsigned int barrier_serial;
683
+ } sched;
646
684
  } ractor;
647
685
 
648
686
  #ifdef USE_SIGALTSTACK
@@ -688,9 +726,8 @@ typedef struct rb_vm_struct {
688
726
  /* relation table of ensure - rollback for callcc */
689
727
  struct st_table *ensure_rollback_table;
690
728
 
691
- /* postponed_job (async-signal-safe, NOT thread-safe) */
692
- struct rb_postponed_job_struct *postponed_job_buffer;
693
- rb_atomic_t postponed_job_index;
729
+ /* postponed_job (async-signal-safe, and thread-safe) */
730
+ struct rb_postponed_job_queue *postponed_job_queue;
694
731
 
695
732
  int src_encoding_index;
696
733
 
@@ -846,6 +883,61 @@ typedef RUBY_JMP_BUF rb_jmpbuf_t;
846
883
  typedef void *rb_jmpbuf_t[5];
847
884
  #endif
848
885
 
886
+ /*
887
+ `rb_vm_tag_jmpbuf_t` type represents a buffer used to
888
+ long jump to a C frame associated with `rb_vm_tag`.
889
+
890
+ Use-site of `rb_vm_tag_jmpbuf_t` is responsible for calling the
891
+ following functions:
892
+ - `rb_vm_tag_jmpbuf_init` once `rb_vm_tag_jmpbuf_t` is allocated.
893
+ - `rb_vm_tag_jmpbuf_deinit` once `rb_vm_tag_jmpbuf_t` is no longer necessary.
894
+
895
+ `RB_VM_TAG_JMPBUF_GET` transforms a `rb_vm_tag_jmpbuf_t` into a
896
+ `rb_jmpbuf_t` to be passed to `rb_setjmp/rb_longjmp`.
897
+ */
898
+ #if defined(__wasm__) && !defined(__EMSCRIPTEN__)
899
+ /*
900
+ WebAssembly target with Asyncify-based SJLJ needs
901
+ to capture the execution context by unwind/rewind-ing
902
+ call frames into a jump buffer. The buffer space tends
903
+ to be considerably large unlike other architectures'
904
+ register-based buffers.
905
+ Therefore, we allocates the buffer on the heap on such
906
+ environments.
907
+ */
908
+ typedef rb_jmpbuf_t *rb_vm_tag_jmpbuf_t;
909
+
910
+ #define RB_VM_TAG_JMPBUF_GET(buf) (*buf)
911
+
912
+ static inline void
913
+ rb_vm_tag_jmpbuf_init(rb_vm_tag_jmpbuf_t *jmpbuf)
914
+ {
915
+ *jmpbuf = ruby_xmalloc(sizeof(rb_jmpbuf_t));
916
+ }
917
+
918
+ static inline void
919
+ rb_vm_tag_jmpbuf_deinit(const rb_vm_tag_jmpbuf_t *jmpbuf)
920
+ {
921
+ ruby_xfree(*jmpbuf);
922
+ }
923
+ #else
924
+ typedef rb_jmpbuf_t rb_vm_tag_jmpbuf_t;
925
+
926
+ #define RB_VM_TAG_JMPBUF_GET(buf) (buf)
927
+
928
+ static inline void
929
+ rb_vm_tag_jmpbuf_init(rb_vm_tag_jmpbuf_t *jmpbuf)
930
+ {
931
+ // no-op
932
+ }
933
+
934
+ static inline void
935
+ rb_vm_tag_jmpbuf_deinit(const rb_vm_tag_jmpbuf_t *jmpbuf)
936
+ {
937
+ // no-op
938
+ }
939
+ #endif
940
+
849
941
  /*
850
942
  the members which are written in EC_PUSH_TAG() should be placed at
851
943
  the beginning and the end, so that entire region is accessible.
@@ -853,7 +945,7 @@ typedef void *rb_jmpbuf_t[5];
853
945
  struct rb_vm_tag {
854
946
  VALUE tag;
855
947
  VALUE retval;
856
- rb_jmpbuf_t buf;
948
+ rb_vm_tag_jmpbuf_t buf;
857
949
  struct rb_vm_tag *prev;
858
950
  enum ruby_tag_type state;
859
951
  unsigned int lock_rec;
@@ -861,7 +953,7 @@ struct rb_vm_tag {
861
953
 
862
954
  STATIC_ASSERT(rb_vm_tag_buf_offset, offsetof(struct rb_vm_tag, buf) > 0);
863
955
  STATIC_ASSERT(rb_vm_tag_buf_end,
864
- offsetof(struct rb_vm_tag, buf) + sizeof(rb_jmpbuf_t) <
956
+ offsetof(struct rb_vm_tag, buf) + sizeof(rb_vm_tag_jmpbuf_t) <
865
957
  sizeof(struct rb_vm_tag));
866
958
 
867
959
  struct rb_unblock_callback {
@@ -1059,6 +1151,7 @@ typedef struct rb_thread_struct {
1059
1151
 
1060
1152
  /* misc */
1061
1153
  VALUE name;
1154
+ void **specific_storage;
1062
1155
 
1063
1156
  struct rb_ext_config ext_config;
1064
1157
  } rb_thread_t;
@@ -1678,13 +1771,13 @@ VALUE rb_proc_alloc(VALUE klass);
1678
1771
  VALUE rb_proc_dup(VALUE self);
1679
1772
 
1680
1773
  /* for debug */
1681
- extern void rb_vmdebug_stack_dump_raw(const rb_execution_context_t *ec, const rb_control_frame_t *cfp);
1682
- extern void rb_vmdebug_debug_print_pre(const rb_execution_context_t *ec, const rb_control_frame_t *cfp, const VALUE *_pc);
1683
- extern void rb_vmdebug_debug_print_post(const rb_execution_context_t *ec, const rb_control_frame_t *cfp);
1774
+ extern bool rb_vmdebug_stack_dump_raw(const rb_execution_context_t *ec, const rb_control_frame_t *cfp, FILE *);
1775
+ extern bool rb_vmdebug_debug_print_pre(const rb_execution_context_t *ec, const rb_control_frame_t *cfp, const VALUE *_pc, FILE *);
1776
+ extern bool rb_vmdebug_debug_print_post(const rb_execution_context_t *ec, const rb_control_frame_t *cfp, FILE *);
1684
1777
 
1685
- #define SDR() rb_vmdebug_stack_dump_raw(GET_EC(), GET_EC()->cfp)
1686
- #define SDR2(cfp) rb_vmdebug_stack_dump_raw(GET_EC(), (cfp))
1687
- void rb_vm_bugreport(const void *);
1778
+ #define SDR() rb_vmdebug_stack_dump_raw(GET_EC(), GET_EC()->cfp, stderr)
1779
+ #define SDR2(cfp) rb_vmdebug_stack_dump_raw(GET_EC(), (cfp), stderr)
1780
+ bool rb_vm_bugreport(const void *, FILE *);
1688
1781
  typedef void (*ruby_sighandler_t)(int);
1689
1782
  RBIMPL_ATTR_FORMAT(RBIMPL_PRINTF_FORMAT, 4, 5)
1690
1783
  NORETURN(void rb_bug_for_fatal_signal(ruby_sighandler_t default_sighandler, int sig, const void *, const char *fmt, ...));
@@ -1739,6 +1832,7 @@ rb_vm_living_threads_init(rb_vm_t *vm)
1739
1832
  ccan_list_head_init(&vm->waiting_fds);
1740
1833
  ccan_list_head_init(&vm->workqueue);
1741
1834
  ccan_list_head_init(&vm->ractor.set);
1835
+ ccan_list_head_init(&vm->ractor.sched.zombie_threads);
1742
1836
  }
1743
1837
 
1744
1838
  typedef int rb_backtrace_iter_func(void *, VALUE, int, VALUE);
@@ -1839,6 +1933,20 @@ rb_current_execution_context(bool expect_ec)
1839
1933
  #else
1840
1934
  rb_execution_context_t *ec = ruby_current_ec;
1841
1935
  #endif
1936
+
1937
+ /* On the shared objects, `__tls_get_addr()` is used to access the TLS
1938
+ * and the address of the `ruby_current_ec` can be stored on a function
1939
+ * frame. However, this address can be mis-used after native thread
1940
+ * migration of a coroutine.
1941
+ * 1) Get `ptr =&ruby_current_ec` op NT1 and store it on the frame.
1942
+ * 2) Context switch and resume it on the NT2.
1943
+ * 3) `ptr` is used on NT2 but it accesses to the TLS on NT1.
1944
+ * This assertion checks such misusage.
1945
+ *
1946
+ * To avoid accidents, `GET_EC()` should be called once on the frame.
1947
+ * Note that inlining can produce the problem.
1948
+ */
1949
+ VM_ASSERT(ec == rb_current_ec_noinline());
1842
1950
  #else
1843
1951
  rb_execution_context_t *ec = native_tls_get(ruby_current_ec_key);
1844
1952
  #endif
@@ -2062,6 +2170,10 @@ rb_exec_event_hook_script_compiled(rb_execution_context_t *ec, const rb_iseq_t *
2062
2170
  }
2063
2171
 
2064
2172
  void rb_vm_trap_exit(rb_vm_t *vm);
2173
+ void rb_vm_postponed_job_atfork(void); /* vm_trace.c */
2174
+ void rb_vm_postponed_job_free(void); /* vm_trace.c */
2175
+ size_t rb_vm_memsize_postponed_job_queue(void); /* vm_trace.c */
2176
+ void rb_vm_postponed_job_queue_init(rb_vm_t *vm); /* vm_trace.c */
2065
2177
 
2066
2178
  RUBY_SYMBOL_EXPORT_BEGIN
2067
2179
 
@@ -16,23 +16,13 @@ RUBY_EXTERN rb_serial_t ruby_vm_constant_cache_invalidations;
16
16
  RUBY_EXTERN rb_serial_t ruby_vm_constant_cache_misses;
17
17
  RUBY_EXTERN rb_serial_t ruby_vm_global_cvar_state;
18
18
 
19
- #ifndef RJIT_STATS
20
- # define RJIT_STATS RUBY_DEBUG
21
- #endif
22
-
23
- #if USE_YJIT // We want vm_insns_count on any YJIT-enabled build
19
+ #if USE_YJIT || USE_RJIT // We want vm_insns_count on any JIT-enabled build.
24
20
  // Increment vm_insns_count for --yjit-stats. We increment this even when
25
21
  // --yjit or --yjit-stats is not used because branching to skip it is slower.
26
22
  // We also don't use ATOMIC_INC for performance, allowing inaccuracy on Ractors.
27
- #define YJIT_COLLECT_USAGE_INSN(insn) rb_vm_insns_count++
28
- #else
29
- #define YJIT_COLLECT_USAGE_INSN(insn) // none
30
- #endif
31
-
32
- #if RJIT_STATS
33
- #define RJIT_COLLECT_USAGE_INSN(insn) rb_rjit_collect_vm_usage_insn(insn)
23
+ #define JIT_COLLECT_USAGE_INSN(insn) rb_vm_insns_count++
34
24
  #else
35
- #define RJIT_COLLECT_USAGE_INSN(insn) // none
25
+ #define JIT_COLLECT_USAGE_INSN(insn) // none
36
26
  #endif
37
27
 
38
28
  #if VM_COLLECT_USAGE_DETAILS
@@ -40,7 +30,7 @@ RUBY_EXTERN rb_serial_t ruby_vm_global_cvar_state;
40
30
  #define COLLECT_USAGE_OPERAND(insn, n, op) vm_collect_usage_operand((insn), (n), ((VALUE)(op)))
41
31
  #define COLLECT_USAGE_REGISTER(reg, s) vm_collect_usage_register((reg), (s))
42
32
  #else
43
- #define COLLECT_USAGE_INSN(insn) YJIT_COLLECT_USAGE_INSN(insn); RJIT_COLLECT_USAGE_INSN(insn)
33
+ #define COLLECT_USAGE_INSN(insn) JIT_COLLECT_USAGE_INSN(insn)
44
34
  #define COLLECT_USAGE_OPERAND(insn, n, op) // none
45
35
  #define COLLECT_USAGE_REGISTER(reg, s) // none
46
36
  #endif
@@ -69,6 +69,7 @@ static const void *const insns_address_table[] = {
69
69
  LABEL_PTR(expandarray),
70
70
  LABEL_PTR(concatarray),
71
71
  LABEL_PTR(splatarray),
72
+ LABEL_PTR(splatkw),
72
73
  LABEL_PTR(newhash),
73
74
  LABEL_PTR(newrange),
74
75
  LABEL_PTR(pop),
@@ -170,6 +171,7 @@ static const void *const insns_address_table[] = {
170
171
  LABEL_PTR(trace_expandarray),
171
172
  LABEL_PTR(trace_concatarray),
172
173
  LABEL_PTR(trace_splatarray),
174
+ LABEL_PTR(trace_splatkw),
173
175
  LABEL_PTR(trace_newhash),
174
176
  LABEL_PTR(trace_newrange),
175
177
  LABEL_PTR(trace_pop),
@@ -25,15 +25,17 @@
25
25
  #endif
26
26
 
27
27
  // Expose these as declarations since we are building YJIT.
28
- bool rb_yjit_enabled_p(void);
29
- bool rb_yjit_compile_new_iseqs(void);
30
- bool rb_yjit_threshold_hit(const rb_iseq_t *const iseq, unsigned long total_calls);
28
+ extern uint64_t rb_yjit_call_threshold;
29
+ extern uint64_t rb_yjit_cold_threshold;
30
+ extern uint64_t rb_yjit_live_iseq_count;
31
+ extern bool rb_yjit_enabled_p;
32
+ void rb_yjit_incr_counter(const char *counter_name);
31
33
  void rb_yjit_invalidate_all_method_lookup_assumptions(void);
32
34
  void rb_yjit_cme_invalidate(rb_callable_method_entry_t *cme);
33
35
  void rb_yjit_collect_binding_alloc(void);
34
36
  void rb_yjit_collect_binding_set(void);
35
37
  void rb_yjit_compile_iseq(const rb_iseq_t *iseq, rb_execution_context_t *ec, bool jit_exception);
36
- void rb_yjit_init(void);
38
+ void rb_yjit_init(bool yjit_enabled);
37
39
  void rb_yjit_bop_redefined(int redefined_flag, enum ruby_basic_operators bop);
38
40
  void rb_yjit_constant_state_changed(ID id);
39
41
  void rb_yjit_iseq_mark(void *payload);
@@ -42,20 +44,20 @@ void rb_yjit_iseq_free(void *payload);
42
44
  void rb_yjit_before_ractor_spawn(void);
43
45
  void rb_yjit_constant_ic_update(const rb_iseq_t *const iseq, IC ic, unsigned insn_idx);
44
46
  void rb_yjit_tracing_invalidate_all(void);
47
+ void rb_yjit_show_usage(int help, int highlight, unsigned int width, int columns);
45
48
 
46
49
  #else
47
50
  // !USE_YJIT
48
51
  // In these builds, YJIT could never be turned on. Provide dummy implementations.
49
52
 
50
- static inline bool rb_yjit_enabled_p(void) { return false; }
51
- static inline bool rb_yjit_compile_new_iseqs(void) { return false; }
52
- static inline bool rb_yjit_threshold_hit(const rb_iseq_t *const iseq, unsigned long total_calls) { return false; }
53
+ #define rb_yjit_enabled_p false
54
+ static inline void rb_yjit_incr_counter(const char *counter_name) {}
53
55
  static inline void rb_yjit_invalidate_all_method_lookup_assumptions(void) {}
54
56
  static inline void rb_yjit_cme_invalidate(rb_callable_method_entry_t *cme) {}
55
57
  static inline void rb_yjit_collect_binding_alloc(void) {}
56
58
  static inline void rb_yjit_collect_binding_set(void) {}
57
59
  static inline void rb_yjit_compile_iseq(const rb_iseq_t *iseq, rb_execution_context_t *ec, bool jit_exception) {}
58
- static inline void rb_yjit_init(void) {}
60
+ static inline void rb_yjit_init(bool yjit_enabled) {}
59
61
  static inline void rb_yjit_bop_redefined(int redefined_flag, enum ruby_basic_operators bop) {}
60
62
  static inline void rb_yjit_constant_state_changed(ID id) {}
61
63
  static inline void rb_yjit_iseq_mark(void *payload) {}
@@ -1,5 +1,5 @@
1
1
  module Debase
2
2
  module RubyCoreSource
3
- VERSION = '3.2.2'
3
+ VERSION = '3.3.0'
4
4
  end
5
5
  end