Skip to content

Commit 4ee0628

Browse files
committed
Some fixes for global variables
1 parent c9c4734 commit 4ee0628

4 files changed

Lines changed: 32 additions & 8 deletions

File tree

depend

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4199,7 +4199,9 @@ encoding.$(OBJEXT): $(top_srcdir)/internal/gc.h
41994199
encoding.$(OBJEXT): $(top_srcdir)/internal/imemo.h
42004200
encoding.$(OBJEXT): $(top_srcdir)/internal/inits.h
42014201
encoding.$(OBJEXT): $(top_srcdir)/internal/load.h
4202+
encoding.$(OBJEXT): $(top_srcdir)/internal/namespace.h
42024203
encoding.$(OBJEXT): $(top_srcdir)/internal/object.h
4204+
encoding.$(OBJEXT): $(top_srcdir)/internal/sanitizers.h
42034205
encoding.$(OBJEXT): $(top_srcdir)/internal/serial.h
42044206
encoding.$(OBJEXT): $(top_srcdir)/internal/set_table.h
42054207
encoding.$(OBJEXT): $(top_srcdir)/internal/static_assert.h
@@ -13362,6 +13364,7 @@ re.$(OBJEXT): {$(VPATH)}backward/2/stdalign.h
1336213364
re.$(OBJEXT): {$(VPATH)}backward/2/stdarg.h
1336313365
re.$(OBJEXT): {$(VPATH)}config.h
1336413366
re.$(OBJEXT): {$(VPATH)}constant.h
13367+
re.$(OBJEXT): {$(VPATH)}debug_counter.h
1336513368
re.$(OBJEXT): {$(VPATH)}defines.h
1336613369
re.$(OBJEXT): {$(VPATH)}encindex.h
1336713370
re.$(OBJEXT): {$(VPATH)}encoding.h
@@ -13545,6 +13548,7 @@ re.$(OBJEXT): {$(VPATH)}util.h
1354513548
re.$(OBJEXT): {$(VPATH)}vm_core.h
1354613549
re.$(OBJEXT): {$(VPATH)}vm_debug.h
1354713550
re.$(OBJEXT): {$(VPATH)}vm_opts.h
13551+
re.$(OBJEXT): {$(VPATH)}vm_sync.h
1354813552
regcomp.$(OBJEXT): $(hdrdir)/ruby.h
1354913553
regcomp.$(OBJEXT): $(hdrdir)/ruby/ruby.h
1355013554
regcomp.$(OBJEXT): {$(VPATH)}assert.h

encoding.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#include "ruby/encoding.h"
2929
#include "ruby/util.h"
3030
#include "ruby_assert.h"
31+
#include "vm_core.h"
3132
#include "vm_sync.h"
3233
#include "ruby_atomic.h"
3334

@@ -866,7 +867,11 @@ int
866867
rb_enc_find_index(const char *name)
867868
{
868869
int i;
869-
ASSERT_vm_unlocking(); // it needs to be unlocked so it can call `load_encoding` if necessary
870+
#if RUBY_DEBUG > 0
871+
if (rb_multi_ractor_p() || !rb_enc_registered(name)) {
872+
ASSERT_vm_unlocking(); // it needs to be unlocked so it can call `load_encoding` if necessary
873+
}
874+
#endif
870875
GLOBAL_ENC_TABLE_LOCKING(enc_table) {
871876
i = enc_registered(enc_table, name);
872877
}

re.c

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include "internal/object.h"
2525
#include "internal/ractor.h"
2626
#include "internal/variable.h"
27+
#include "vm_sync.h"
2728
#include "regint.h"
2829
#include "ruby/encoding.h"
2930
#include "ruby/re.h"
@@ -4588,14 +4589,22 @@ rb_reg_regsub(VALUE str, VALUE src, struct re_registers *regs, VALUE regexp)
45884589
static VALUE
45894590
ignorecase_getter(ID _x, VALUE *_y)
45904591
{
4591-
rb_category_warn(RB_WARN_CATEGORY_DEPRECATED, "variable $= is no longer effective");
4592+
RB_VM_UNLOCK();
4593+
{
4594+
rb_category_warn(RB_WARN_CATEGORY_DEPRECATED, "variable $= is no longer effective");
4595+
}
4596+
RB_VM_LOCK();
45924597
return Qfalse;
45934598
}
45944599

45954600
static void
45964601
ignorecase_setter(VALUE val, ID id, VALUE *_)
45974602
{
4598-
rb_category_warn(RB_WARN_CATEGORY_DEPRECATED, "variable $= is no longer effective; ignored");
4603+
RB_VM_UNLOCK();
4604+
{
4605+
rb_category_warn(RB_WARN_CATEGORY_DEPRECATED, "variable $= is no longer effective; ignored");
4606+
}
4607+
RB_VM_LOCK();
45994608
}
46004609

46014610
static VALUE

variable.c

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -986,17 +986,19 @@ rb_gvar_set_entry(struct rb_global_entry *entry, VALUE val)
986986
{
987987
struct trace_data trace;
988988
struct rb_global_variable *var = entry->var;
989-
RB_VM_UNLOCK();
990989

991990
(*var->setter)(val, entry->id, var->data);
992991

993992
if (var->trace && !var->block_trace) {
994993
var->block_trace = 1;
995994
trace.trace = var->trace;
996995
trace.val = val;
997-
rb_ensure(trace_ev, (VALUE)&trace, trace_en, (VALUE)var);
996+
RB_VM_UNLOCK();
997+
{
998+
rb_ensure(trace_ev, (VALUE)&trace, trace_en, (VALUE)var);
999+
}
1000+
RB_VM_LOCK();
9981001
}
999-
RB_VM_LOCK();
10001002
return val;
10011003
}
10021004

@@ -1050,9 +1052,13 @@ rb_gvar_get(ID id)
10501052
}
10511053
else {
10521054
retval = (*var->getter)(entry->id, var->data);
1053-
if (rb_obj_respond_to(retval, rb_intern("clone"), 1)) {
1054-
retval = rb_funcall(retval, rb_intern("clone"), 0);
1055+
RB_VM_UNLOCK();
1056+
{
1057+
if (rb_obj_respond_to(retval, rb_intern("clone"), 1)) {
1058+
retval = rb_funcall(retval, rb_intern("clone"), 0);
1059+
}
10551060
}
1061+
RB_VM_LOCK();
10561062
rb_hash_aset(gvars, key, retval);
10571063
}
10581064
}

0 commit comments

Comments
 (0)