Skip to content

Commit 9a297aa

Browse files
authored
Newtype var_nums oparg (#7431)
1 parent 005860c commit 9a297aa

File tree

4 files changed

+44
-46
lines changed

4 files changed

+44
-46
lines changed

crates/compiler-core/src/bytecode/instruction.rs

Lines changed: 15 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use crate::{
77
self, BinaryOperator, BuildSliceArgCount, CommonConstant, ComparisonOperator,
88
ConvertValueOparg, IntrinsicFunction1, IntrinsicFunction2, Invert, Label, LoadAttr,
99
LoadSuperAttr, MakeFunctionFlag, NameIdx, OpArg, OpArgByte, OpArgType, RaiseKind,
10-
SpecialMethod, StoreFastLoadFast, UnpackExArgs,
10+
SpecialMethod, UnpackExArgs,
1111
},
1212
},
1313
marshal::MarshalError,
@@ -201,13 +201,13 @@ pub enum Instruction {
201201
var_num: Arg<oparg::VarNum>,
202202
} = 86,
203203
LoadFastBorrowLoadFastBorrow {
204-
var_nums: Arg<u32>,
204+
var_nums: Arg<oparg::VarNums>,
205205
} = 87,
206206
LoadFastCheck {
207207
var_num: Arg<oparg::VarNum>,
208208
} = 88,
209209
LoadFastLoadFast {
210-
var_nums: Arg<u32>,
210+
var_nums: Arg<oparg::VarNums>,
211211
} = 89,
212212
LoadFromDictOrDeref {
213213
i: Arg<NameIdx>,
@@ -279,10 +279,10 @@ pub enum Instruction {
279279
var_num: Arg<oparg::VarNum>,
280280
} = 112,
281281
StoreFastLoadFast {
282-
var_nums: Arg<StoreFastLoadFast>,
282+
var_nums: Arg<oparg::VarNums>,
283283
} = 113,
284284
StoreFastStoreFast {
285-
var_nums: Arg<u32>,
285+
var_nums: Arg<oparg::VarNums>,
286286
} = 114,
287287
StoreGlobal {
288288
namei: Arg<NameIdx>,
@@ -1224,18 +1224,16 @@ impl InstructionMetadata for Instruction {
12241224
Self::LoadFastCheck { var_num } => w!(LOAD_FAST_CHECK, varname = var_num),
12251225
Self::LoadFastLoadFast { var_nums } => {
12261226
let oparg = var_nums.get(arg);
1227-
let idx1 = oparg >> 4;
1228-
let idx2 = oparg & 15;
1229-
let name1 = varname(idx1.into());
1230-
let name2 = varname(idx2.into());
1227+
let (idx1, idx2) = oparg.indexes();
1228+
let name1 = varname(idx1);
1229+
let name2 = varname(idx2);
12311230
write!(f, "{:pad$}({}, {})", "LOAD_FAST_LOAD_FAST", name1, name2)
12321231
}
12331232
Self::LoadFastBorrowLoadFastBorrow { var_nums } => {
12341233
let oparg = var_nums.get(arg);
1235-
let idx1 = oparg >> 4;
1236-
let idx2 = oparg & 15;
1237-
let name1 = varname(idx1.into());
1238-
let name2 = varname(idx2.into());
1234+
let (idx1, idx2) = oparg.indexes();
1235+
let name1 = varname(idx1);
1236+
let name2 = varname(idx2);
12391237
write!(
12401238
f,
12411239
"{:pad$}({}, {})",
@@ -1349,21 +1347,19 @@ impl InstructionMetadata for Instruction {
13491347
Self::StoreFast { var_num } => w!(STORE_FAST, varname = var_num),
13501348
Self::StoreFastLoadFast { var_nums } => {
13511349
let oparg = var_nums.get(arg);
1352-
let store_idx = oparg.store_idx();
1353-
let load_idx = oparg.load_idx();
1350+
let (store_idx, load_idx) = oparg.indexes();
13541351
write!(f, "STORE_FAST_LOAD_FAST")?;
13551352
write!(f, " ({}, {})", store_idx, load_idx)
13561353
}
13571354
Self::StoreFastStoreFast { var_nums } => {
13581355
let oparg = var_nums.get(arg);
1359-
let idx1 = oparg >> 4;
1360-
let idx2 = oparg & 15;
1356+
let (idx1, idx2) = oparg.indexes();
13611357
write!(
13621358
f,
13631359
"{:pad$}({}, {})",
13641360
"STORE_FAST_STORE_FAST",
1365-
varname(idx1.into()),
1366-
varname(idx2.into())
1361+
varname(idx1),
1362+
varname(idx2)
13671363
)
13681364
}
13691365
Self::StoreGlobal { namei } => w!(STORE_GLOBAL, name = namei),

crates/compiler-core/src/bytecode/oparg.rs

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -733,36 +733,41 @@ newtype_oparg!(
733733
newtype_oparg!(
734734
#[derive(Clone, Copy)]
735735
#[repr(transparent)]
736-
pub struct LoadAttr(u32)
736+
pub struct VarNums(u32)
737737
);
738738

739739
newtype_oparg!(
740740
#[derive(Clone, Copy)]
741741
#[repr(transparent)]
742-
pub struct LoadSuperAttr(u32)
742+
pub struct LoadAttr(u32)
743743
);
744744

745745
newtype_oparg!(
746-
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Ord, PartialOrd)]
746+
#[derive(Clone, Copy)]
747747
#[repr(transparent)]
748-
pub struct Label(u32)
748+
pub struct LoadSuperAttr(u32)
749749
);
750750

751751
newtype_oparg!(
752752
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Ord, PartialOrd)]
753753
#[repr(transparent)]
754-
pub struct StoreFastLoadFast(u32)
754+
pub struct Label(u32)
755755
);
756756

757-
impl StoreFastLoadFast {
757+
impl VarNums {
758+
#[must_use]
759+
pub const fn idx_1(self) -> VarNum {
760+
VarNum::new(self.0 >> 4)
761+
}
762+
758763
#[must_use]
759-
pub const fn store_idx(self) -> NameIdx {
760-
self.0 >> 4
764+
pub const fn idx_2(self) -> VarNum {
765+
VarNum::new(self.0 & 15)
761766
}
762767

763768
#[must_use]
764-
pub const fn load_idx(self) -> NameIdx {
765-
self.0 & 15
769+
pub const fn indexes(self) -> (VarNum, VarNum) {
770+
(self.idx_1(), self.idx_2())
766771
}
767772
}
768773

crates/jit/src/instructions.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -660,10 +660,9 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> {
660660
Instruction::LoadFastLoadFast { var_nums }
661661
| Instruction::LoadFastBorrowLoadFastBorrow { var_nums } => {
662662
let oparg = var_nums.get(arg);
663-
let idx1 = oparg >> 4;
664-
let idx2 = oparg & 0xF;
663+
let (idx1, idx2) = oparg.indexes();
665664
for idx in [idx1, idx2] {
666-
let local = self.variables[idx as usize]
665+
let local = self.variables[idx]
667666
.as_ref()
668667
.ok_or(JitCompileError::BadBytecode)?;
669668
self.stack.push(JitValue::from_type_and_value(

crates/vm/src/frame.rs

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2725,12 +2725,11 @@ impl ExecutingFrame<'_> {
27252725
self.push_value(x);
27262726
Ok(None)
27272727
}
2728-
Instruction::LoadFastLoadFast { var_nums: packed } => {
2728+
Instruction::LoadFastLoadFast { var_nums } => {
27292729
// Load two local variables at once
27302730
// oparg encoding: (idx1 << 4) | idx2
2731-
let oparg = packed.get(arg);
2732-
let idx1 = (oparg >> 4) as usize;
2733-
let idx2 = (oparg & 15) as usize;
2731+
let oparg = var_nums.get(arg);
2732+
let (idx1, idx2) = oparg.indexes();
27342733
let fastlocals = self.localsplus.fastlocals();
27352734
let x1 = fastlocals[idx1].clone().ok_or_else(|| {
27362735
vm.new_exception_msg(
@@ -2774,10 +2773,9 @@ impl ExecutingFrame<'_> {
27742773
self.push_value(x);
27752774
Ok(None)
27762775
}
2777-
Instruction::LoadFastBorrowLoadFastBorrow { var_nums: packed } => {
2778-
let oparg = packed.get(arg);
2779-
let idx1 = (oparg >> 4) as usize;
2780-
let idx2 = (oparg & 15) as usize;
2776+
Instruction::LoadFastBorrowLoadFastBorrow { var_nums } => {
2777+
let oparg = var_nums.get(arg);
2778+
let (idx1, idx2) = oparg.indexes();
27812779
let fastlocals = self.localsplus.fastlocals();
27822780
let x1 = fastlocals[idx1].clone().ok_or_else(|| {
27832781
vm.new_exception_msg(
@@ -3309,17 +3307,17 @@ impl ExecutingFrame<'_> {
33093307
let value = self.pop_value();
33103308
let locals = self.localsplus.fastlocals_mut();
33113309
let oparg = var_nums.get(arg);
3312-
locals[oparg.store_idx() as usize] = Some(value);
3313-
let load_value = locals[oparg.load_idx() as usize]
3310+
let (store_idx, load_idx) = oparg.indexes();
3311+
locals[store_idx] = Some(value);
3312+
let load_value = locals[load_idx]
33143313
.clone()
33153314
.expect("StoreFastLoadFast: load slot should have value after store");
33163315
self.push_value(load_value);
33173316
Ok(None)
33183317
}
3319-
Instruction::StoreFastStoreFast { var_nums: packed } => {
3320-
let oparg = packed.get(arg);
3321-
let idx1 = (oparg >> 4) as usize;
3322-
let idx2 = (oparg & 15) as usize;
3318+
Instruction::StoreFastStoreFast { var_nums } => {
3319+
let oparg = var_nums.get(arg);
3320+
let (idx1, idx2) = oparg.indexes();
33233321
let value1 = self.pop_value();
33243322
let value2 = self.pop_value();
33253323
let fastlocals = self.localsplus.fastlocals_mut();

0 commit comments

Comments
 (0)