mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
Use rb_fstring for "defined" strings.
We can take advantage of fstrings to de-duplicate the defined strings. This means we don't need to keep the list of defined strings on the VM (or register them as mark objects)
This commit is contained in:
parent
ea817c60fc
commit
8359821870
Notes:
git
2021-03-18 02:56:04 +09:00
4 changed files with 3 additions and 22 deletions
|
@ -662,14 +662,14 @@ adjuststack
|
||||||
/* defined? */
|
/* defined? */
|
||||||
DEFINE_INSN
|
DEFINE_INSN
|
||||||
defined
|
defined
|
||||||
(rb_num_t op_type, VALUE obj, VALUE needstr)
|
(rb_num_t op_type, VALUE obj, VALUE pushval)
|
||||||
(VALUE v)
|
(VALUE v)
|
||||||
(VALUE val)
|
(VALUE val)
|
||||||
// attr bool leaf = leafness_of_defined(op_type);
|
// attr bool leaf = leafness_of_defined(op_type);
|
||||||
{
|
{
|
||||||
val = Qnil;
|
val = Qnil;
|
||||||
if (vm_defined(ec, GET_CFP(), op_type, obj, v)) {
|
if (vm_defined(ec, GET_CFP(), op_type, obj, v)) {
|
||||||
val = needstr;
|
val = pushval;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
16
iseq.c
16
iseq.c
|
@ -3103,24 +3103,10 @@ rb_iseq_defined_string(enum defined_type type)
|
||||||
"expression",
|
"expression",
|
||||||
};
|
};
|
||||||
const char *estr;
|
const char *estr;
|
||||||
VALUE *defs, str;
|
|
||||||
|
|
||||||
if ((unsigned)(type - 1) >= (unsigned)numberof(expr_names)) rb_bug("unknown defined type %d", type);
|
if ((unsigned)(type - 1) >= (unsigned)numberof(expr_names)) rb_bug("unknown defined type %d", type);
|
||||||
estr = expr_names[type - 1];
|
estr = expr_names[type - 1];
|
||||||
if (!estr[0]) return 0;
|
return rb_fstring_cstr(estr);
|
||||||
defs = GET_VM()->defined_strings;
|
|
||||||
if (!defs) {
|
|
||||||
defs = ruby_xcalloc(numberof(expr_names), sizeof(VALUE));
|
|
||||||
GET_VM()->defined_strings = defs;
|
|
||||||
}
|
|
||||||
str = defs[type-1];
|
|
||||||
if (!str) {
|
|
||||||
str = rb_str_new_cstr(estr);
|
|
||||||
OBJ_FREEZE(str);
|
|
||||||
defs[type-1] = str;
|
|
||||||
rb_gc_register_mark_object(str);
|
|
||||||
}
|
|
||||||
return str;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* A map from encoded_insn to insn_data: decoded insn number, its len,
|
/* A map from encoded_insn to insn_data: decoded insn number, its len,
|
||||||
|
|
4
vm.c
4
vm.c
|
@ -2677,15 +2677,11 @@ ruby_vm_destruct(rb_vm_t *vm)
|
||||||
static size_t
|
static size_t
|
||||||
vm_memsize(const void *ptr)
|
vm_memsize(const void *ptr)
|
||||||
{
|
{
|
||||||
const rb_vm_t *vmobj = ptr;
|
|
||||||
size_t size = sizeof(rb_vm_t);
|
size_t size = sizeof(rb_vm_t);
|
||||||
|
|
||||||
// TODO
|
// TODO
|
||||||
// size += vmobj->ractor_num * sizeof(rb_ractor_t);
|
// size += vmobj->ractor_num * sizeof(rb_ractor_t);
|
||||||
|
|
||||||
if (vmobj->defined_strings) {
|
|
||||||
size += DEFINED_EXPR * sizeof(VALUE);
|
|
||||||
}
|
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -650,7 +650,6 @@ typedef struct rb_vm_struct {
|
||||||
|
|
||||||
rb_at_exit_list *at_exit;
|
rb_at_exit_list *at_exit;
|
||||||
|
|
||||||
VALUE *defined_strings;
|
|
||||||
st_table *frozen_strings;
|
st_table *frozen_strings;
|
||||||
|
|
||||||
const struct rb_builtin_function *builtin_function_table;
|
const struct rb_builtin_function *builtin_function_table;
|
||||||
|
|
Loading…
Add table
Reference in a new issue