mirror of
https://github.com/ruby/ruby.git
synced 2025-09-15 08:33:58 +02:00
Move BOP macros to separate file
This commit moves ruby_basic_operators and the unredefined macros out of
vm_core.h and into basic_operators.h so that we can use them more
broadly in places where we currently use a method look up via
`rb_method_basic_definition_p` (e.g. object.c, numeric.c, complex.c,
enum.c, but also in internal/compar.h after introducing BOP_CMP and
elsewhere if we introduce more BOPs)
The most controversial part of this change is probably moving
redefined_flag out of rb_vm_t. [vm_opt_method_def_table and
vm_opt_mid_table](9da2a5204f/vm.c
)
are not part of rb_vm_t either, and I think this fits well with those.
But more significantly it seems to result in one fewer instruction. For
example:
Before:
```
(lldb) disassemble -n vm_opt_str_freeze
miniruby`vm_exec_core:
miniruby[0x10028233e] <+14558>: movq 0x11a86b(%rip), %rax ; ruby_current_vm_ptr
miniruby[0x100282345] <+14565>: testb $0x4, 0x242c(%rax)
```
After:
```
(lldb) disassemble -n vm_opt_str_freeze
ruby`vm_exec_core:
ruby[0x100280ebe] <+14510>: testb $0x4, 0x120147(%rip) ; ruby_vm_redefined_flag + 43
```
Co-authored-by: John Hawthorn <jhawthorn@github.com>
This commit is contained in:
parent
9d4483f24d
commit
c43951e60e
4 changed files with 95 additions and 84 deletions
53
vm_core.h
53
vm_core.h
|
@ -91,6 +91,7 @@ extern int ruby_assert_critical_section_entered;
|
|||
#include "id.h"
|
||||
#include "internal.h"
|
||||
#include "internal/array.h"
|
||||
#include "internal/basic_operators.h"
|
||||
#include "internal/serial.h"
|
||||
#include "internal/vm.h"
|
||||
#include "method.h"
|
||||
|
@ -582,40 +583,6 @@ enum ruby_special_exceptions {
|
|||
ruby_special_error_count
|
||||
};
|
||||
|
||||
enum ruby_basic_operators {
|
||||
BOP_PLUS,
|
||||
BOP_MINUS,
|
||||
BOP_MULT,
|
||||
BOP_DIV,
|
||||
BOP_MOD,
|
||||
BOP_EQ,
|
||||
BOP_EQQ,
|
||||
BOP_LT,
|
||||
BOP_LE,
|
||||
BOP_LTLT,
|
||||
BOP_AREF,
|
||||
BOP_ASET,
|
||||
BOP_LENGTH,
|
||||
BOP_SIZE,
|
||||
BOP_EMPTY_P,
|
||||
BOP_NIL_P,
|
||||
BOP_SUCC,
|
||||
BOP_GT,
|
||||
BOP_GE,
|
||||
BOP_NOT,
|
||||
BOP_NEQ,
|
||||
BOP_MATCH,
|
||||
BOP_FREEZE,
|
||||
BOP_UMINUS,
|
||||
BOP_MAX,
|
||||
BOP_MIN,
|
||||
BOP_CALL,
|
||||
BOP_AND,
|
||||
BOP_OR,
|
||||
|
||||
BOP_LAST_
|
||||
};
|
||||
|
||||
#define GetVMPtr(obj, ptr) \
|
||||
GetCoreDataFromValue((obj), rb_vm_t, (ptr))
|
||||
|
||||
|
@ -775,7 +742,6 @@ typedef struct rb_vm_struct {
|
|||
size_t fiber_machine_stack_size;
|
||||
} default_params;
|
||||
|
||||
short redefined_flag[BOP_LAST_];
|
||||
} rb_vm_t;
|
||||
|
||||
/* default values */
|
||||
|
@ -808,23 +774,6 @@ typedef struct rb_vm_struct {
|
|||
#define RUBY_VM_FIBER_MACHINE_STACK_SIZE_MIN ( 128 * 1024 * sizeof(VALUE))
|
||||
#endif
|
||||
|
||||
/* optimize insn */
|
||||
#define INTEGER_REDEFINED_OP_FLAG (1 << 0)
|
||||
#define FLOAT_REDEFINED_OP_FLAG (1 << 1)
|
||||
#define STRING_REDEFINED_OP_FLAG (1 << 2)
|
||||
#define ARRAY_REDEFINED_OP_FLAG (1 << 3)
|
||||
#define HASH_REDEFINED_OP_FLAG (1 << 4)
|
||||
/* #define BIGNUM_REDEFINED_OP_FLAG (1 << 5) */
|
||||
#define SYMBOL_REDEFINED_OP_FLAG (1 << 6)
|
||||
#define TIME_REDEFINED_OP_FLAG (1 << 7)
|
||||
#define REGEXP_REDEFINED_OP_FLAG (1 << 8)
|
||||
#define NIL_REDEFINED_OP_FLAG (1 << 9)
|
||||
#define TRUE_REDEFINED_OP_FLAG (1 << 10)
|
||||
#define FALSE_REDEFINED_OP_FLAG (1 << 11)
|
||||
#define PROC_REDEFINED_OP_FLAG (1 << 12)
|
||||
|
||||
#define BASIC_OP_UNREDEFINED_P(op, klass) (LIKELY((GET_VM()->redefined_flag[(op)]&(klass)) == 0))
|
||||
|
||||
#ifndef VM_DEBUG_BP_CHECK
|
||||
#define VM_DEBUG_BP_CHECK 0
|
||||
#endif
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue