summaryrefslogtreecommitdiff
path: root/zjit/src/hir.rs
diff options
context:
space:
mode:
-rw-r--r--zjit/src/hir.rs39
1 files changed, 36 insertions, 3 deletions
@@ -4,7 +4,7 @@
use crate::{
cruby::*,
get_option,
- options::DumpHIR
};
use std::collections::{HashMap, HashSet};
@@ -77,6 +77,18 @@ pub struct CallInfo {
name: String,
}
#[derive(Debug, Clone)]
pub enum Insn {
PutSelf,
@@ -125,6 +137,17 @@ pub enum Insn {
// Control flow instructions
Return { val: InsnId },
}
#[derive(Default, Debug)]
@@ -515,6 +538,7 @@ pub fn iseq_to_hir(iseq: *const rb_iseq_t) -> Result<Function, ParseError> {
let mut visited = HashSet::new();
let iseq_size = unsafe { get_iseq_encoded_size(iseq) };
while let Some((incoming_state, block, mut insn_idx)) = queue.pop_front() {
if visited.contains(&block) { continue; }
visited.insert(block);
@@ -657,10 +681,19 @@ pub fn iseq_to_hir(iseq: *const rb_iseq_t) -> Result<Function, ParseError> {
state.setn(n, top);
}
- YARVINSN_opt_plus => {
let right = state.pop()?;
let left = state.pop()?;
- state.push(fun.push_insn(block, Insn::Send { self_val: left, call_info: CallInfo { name: "+".into() }, args: vec![right] }));
}
YARVINSN_opt_div => {
let right = state.pop()?;