summaryrefslogtreecommitdiff
path: root/yjit
diff options
context:
space:
mode:
authorTakashi Kokubun <takashikkbn@gmail.com>2024-02-08 16:53:01 -0800
committerGitHub <noreply@github.com>2024-02-09 00:53:01 +0000
commit5d32e328d90e435ceb5d1259438157ab5d2a4608 (patch)
tree1192fdb376fd4e46e93e9b1aff797471d1037350 /yjit
parente2aa00ca669704daf689110ea71e5844e2bd0536 (diff)
YJIT: Refactor recv_known_class to Option (#9895)
Diffstat (limited to 'yjit')
-rw-r--r--yjit/src/codegen.rs97
1 files changed, 48 insertions, 49 deletions
diff --git a/yjit/src/codegen.rs b/yjit/src/codegen.rs
index 07155efd69..afcaf54406 100644
--- a/yjit/src/codegen.rs
+++ b/yjit/src/codegen.rs
@@ -4492,7 +4492,7 @@ fn jit_rb_obj_not(
_cme: *const rb_callable_method_entry_t,
_block: Option<BlockHandler>,
_argc: i32,
- _known_recv_class: *const VALUE,
+ _known_recv_class: Option<VALUE>,
) -> bool {
let recv_opnd = asm.ctx.get_opnd_type(StackOpnd(0));
@@ -4527,7 +4527,7 @@ fn jit_rb_true(
_cme: *const rb_callable_method_entry_t,
_block: Option<BlockHandler>,
_argc: i32,
- _known_recv_class: *const VALUE,
+ _known_recv_class: Option<VALUE>,
) -> bool {
asm_comment!(asm, "nil? == true");
asm.stack_pop(1);
@@ -4545,7 +4545,7 @@ fn jit_rb_false(
_cme: *const rb_callable_method_entry_t,
_block: Option<BlockHandler>,
_argc: i32,
- _known_recv_class: *const VALUE,
+ _known_recv_class: Option<VALUE>,
) -> bool {
asm_comment!(asm, "nil? == false");
asm.stack_pop(1);
@@ -4563,14 +4563,14 @@ fn jit_rb_kernel_is_a(
_cme: *const rb_callable_method_entry_t,
_block: Option<BlockHandler>,
argc: i32,
- known_recv_class: *const VALUE,
+ known_recv_class: Option<VALUE>,
) -> bool {
if argc != 1 {
return false;
}
// If this is a super call we might not know the class
- if known_recv_class.is_null() {
+ if known_recv_class.is_none() {
return false;
}
@@ -4616,14 +4616,14 @@ fn jit_rb_kernel_instance_of(
_cme: *const rb_callable_method_entry_t,
_block: Option<BlockHandler>,
argc: i32,
- known_recv_class: *const VALUE,
+ known_recv_class: Option<VALUE>,
) -> bool {
if argc != 1 {
return false;
}
// If this is a super call we might not know the class
- if known_recv_class.is_null() {
+ if known_recv_class.is_none() {
return false;
}
@@ -4681,7 +4681,7 @@ fn jit_rb_mod_eqq(
_cme: *const rb_callable_method_entry_t,
_block: Option<BlockHandler>,
argc: i32,
- _known_recv_class: *const VALUE,
+ _known_recv_class: Option<VALUE>,
) -> bool {
if argc != 1 {
return false;
@@ -4715,7 +4715,7 @@ fn jit_rb_obj_equal(
_cme: *const rb_callable_method_entry_t,
_block: Option<BlockHandler>,
_argc: i32,
- _known_recv_class: *const VALUE,
+ _known_recv_class: Option<VALUE>,
) -> bool {
asm_comment!(asm, "equal?");
let obj1 = asm.stack_pop(1);
@@ -4739,7 +4739,7 @@ fn jit_rb_obj_not_equal(
_cme: *const rb_callable_method_entry_t,
_block: Option<BlockHandler>,
_argc: i32,
- _known_recv_class: *const VALUE,
+ _known_recv_class: Option<VALUE>,
) -> bool {
gen_equality_specialized(jit, asm, ocb, false) == Some(true)
}
@@ -4753,7 +4753,7 @@ fn jit_rb_int_equal(
_cme: *const rb_callable_method_entry_t,
_block: Option<BlockHandler>,
_argc: i32,
- _known_recv_class: *const VALUE,
+ _known_recv_class: Option<VALUE>,
) -> bool {
// Check that both operands are fixnums
guard_two_fixnums(jit, asm, ocb);
@@ -4778,7 +4778,7 @@ fn jit_rb_int_succ(
_cme: *const rb_callable_method_entry_t,
_block: Option<BlockHandler>,
_argc: i32,
- _known_recv_class: *const VALUE,
+ _known_recv_class: Option<VALUE>,
) -> bool {
// Guard the receiver is fixnum
let recv_type = asm.ctx.get_opnd_type(StackOpnd(0));
@@ -4808,7 +4808,7 @@ fn jit_rb_int_div(
_cme: *const rb_callable_method_entry_t,
_block: Option<BlockHandler>,
_argc: i32,
- _known_recv_class: *const VALUE,
+ _known_recv_class: Option<VALUE>,
) -> bool {
if asm.ctx.two_fixnums_on_stack(jit) != Some(true) {
return false;
@@ -4842,7 +4842,7 @@ fn jit_rb_int_lshift(
_cme: *const rb_callable_method_entry_t,
_block: Option<BlockHandler>,
_argc: i32,
- _known_recv_class: *const VALUE,
+ _known_recv_class: Option<VALUE>,
) -> bool {
if asm.ctx.two_fixnums_on_stack(jit) != Some(true) {
return false;
@@ -4907,7 +4907,7 @@ fn jit_rb_int_rshift(
_cme: *const rb_callable_method_entry_t,
_block: Option<BlockHandler>,
_argc: i32,
- _known_recv_class: *const VALUE,
+ _known_recv_class: Option<VALUE>,
) -> bool {
if asm.ctx.two_fixnums_on_stack(jit) != Some(true) {
return false;
@@ -4960,7 +4960,7 @@ fn jit_rb_int_xor(
_cme: *const rb_callable_method_entry_t,
_block: Option<BlockHandler>,
_argc: i32,
- _known_recv_class: *const VALUE,
+ _known_recv_class: Option<VALUE>,
) -> bool {
if asm.ctx.two_fixnums_on_stack(jit) != Some(true) {
return false;
@@ -4987,7 +4987,7 @@ fn jit_rb_int_aref(
_cme: *const rb_callable_method_entry_t,
_block: Option<BlockHandler>,
argc: i32,
- _known_recv_class: *const VALUE,
+ _known_recv_class: Option<VALUE>,
) -> bool {
if argc != 1 {
return false;
@@ -5016,7 +5016,7 @@ fn jit_rb_float_plus(
_cme: *const rb_callable_method_entry_t,
_block: Option<BlockHandler>,
_argc: i32,
- _known_recv_class: *const VALUE,
+ _known_recv_class: Option<VALUE>,
) -> bool {
// Guard obj is Fixnum or Flonum to avoid rb_funcall on rb_num_coerce_bin
let comptime_obj = jit.peek_at_stack(&asm.ctx, 0);
@@ -5060,7 +5060,7 @@ fn jit_rb_float_minus(
_cme: *const rb_callable_method_entry_t,
_block: Option<BlockHandler>,
_argc: i32,
- _known_recv_class: *const VALUE,
+ _known_recv_class: Option<VALUE>,
) -> bool {
// Guard obj is Fixnum or Flonum to avoid rb_funcall on rb_num_coerce_bin
let comptime_obj = jit.peek_at_stack(&asm.ctx, 0);
@@ -5104,7 +5104,7 @@ fn jit_rb_float_mul(
_cme: *const rb_callable_method_entry_t,
_block: Option<BlockHandler>,
_argc: i32,
- _known_recv_class: *const VALUE,
+ _known_recv_class: Option<VALUE>,
) -> bool {
// Guard obj is Fixnum or Flonum to avoid rb_funcall on rb_num_coerce_bin
let comptime_obj = jit.peek_at_stack(&asm.ctx, 0);
@@ -5148,7 +5148,7 @@ fn jit_rb_float_div(
_cme: *const rb_callable_method_entry_t,
_block: Option<BlockHandler>,
_argc: i32,
- _known_recv_class: *const VALUE,
+ _known_recv_class: Option<VALUE>,
) -> bool {
// Guard obj is Fixnum or Flonum to avoid rb_funcall on rb_num_coerce_bin
let comptime_obj = jit.peek_at_stack(&asm.ctx, 0);
@@ -5193,7 +5193,7 @@ fn jit_rb_str_uplus(
_cme: *const rb_callable_method_entry_t,
_block: Option<BlockHandler>,
argc: i32,
- _known_recv_class: *const VALUE,
+ _known_recv_class: Option<VALUE>,
) -> bool
{
if argc != 0 {
@@ -5237,7 +5237,7 @@ fn jit_rb_str_length(
_cme: *const rb_callable_method_entry_t,
_block: Option<BlockHandler>,
_argc: i32,
- _known_recv_class: *const VALUE,
+ _known_recv_class: Option<VALUE>,
) -> bool {
asm_comment!(asm, "String#length");
extern "C" {
@@ -5264,7 +5264,7 @@ fn jit_rb_str_bytesize(
_cme: *const rb_callable_method_entry_t,
_block: Option<BlockHandler>,
_argc: i32,
- _known_recv_class: *const VALUE,
+ _known_recv_class: Option<VALUE>,
) -> bool {
asm_comment!(asm, "String#bytesize");
@@ -5296,7 +5296,7 @@ fn jit_rb_str_getbyte(
_cme: *const rb_callable_method_entry_t,
_block: Option<BlockHandler>,
_argc: i32,
- _known_recv_class: *const VALUE,
+ _known_recv_class: Option<VALUE>,
) -> bool {
asm_comment!(asm, "String#getbyte");
extern "C" {
@@ -5329,9 +5329,9 @@ fn jit_rb_str_to_s(
_cme: *const rb_callable_method_entry_t,
_block: Option<BlockHandler>,
_argc: i32,
- known_recv_class: *const VALUE,
+ known_recv_class: Option<VALUE>,
) -> bool {
- if !known_recv_class.is_null() && unsafe { *known_recv_class == rb_cString } {
+ if unsafe { known_recv_class == Some(rb_cString) } {
asm_comment!(asm, "to_s on plain string");
// The method returns the receiver, which is already on the stack.
// No stack movement.
@@ -5349,7 +5349,7 @@ fn jit_rb_str_empty_p(
_cme: *const rb_callable_method_entry_t,
_block: Option<BlockHandler>,
_argc: i32,
- _known_recv_class: *const VALUE,
+ _known_recv_class: Option<VALUE>,
) -> bool {
let recv_opnd = asm.stack_pop(1);
@@ -5379,7 +5379,7 @@ fn jit_rb_str_concat(
_cme: *const rb_callable_method_entry_t,
_block: Option<BlockHandler>,
_argc: i32,
- _known_recv_class: *const VALUE,
+ _known_recv_class: Option<VALUE>,
) -> bool {
// The << operator can accept integer codepoints for characters
// as the argument. We only specially optimise string arguments.
@@ -5450,7 +5450,7 @@ fn jit_rb_ary_empty_p(
_cme: *const rb_callable_method_entry_t,
_block: Option<BlockHandler>,
_argc: i32,
- _known_recv_class: *const VALUE,
+ _known_recv_class: Option<VALUE>,
) -> bool {
let array_opnd = asm.stack_pop(1);
let array_reg = asm.load(array_opnd);
@@ -5474,7 +5474,7 @@ fn jit_rb_ary_length(
_cme: *const rb_callable_method_entry_t,
_block: Option<BlockHandler>,
_argc: i32,
- _known_recv_class: *const VALUE,
+ _known_recv_class: Option<VALUE>,
) -> bool {
let array_opnd = asm.stack_pop(1);
let array_reg = asm.load(array_opnd);
@@ -5498,7 +5498,7 @@ fn jit_rb_ary_push(
_cme: *const rb_callable_method_entry_t,
_block: Option<BlockHandler>,
_argc: i32,
- _known_recv_class: *const VALUE,
+ _known_recv_class: Option<VALUE>,
) -> bool {
asm_comment!(asm, "Array#<<");
@@ -5524,7 +5524,7 @@ fn jit_rb_hash_empty_p(
_cme: *const rb_callable_method_entry_t,
_block: Option<BlockHandler>,
_argc: i32,
- _known_recv_class: *const VALUE,
+ _known_recv_class: Option<VALUE>,
) -> bool {
asm_comment!(asm, "Hash#empty?");
@@ -5544,18 +5544,17 @@ fn jit_obj_respond_to(
_cme: *const rb_callable_method_entry_t,
_block: Option<BlockHandler>,
argc: i32,
- known_recv_class: *const VALUE,
+ known_recv_class: Option<VALUE>,
) -> bool {
// respond_to(:sym) or respond_to(:sym, true)
if argc != 1 && argc != 2 {
return false;
}
- if known_recv_class.is_null() {
- return false;
- }
-
- let recv_class = unsafe { *known_recv_class };
+ let recv_class = match known_recv_class {
+ Some(class) => class,
+ None => return false,
+ };
// Get the method_id from compile time. We will later add a guard against it.
let mid_sym = jit.peek_at_stack(&asm.ctx, (argc - 1) as isize);
@@ -5651,7 +5650,7 @@ fn jit_rb_f_block_given_p(
_cme: *const rb_callable_method_entry_t,
_block: Option<BlockHandler>,
_argc: i32,
- _known_recv_class: *const VALUE,
+ _known_recv_class: Option<VALUE>,
) -> bool {
asm.stack_pop(1);
let out_opnd = asm.stack_push(Type::UnknownImm);
@@ -5690,7 +5689,7 @@ fn jit_thread_s_current(
_cme: *const rb_callable_method_entry_t,
_block: Option<BlockHandler>,
_argc: i32,
- _known_recv_class: *const VALUE,
+ _known_recv_class: Option<VALUE>,
) -> bool {
asm_comment!(asm, "Thread.current");
asm.stack_pop(1);
@@ -5904,7 +5903,7 @@ fn gen_send_cfunc(
ci: *const rb_callinfo,
cme: *const rb_callable_method_entry_t,
block: Option<BlockHandler>,
- recv_known_klass: *const VALUE,
+ recv_known_class: Option<VALUE>,
flags: u32,
argc: i32,
) -> Option<CodegenStatus> {
@@ -5950,7 +5949,7 @@ fn gen_send_cfunc(
let codegen_p = lookup_cfunc_codegen(unsafe { (*cme).def });
let expected_stack_after = asm.ctx.get_stack_size() as i32 - argc;
if let Some(known_cfunc_codegen) = codegen_p {
- if known_cfunc_codegen(jit, asm, ocb, ci, cme, block, argc, recv_known_klass) {
+ if known_cfunc_codegen(jit, asm, ocb, ci, cme, block, argc, recv_known_class) {
assert_eq!(expected_stack_after, asm.ctx.get_stack_size() as i32);
gen_counter_incr(asm, Counter::num_send_cfunc_inline);
// cfunc codegen generated code. Terminate the block so
@@ -5968,8 +5967,8 @@ fn gen_send_cfunc(
// Assemble the method name string
let mid = unsafe { vm_ci_mid(ci) };
- let class_name = if recv_known_klass != ptr::null() {
- unsafe { cstr_to_rust_string(rb_class2name(*recv_known_klass)) }.unwrap()
+ let class_name = if let Some(class) = recv_known_class {
+ unsafe { cstr_to_rust_string(rb_class2name(class)) }.unwrap()
} else {
"Unknown".to_string()
};
@@ -7726,7 +7725,7 @@ fn gen_send_general(
ci,
cme,
block,
- &comptime_recv_klass,
+ Some(comptime_recv_klass),
flags,
argc,
);
@@ -8463,7 +8462,7 @@ fn gen_invokesuper_specialized(
gen_send_iseq(jit, asm, ocb, iseq, ci, frame_type, None, cme, Some(block), ci_flags, argc, None)
}
VM_METHOD_TYPE_CFUNC => {
- gen_send_cfunc(jit, asm, ocb, ci, cme, Some(block), ptr::null(), ci_flags, argc)
+ gen_send_cfunc(jit, asm, ocb, ci, cme, Some(block), None, ci_flags, argc)
}
_ => unreachable!(),
}
@@ -9328,7 +9327,7 @@ fn get_gen_fn(opcode: VALUE) -> Option<InsnGenFn> {
}
// Return true when the codegen function generates code.
-// known_recv_klass is non-NULL when the caller has used jit_guard_known_klass().
+// known_recv_class has Some value when the caller has used jit_guard_known_klass().
// See yjit_reg_method().
type MethodGenFn = fn(
jit: &mut JITState,
@@ -9338,7 +9337,7 @@ type MethodGenFn = fn(
cme: *const rb_callable_method_entry_t,
block: Option<BlockHandler>,
argc: i32,
- known_recv_class: *const VALUE,
+ known_recv_class: Option<VALUE>,
) -> bool;
/// Methods for generating code for hardcoded (usually C) methods