Skip to content

Commit 34aa1d9

Browse files
authored
Merge pull request #65 from sisshiki1969/spec2
Spec2
2 parents d6f5562 + 1a9c371 commit 34aa1d9

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+859
-868
lines changed

.vscode/launch.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
"args": [
1313
"run",
1414
"--features",
15-
"jit-debug",
15+
"jit-log",
1616
"--bin=monoruby",
1717
"--package=monoruby",
1818
],

Cargo.lock

+12-12
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

monoruby/Cargo.toml

+2-2
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ emit-cfg = ["dump-bc"]
3636
clap = { version = "4.5.27", features = ["derive"] }
3737
rustyline = "15.0.0"
3838
paste = "1.0.15"
39-
monoasm_macro = { git = "https://github.com/sisshiki1969/monoasm.git" }
40-
monoasm = { git = "https://github.com/sisshiki1969/monoasm.git" }
39+
monoasm_macro = { git = "https://github.com/sisshiki1969/monoasm.git", branch = "rc" }
40+
monoasm = { git = "https://github.com/sisshiki1969/monoasm.git", branch = "rc" }
4141
ruruby-parse = { git = "https://github.com/sisshiki1969/ruruby-parse.git" }
4242
monoruby-attr = { path = "../monoruby_attr" }
4343
num = "0.4.3"

monoruby/src/builtins/class.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ pub(super) fn gen_class_new(
113113
bb.write_back_callargs_and_dst(ir, callsite);
114114
ir.stack2reg(recv, GP::Rdi);
115115
let using_xmm = bb.get_using_xmm();
116-
let error = bb.new_error(ir);
116+
let error = ir.new_error(bb);
117117
ir.xmm_save(using_xmm);
118118
ir.inline(move |gen, _, _| {
119119
let cached_version = gen.jit.data_i32(-1);

monoruby/src/builtins/fiber.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ fn fiber_yield_inline(
6868
args, pos_num, dst, ..
6969
} = *callsite;
7070
let using_xmm = bb.get_using_xmm();
71-
let error = bb.new_error(ir);
71+
let error = ir.new_error(bb);
7272
ir.xmm_save(using_xmm);
7373
if pos_num == 0 {
7474
ir.inline(move |gen, _, _| {

monoruby/src/builtins/hash.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ fn hash_index(
239239
call rax;
240240
}
241241
});
242-
let error = bb.new_error(ir);
242+
let error = ir.new_error(bb);
243243
ir.handle_error(error);
244244
bb.rax2acc(ir, callsite.dst);
245245
true

monoruby/src/builtins/math.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ fn math_sqrt(
109109
return false;
110110
}
111111
let CallSiteInfo { args, dst, .. } = *callsite;
112-
let deopt = bb.new_deopt(ir);
112+
let deopt = ir.new_deopt(bb);
113113
let fsrc = bb.fetch_float_for_xmm(ir, args, deopt).enc();
114114
if let Some(dst) = dst {
115115
let fret = bb.xmm_write_enc(dst);
@@ -134,7 +134,7 @@ fn math_cos(
134134
return false;
135135
}
136136
let CallSiteInfo { args, dst, .. } = *callsite;
137-
let deopt = bb.new_deopt(ir);
137+
let deopt = ir.new_deopt(bb);
138138
let fsrc = bb.fetch_float_for_xmm(ir, args, deopt).enc();
139139
if let Some(ret) = dst {
140140
let fret = bb.xmm_write_enc(ret);
@@ -167,7 +167,7 @@ fn math_sin(
167167
return false;
168168
}
169169
let CallSiteInfo { args, dst: ret, .. } = *callsite;
170-
let deopt = bb.new_deopt(ir);
170+
let deopt = ir.new_deopt(bb);
171171
let fsrc = bb.fetch_float_for_xmm(ir, args, deopt).enc();
172172
if let Some(ret) = ret {
173173
let fret = bb.xmm_write_enc(ret);

monoruby/src/builtins/numeric/integer.rs

+6-6
Original file line numberDiff line numberDiff line change
@@ -404,12 +404,12 @@ fn integer_shr(
404404
return false;
405405
}
406406
let CallSiteInfo { dst, args, .. } = *callsite;
407-
let deopt = bb.new_deopt(ir);
407+
let deopt = ir.new_deopt(bb);
408408
if let Some(rhs) = bb.is_u8_literal(args) {
409409
ir.inline(move |gen, _, _| gen.gen_shr_imm(rhs));
410410
} else {
411411
bb.fetch_fixnum(ir, args, GP::Rcx, deopt);
412-
ir.inline(move |gen, _, labels| gen.gen_shr(labels[deopt]));
412+
ir.inline(move |gen, _, labels| gen.gen_shr(&labels[deopt]));
413413
}
414414
bb.reg2acc_fixnum(ir, GP::Rdi, dst);
415415
true
@@ -440,17 +440,17 @@ fn integer_shl(
440440
let CallSiteInfo {
441441
dst, args, recv, ..
442442
} = *callsite;
443-
let deopt = bb.new_deopt(ir);
443+
let deopt = ir.new_deopt(bb);
444444
if let Some(rhs) = bb.is_u8_literal(args)
445445
&& rhs < 64
446446
{
447-
ir.inline(move |gen, _, labels| gen.gen_shl_rhs_imm(rhs, labels[deopt]));
447+
ir.inline(move |gen, _, labels| gen.gen_shl_rhs_imm(rhs, &labels[deopt]));
448448
} else if let Some(lhs) = bb.is_fixnum_literal(recv) {
449449
bb.fetch_fixnum(ir, args, GP::Rcx, deopt);
450-
ir.inline(move |gen, _, labels| gen.gen_shl_lhs_imm(lhs, labels[deopt]));
450+
ir.inline(move |gen, _, labels| gen.gen_shl_lhs_imm(lhs, &labels[deopt]));
451451
} else {
452452
bb.fetch_fixnum(ir, args, GP::Rcx, deopt);
453-
ir.inline(move |gen, _, labels| gen.gen_shl(labels[deopt]));
453+
ir.inline(move |gen, _, labels| gen.gen_shl(&labels[deopt]));
454454
}
455455
bb.reg2acc_fixnum(ir, GP::Rdi, dst);
456456
true

monoruby/src/builtins/object.rs

+46-4
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,15 @@ pub(super) fn init(globals: &mut Globals) {
2222
Box::new(object_object_id),
2323
0,
2424
);
25-
globals.define_builtin_func_with(OBJECT_CLASS, "respond_to?", respond_to, 1, 2, false);
25+
globals.define_builtin_inline_func_with(
26+
OBJECT_CLASS,
27+
"respond_to?",
28+
respond_to,
29+
Box::new(object_respond_to),
30+
1,
31+
2,
32+
false,
33+
);
2634
globals.define_builtin_func(OBJECT_CLASS, "singleton_class", singleton_class, 0);
2735
globals.define_builtin_func(OBJECT_CLASS, "to_s", to_s, 0);
2836
globals.define_builtin_func(OBJECT_CLASS, "inspect", inspect, 0);
@@ -134,11 +142,11 @@ pub fn object_send(
134142
bb.write_back_callargs_and_dst(ir, callsite);
135143
bb.writeback_acc(ir);
136144
let using_xmm = bb.get_using_xmm();
137-
let error = bb.new_error(ir);
145+
let error = ir.new_error(bb);
138146
let callid = callsite.id;
139147
ir.inline(move |gen, store, labels| {
140-
let error = labels[error];
141-
gen.object_send_inline(callid, store, using_xmm, error, no_splat);
148+
let error = &labels[error];
149+
gen.object_send_inline(callid, store, using_xmm, &error, no_splat);
142150
});
143151
bb.reg2acc(ir, GP::Rax, callsite.dst);
144152
true
@@ -273,6 +281,40 @@ fn respond_to(_vm: &mut Executor, globals: &mut Globals, lfp: Lfp) -> Result<Val
273281
}))
274282
}
275283

284+
fn object_respond_to(
285+
bb: &mut BBContext,
286+
_: &mut AsmIr,
287+
ctx: &JitContext,
288+
store: &Store,
289+
callsite: &CallSiteInfo,
290+
recv_class: ClassId,
291+
) -> bool {
292+
if !callsite.is_simple() {
293+
return false;
294+
}
295+
let CallSiteInfo {
296+
dst, args, pos_num, ..
297+
} = *callsite;
298+
let dst = if let Some(dst) = dst {
299+
dst
300+
} else {
301+
return false;
302+
};
303+
if pos_num != 1 {
304+
return false;
305+
}
306+
let method_name = if let Some(name) = bb.is_symbol_literal(args) {
307+
name
308+
} else {
309+
return false;
310+
};
311+
let b = store
312+
.check_method_for_class(recv_class, method_name, ctx.class_version())
313+
.is_some();
314+
bb.def_concrete_value(dst, Value::bool(b));
315+
true
316+
}
317+
276318
///
277319
/// ### Object#inspect
278320
///

monoruby/src/bytecode.rs

+9-14
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ impl Bc2 {
180180
///
181181
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
182182
#[repr(transparent)]
183-
struct BytecodePtrBase(std::ptr::NonNull<Bytecode>);
183+
pub(crate) struct BytecodePtrBase(std::ptr::NonNull<Bytecode>);
184184

185185
impl std::ops::Add<usize> for BytecodePtrBase {
186186
type Output = BytecodePtr;
@@ -199,7 +199,11 @@ impl std::ops::Add<BcIndex> for BytecodePtrBase {
199199
}
200200

201201
impl BytecodePtrBase {
202-
fn as_ptr(&self) -> *mut Bytecode {
202+
pub fn from_bc(bc: &Bytecode) -> Self {
203+
Self(std::ptr::NonNull::from(bc))
204+
}
205+
206+
pub fn as_ptr(&self) -> *mut Bytecode {
203207
self.0.as_ptr()
204208
}
205209
}
@@ -212,20 +216,11 @@ impl BytecodePtrBase {
212216
pub(crate) struct BytecodePtr(std::ptr::NonNull<Bytecode>);
213217

214218
impl std::ops::Sub<BytecodePtrBase> for BytecodePtr {
215-
type Output = usize;
216-
fn sub(self, rhs: BytecodePtrBase) -> usize {
217-
let offset = unsafe { self.as_ptr().offset_from(rhs.as_ptr()) };
218-
assert!(offset >= 0, "self:{:?} rhs:{:?}", self, rhs);
219-
offset as usize
220-
}
221-
}
222-
223-
impl std::ops::Sub<BytecodePtr> for BytecodePtr {
224-
type Output = usize;
225-
fn sub(self, rhs: BytecodePtr) -> usize {
219+
type Output = BcIndex;
220+
fn sub(self, rhs: BytecodePtrBase) -> BcIndex {
226221
let offset = unsafe { self.as_ptr().offset_from(rhs.as_ptr()) };
227222
assert!(offset >= 0, "self:{:?} rhs:{:?}", self, rhs);
228-
offset as usize
223+
BcIndex(offset as u32)
229224
}
230225
}
231226

monoruby/src/bytecodegen/encode.rs

+4-8
Original file line numberDiff line numberDiff line change
@@ -74,10 +74,10 @@ impl BytecodeGen {
7474
if rescue.is_none() && ensure.is_none() {
7575
continue;
7676
}
77-
let start = self.get_pc(info, range.start);
78-
let end = self.get_pc(info, range.end);
79-
let rescue = rescue.map(|l| self.get_pc(info, l));
80-
let ensure = ensure.map(|l| self.get_pc(info, l));
77+
let start = self[range.start];
78+
let end = self[range.end];
79+
let rescue = rescue.map(|l| self[l]);
80+
let ensure = ensure.map(|l| self[l]);
8181
let err_reg = err_reg.map(|reg| self.slot_id(&reg));
8282
info.exception_push(start..end, rescue, ensure, err_reg);
8383
}
@@ -93,10 +93,6 @@ impl BytecodeGen {
9393
Ok(())
9494
}
9595

96-
fn get_pc(&self, info: &ISeqInfo, label: Label) -> BytecodePtr {
97-
info.get_pc(self[label])
98-
}
99-
10096
fn ir_to_bc(&mut self, store: &mut Store) -> Result<(Vec<Bytecode>, Vec<Loc>, BasicBlockInfo)> {
10197
let mut ops = vec![];
10298
let mut sourcemap = vec![];

0 commit comments

Comments
 (0)