mirror of
https://github.com/ruby/ruby.git
synced 2025-08-15 13:39:04 +02:00
Merge 4eae384503
into d025bc230c
This commit is contained in:
commit
8c17c4de3e
13 changed files with 1705 additions and 27 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -97,6 +97,7 @@ lcov*.info
|
||||||
/enc.mk
|
/enc.mk
|
||||||
/encdb.h
|
/encdb.h
|
||||||
/exts.mk
|
/exts.mk
|
||||||
|
/gc/*/exts.mk
|
||||||
/goruby
|
/goruby
|
||||||
/id.[ch]
|
/id.[ch]
|
||||||
/largefile.h
|
/largefile.h
|
||||||
|
|
1
class.c
1
class.c
|
@ -990,6 +990,7 @@ copy_tables(VALUE clone, VALUE orig)
|
||||||
arg.klass = clone;
|
arg.klass = clone;
|
||||||
rb_id_table_foreach(orig_tbl, clone_const_i, &arg);
|
rb_id_table_foreach(orig_tbl, clone_const_i, &arg);
|
||||||
RCLASS_WRITE_CONST_TBL(clone, const_tbl, false);
|
RCLASS_WRITE_CONST_TBL(clone, const_tbl, false);
|
||||||
|
rb_gc_writebarrier_remember(clone);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
38
compile.c
38
compile.c
|
@ -2932,7 +2932,6 @@ iseq_set_exception_table(rb_iseq_t *iseq)
|
||||||
RUBY_ASSERT(pos >= 0);
|
RUBY_ASSERT(pos >= 0);
|
||||||
entry->end = (unsigned int)pos;
|
entry->end = (unsigned int)pos;
|
||||||
entry->iseq = (rb_iseq_t *)ptr[3];
|
entry->iseq = (rb_iseq_t *)ptr[3];
|
||||||
RB_OBJ_WRITTEN(iseq, Qundef, entry->iseq);
|
|
||||||
|
|
||||||
/* stack depth */
|
/* stack depth */
|
||||||
if (ptr[4]) {
|
if (ptr[4]) {
|
||||||
|
@ -2953,6 +2952,9 @@ iseq_set_exception_table(rb_iseq_t *iseq)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ISEQ_BODY(iseq)->catch_table = table;
|
ISEQ_BODY(iseq)->catch_table = table;
|
||||||
|
for (i = 0; i < table->size; i++) {
|
||||||
|
RB_OBJ_WRITTEN(iseq, Qundef, table->entries[i].iseq);
|
||||||
|
}
|
||||||
RB_OBJ_WRITE(iseq, &ISEQ_COMPILE_DATA(iseq)->catch_table_ary, 0); /* free */
|
RB_OBJ_WRITE(iseq, &ISEQ_COMPILE_DATA(iseq)->catch_table_ary, 0); /* free */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12913,23 +12915,25 @@ ibf_load_code(const struct ibf_load *load, rb_iseq_t *iseq, ibf_offset_t bytecod
|
||||||
VALUE iseqv = (VALUE)iseq;
|
VALUE iseqv = (VALUE)iseq;
|
||||||
unsigned int code_index;
|
unsigned int code_index;
|
||||||
ibf_offset_t reading_pos = bytecode_offset;
|
ibf_offset_t reading_pos = bytecode_offset;
|
||||||
VALUE *code = ALLOC_N(VALUE, iseq_size);
|
VALUE *code = ZALLOC_N(VALUE, iseq_size);
|
||||||
|
|
||||||
struct rb_iseq_constant_body *load_body = ISEQ_BODY(iseq);
|
struct rb_iseq_constant_body *load_body = ISEQ_BODY(iseq);
|
||||||
struct rb_call_data *cd_entries = load_body->call_data;
|
struct rb_call_data *cd_entries = load_body->call_data;
|
||||||
int ic_index = 0;
|
int ic_index = 0;
|
||||||
|
|
||||||
|
bool needs_bitmap = false;
|
||||||
iseq_bits_t * mark_offset_bits;
|
iseq_bits_t * mark_offset_bits;
|
||||||
|
|
||||||
iseq_bits_t tmp[1] = {0};
|
|
||||||
|
|
||||||
if (ISEQ_MBITS_BUFLEN(iseq_size) == 1) {
|
if (ISEQ_MBITS_BUFLEN(iseq_size) == 1) {
|
||||||
mark_offset_bits = tmp;
|
load_body->mark_bits.single = 0;
|
||||||
|
mark_offset_bits = &load_body->mark_bits.single;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
mark_offset_bits = ZALLOC_N(iseq_bits_t, ISEQ_MBITS_BUFLEN(iseq_size));
|
load_body->mark_bits.list = ZALLOC_N(iseq_bits_t, ISEQ_MBITS_BUFLEN(iseq_size));
|
||||||
|
mark_offset_bits = load_body->mark_bits.list;
|
||||||
}
|
}
|
||||||
bool needs_bitmap = false;
|
|
||||||
|
load_body->iseq_encoded = code;
|
||||||
|
load_body->iseq_size = iseq_size;
|
||||||
|
|
||||||
for (code_index=0; code_index<iseq_size;) {
|
for (code_index=0; code_index<iseq_size;) {
|
||||||
/* opcode */
|
/* opcode */
|
||||||
|
@ -13048,22 +13052,12 @@ ibf_load_code(const struct ibf_load *load, rb_iseq_t *iseq, ibf_offset_t bytecod
|
||||||
if (insn_len(insn) != op_index+1) {
|
if (insn_len(insn) != op_index+1) {
|
||||||
rb_raise(rb_eRuntimeError, "operand size mismatch");
|
rb_raise(rb_eRuntimeError, "operand size mismatch");
|
||||||
}
|
}
|
||||||
|
rb_gc();
|
||||||
}
|
}
|
||||||
|
|
||||||
load_body->iseq_encoded = code;
|
if (!needs_bitmap) {
|
||||||
load_body->iseq_size = code_index;
|
ruby_xfree(load_body->mark_bits.list);
|
||||||
|
load_body->mark_bits.list = NULL;
|
||||||
if (ISEQ_MBITS_BUFLEN(load_body->iseq_size) == 1) {
|
|
||||||
load_body->mark_bits.single = mark_offset_bits[0];
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (needs_bitmap) {
|
|
||||||
load_body->mark_bits.list = mark_offset_bits;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
load_body->mark_bits.list = 0;
|
|
||||||
ruby_xfree(mark_offset_bits);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
RUBY_ASSERT(code_index == iseq_size);
|
RUBY_ASSERT(code_index == iseq_size);
|
||||||
|
|
3
gc/wbcheck/extconf.rb
Normal file
3
gc/wbcheck/extconf.rb
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
require_relative '../extconf_base'
|
||||||
|
|
||||||
|
create_gc_makefile("wbcheck")
|
1668
gc/wbcheck/wbcheck.c
Normal file
1668
gc/wbcheck/wbcheck.c
Normal file
File diff suppressed because it is too large
Load diff
3
hash.c
3
hash.c
|
@ -1975,6 +1975,9 @@ rb_hash_rehash_i(VALUE key, VALUE value, VALUE arg)
|
||||||
else {
|
else {
|
||||||
st_insert(RHASH_ST_TABLE(arg), (st_data_t)key, (st_data_t)value);
|
st_insert(RHASH_ST_TABLE(arg), (st_data_t)key, (st_data_t)value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RB_OBJ_WRITTEN(arg, Qundef, key);
|
||||||
|
RB_OBJ_WRITTEN(arg, Qundef, value);
|
||||||
return ST_CONTINUE;
|
return ST_CONTINUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
1
io.c
1
io.c
|
@ -15982,6 +15982,7 @@ Init_IO(void)
|
||||||
rb_define_method(rb_cARGF, "set_encoding", argf_set_encoding, -1);
|
rb_define_method(rb_cARGF, "set_encoding", argf_set_encoding, -1);
|
||||||
|
|
||||||
argf = rb_class_new_instance(0, 0, rb_cARGF);
|
argf = rb_class_new_instance(0, 0, rb_cARGF);
|
||||||
|
rb_vm_register_global_object(argf);
|
||||||
|
|
||||||
rb_define_readonly_variable("$<", &argf);
|
rb_define_readonly_variable("$<", &argf);
|
||||||
/*
|
/*
|
||||||
|
|
2
iseq.c
2
iseq.c
|
@ -348,7 +348,7 @@ rb_iseq_mark_and_move(rb_iseq_t *iseq, bool reference_updating)
|
||||||
if (ISEQ_BODY(iseq)) {
|
if (ISEQ_BODY(iseq)) {
|
||||||
struct rb_iseq_constant_body *body = ISEQ_BODY(iseq);
|
struct rb_iseq_constant_body *body = ISEQ_BODY(iseq);
|
||||||
|
|
||||||
rb_iseq_mark_and_move_each_body_value(iseq, reference_updating ? ISEQ_ORIGINAL_ISEQ(iseq) : NULL);
|
rb_iseq_mark_and_move_each_body_value(iseq, ISEQ_ORIGINAL_ISEQ(iseq));
|
||||||
|
|
||||||
rb_gc_mark_and_move(&body->variable.coverage);
|
rb_gc_mark_and_move(&body->variable.coverage);
|
||||||
rb_gc_mark_and_move(&body->variable.pc2branchindex);
|
rb_gc_mark_and_move(&body->variable.pc2branchindex);
|
||||||
|
|
8
proc.c
8
proc.c
|
@ -722,6 +722,7 @@ rb_func_proc_dup(VALUE src_obj)
|
||||||
ep[VM_ENV_DATA_INDEX_ME_CREF] = src_proc->block.as.captured.ep[VM_ENV_DATA_INDEX_ME_CREF];
|
ep[VM_ENV_DATA_INDEX_ME_CREF] = src_proc->block.as.captured.ep[VM_ENV_DATA_INDEX_ME_CREF];
|
||||||
ep[VM_ENV_DATA_INDEX_SPECVAL] = src_proc->block.as.captured.ep[VM_ENV_DATA_INDEX_SPECVAL];
|
ep[VM_ENV_DATA_INDEX_SPECVAL] = src_proc->block.as.captured.ep[VM_ENV_DATA_INDEX_SPECVAL];
|
||||||
ep[VM_ENV_DATA_INDEX_ENV] = src_proc->block.as.captured.ep[VM_ENV_DATA_INDEX_ENV];
|
ep[VM_ENV_DATA_INDEX_ENV] = src_proc->block.as.captured.ep[VM_ENV_DATA_INDEX_ENV];
|
||||||
|
rb_gc_writebarrier_remember(proc_obj);
|
||||||
|
|
||||||
return proc_obj;
|
return proc_obj;
|
||||||
}
|
}
|
||||||
|
@ -992,7 +993,12 @@ rb_proc_call_kw(VALUE self, VALUE args, int kw_splat)
|
||||||
VALUE vret;
|
VALUE vret;
|
||||||
rb_proc_t *proc;
|
rb_proc_t *proc;
|
||||||
int argc = check_argc(RARRAY_LEN(args));
|
int argc = check_argc(RARRAY_LEN(args));
|
||||||
const VALUE *argv = RARRAY_CONST_PTR(args);
|
|
||||||
|
// rb_vm_invoke_proc may end up modifying argv as part of calling and so we
|
||||||
|
// must use RARRAY_PTR, which marks the array as WB_UNPROTECTED instead of
|
||||||
|
// RARRAY_CONST_PTR. Unfortunately this is worse for GC.
|
||||||
|
// See invoke_block_from_c_proc
|
||||||
|
VALUE *argv = RARRAY_PTR(args);
|
||||||
GetProcPtr(self, proc);
|
GetProcPtr(self, proc);
|
||||||
vret = rb_vm_invoke_proc(GET_EC(), proc, argc, argv,
|
vret = rb_vm_invoke_proc(GET_EC(), proc, argc, argv,
|
||||||
kw_splat, VM_BLOCK_HANDLER_NONE);
|
kw_splat, VM_BLOCK_HANDLER_NONE);
|
||||||
|
|
2
ractor.c
2
ractor.c
|
@ -1921,7 +1921,7 @@ move_leave(VALUE obj, struct obj_traverse_replace_data *data)
|
||||||
// Avoid mutations using bind_call, etc.
|
// Avoid mutations using bind_call, etc.
|
||||||
MEMZERO((char *)obj, char, sizeof(struct RBasic));
|
MEMZERO((char *)obj, char, sizeof(struct RBasic));
|
||||||
RBASIC(obj)->flags = flags;
|
RBASIC(obj)->flags = flags;
|
||||||
RBASIC_SET_CLASS_RAW(obj, rb_cRactorMovedObject);
|
RBASIC_SET_CLASS(obj, rb_cRactorMovedObject);
|
||||||
return traverse_cont;
|
return traverse_cont;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
#include "vm_debug.h"
|
#include "vm_debug.h"
|
||||||
|
|
||||||
#ifndef RACTOR_CHECK_MODE
|
#ifndef RACTOR_CHECK_MODE
|
||||||
#define RACTOR_CHECK_MODE (VM_CHECK_MODE || RUBY_DEBUG) && (SIZEOF_UINT64_T == SIZEOF_VALUE)
|
#define RACTOR_CHECK_MODE 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct rb_ractor_sync {
|
struct rb_ractor_sync {
|
||||||
|
|
2
ruby.c
2
ruby.c
|
@ -790,7 +790,7 @@ require_libraries(VALUE *req_list)
|
||||||
while (list && RARRAY_LEN(list) > 0) {
|
while (list && RARRAY_LEN(list) > 0) {
|
||||||
VALUE feature = rb_ary_shift(list);
|
VALUE feature = rb_ary_shift(list);
|
||||||
rb_enc_associate(feature, extenc);
|
rb_enc_associate(feature, extenc);
|
||||||
RBASIC_SET_CLASS_RAW(feature, rb_cString);
|
RBASIC_SET_CLASS(feature, rb_cString);
|
||||||
OBJ_FREEZE(feature);
|
OBJ_FREEZE(feature);
|
||||||
rb_funcallv(self, require, 1, &feature);
|
rb_funcallv(self, require, 1, &feature);
|
||||||
}
|
}
|
||||||
|
|
1
st.c
1
st.c
|
@ -1508,6 +1508,7 @@ st_update(st_table *tab, st_data_t key,
|
||||||
switch (retval) {
|
switch (retval) {
|
||||||
case ST_CONTINUE:
|
case ST_CONTINUE:
|
||||||
if (! existing) {
|
if (! existing) {
|
||||||
|
xfree(xmalloc(1));
|
||||||
st_add_direct_with_hash(tab, key, value, hash);
|
st_add_direct_with_hash(tab, key, value, hash);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue