Skip to content

Commit ff7a66f

Browse files
committed
Turn contants to PyStrInterned
1 parent 962d89d commit ff7a66f

File tree

6 files changed

+46
-51
lines changed

6 files changed

+46
-51
lines changed

vm/src/builtins/code.rs

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use super::{PyStrRef, PyTupleRef, PyTypeRef};
66
use crate::{
7+
builtins::PyStrStatic,
78
bytecode::{self, BorrowedConstant, Constant, ConstantBag},
89
class::{PyClassImpl, StaticType},
910
convert::ToPyObject,
@@ -63,7 +64,7 @@ fn borrow_obj_constant(obj: &PyObject) -> BorrowedConstant<Literal> {
6364
}
6465

6566
impl Constant for Literal {
66-
type Name = PyStrRef;
67+
type Name = &'static PyStrStatic;
6768
fn borrow_constant(&self) -> BorrowedConstant<Self> {
6869
borrow_obj_constant(&self.0)
6970
}
@@ -103,8 +104,8 @@ impl ConstantBag for PyObjBag<'_> {
103104
Literal(obj)
104105
}
105106

106-
fn make_name(&self, name: &str) -> PyStrRef {
107-
self.0.intern_str(name).to_owned()
107+
fn make_name(&self, name: &str) -> &'static PyStrStatic {
108+
self.0.intern_str(name)
108109
}
109110
}
110111

@@ -190,7 +191,7 @@ impl PyRef<PyCode> {
190191

191192
#[pyproperty]
192193
fn co_filename(self) -> PyStrRef {
193-
self.code.source_path.clone()
194+
self.code.source_path.to_owned()
194195
}
195196

196197
#[pyproperty]
@@ -211,7 +212,7 @@ impl PyRef<PyCode> {
211212

212213
#[pyproperty]
213214
fn co_name(self) -> PyStrRef {
214-
self.code.obj_name.clone()
215+
self.code.obj_name.to_owned()
215216
}
216217

217218
#[pyproperty]
@@ -221,12 +222,7 @@ impl PyRef<PyCode> {
221222

222223
#[pyproperty]
223224
pub fn co_varnames(self, vm: &VirtualMachine) -> PyTupleRef {
224-
let varnames = self
225-
.code
226-
.varnames
227-
.iter()
228-
.map(|s| s.clone().into())
229-
.collect();
225+
let varnames = self.code.varnames.iter().map(|s| s.to_object()).collect();
230226
vm.ctx.new_tuple(varnames)
231227
}
232228
}

vm/src/builtins/function.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ impl PyFunction {
4242
defaults: Option<PyTupleRef>,
4343
kw_only_defaults: Option<PyDictRef>,
4444
) -> Self {
45-
let name = PyMutex::new(code.obj_name.clone());
45+
let name = PyMutex::new(code.obj_name.to_owned());
4646
PyFunction {
4747
code,
4848
globals,

vm/src/builtins/function/jitfunc.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use crate::{
2-
builtins::{bool_, float, int, PyBaseExceptionRef, PyDictRef, PyFunction, PyStrRef},
2+
builtins::{bool_, float, int, PyBaseExceptionRef, PyDictRef, PyFunction, PyStrStatic},
33
bytecode::CodeFlags,
44
convert::ToPyObject,
55
function::FuncArgs,
@@ -153,7 +153,7 @@ pub(crate) fn get_jit_args<'a>(
153153
// Handle keyword arguments
154154
for (name, value) in &func_args.kwargs {
155155
let arg_pos =
156-
|args: &[PyStrRef], name: &str| args.iter().position(|arg| arg.as_str() == name);
156+
|args: &[&PyStrStatic], name: &str| args.iter().position(|arg| arg.as_str() == name);
157157
if let Some(arg_idx) = arg_pos(arg_names.args, name) {
158158
if jit_args.is_set(arg_idx) {
159159
return Err(ArgsError::ArgPassedMultipleTimes);

vm/src/frame.rs

Lines changed: 33 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use crate::{
55
function::{PyCell, PyCellRef, PyFunction},
66
tuple::{PyTuple, PyTupleTyped},
77
PyBaseExceptionRef, PyCode, PyCoroutine, PyDict, PyDictRef, PyGenerator, PyListRef, PySet,
8-
PySlice, PyStr, PyStrRef, PyTraceback, PyTypeRef,
8+
PySlice, PyStr, PyStrRef, PyStrStatic, PyTraceback, PyTypeRef,
99
},
1010
bytecode,
1111
convert::{IntoObject, ToPyResult},
@@ -187,7 +187,7 @@ impl FrameRef {
187187
let j = std::cmp::min(map.len(), code.varnames.len());
188188
if !code.varnames.is_empty() {
189189
let fastlocals = self.fastlocals.lock();
190-
for (k, v) in itertools::zip(&map[..j], &**fastlocals) {
190+
for (&k, v) in itertools::zip(&map[..j], &**fastlocals) {
191191
match locals.mapping().ass_subscript(k, v.clone(), vm) {
192192
Ok(()) => {}
193193
Err(e) if e.fast_isinstance(&vm.ctx.exceptions.key_error) => {}
@@ -196,8 +196,8 @@ impl FrameRef {
196196
}
197197
}
198198
if !code.cellvars.is_empty() || !code.freevars.is_empty() {
199-
let map_to_dict = |keys: &[PyStrRef], values: &[PyCellRef]| {
200-
for (k, v) in itertools::zip(keys, values) {
199+
let map_to_dict = |keys: &[&PyStrStatic], values: &[PyCellRef]| {
200+
for (&k, v) in itertools::zip(keys, values) {
201201
if let Some(value) = v.get() {
202202
locals.mapping().ass_subscript(k, Some(value), vm)?;
203203
} else {
@@ -424,19 +424,19 @@ impl ExecutingFrame<'_> {
424424
}
425425

426426
fn unbound_cell_exception(&self, i: usize, vm: &VirtualMachine) -> PyBaseExceptionRef {
427-
if let Some(name) = self.code.cellvars.get(i) {
427+
if let Some(&name) = self.code.cellvars.get(i) {
428428
vm.new_exception_msg(
429429
vm.ctx.exceptions.unbound_local_error.clone(),
430430
format!("local variable '{}' referenced before assignment", name),
431431
)
432432
} else {
433-
let name = &self.code.freevars[i - self.code.cellvars.len()];
433+
let name = self.code.freevars[i - self.code.cellvars.len()];
434434
vm.new_name_error(
435435
format!(
436436
"free variable '{}' referenced before assignment in enclosing scope",
437437
name
438438
),
439-
name,
439+
name.to_owned(),
440440
)
441441
}
442442
}
@@ -471,7 +471,7 @@ impl ExecutingFrame<'_> {
471471
Ok(None)
472472
}
473473
bytecode::Instruction::ImportName { idx } => {
474-
self.import(vm, Some(self.code.names[*idx as usize].clone()))
474+
self.import(vm, Some(self.code.names[*idx as usize].to_owned()))
475475
}
476476
bytecode::Instruction::ImportNameless => self.import(vm, None),
477477
bytecode::Instruction::ImportStar => self.import_star(vm),
@@ -495,7 +495,7 @@ impl ExecutingFrame<'_> {
495495
Ok(None)
496496
}
497497
bytecode::Instruction::LoadNameAny(idx) => {
498-
let name = &self.code.names[*idx as usize];
498+
let name = self.code.names[*idx as usize];
499499
let value = self.locals.mapping().subscript(name, vm).ok();
500500
self.push_value(match value {
501501
Some(x) => x,
@@ -519,8 +519,8 @@ impl ExecutingFrame<'_> {
519519
}
520520
bytecode::Instruction::LoadClassDeref(i) => {
521521
let i = *i as usize;
522-
let name = self.code.freevars[i - self.code.cellvars.len()].clone();
523-
let value = self.locals.mapping().subscript(&name, vm).ok();
522+
let name = self.code.freevars[i - self.code.cellvars.len()];
523+
let value = self.locals.mapping().subscript(name, vm).ok();
524524
self.push_value(match value {
525525
Some(v) => v,
526526
None => self.cells_frees[i]
@@ -535,15 +535,15 @@ impl ExecutingFrame<'_> {
535535
Ok(None)
536536
}
537537
bytecode::Instruction::StoreLocal(idx) => {
538-
let name = &self.code.names[*idx as usize];
538+
let name = self.code.names[*idx as usize];
539539
let value = self.pop_value();
540540
self.locals.mapping().ass_subscript(name, Some(value), vm)?;
541541
Ok(None)
542542
}
543543
bytecode::Instruction::StoreGlobal(idx) => {
544544
let value = self.pop_value();
545545
self.globals
546-
.set_item(&*self.code.names[*idx as usize].clone(), value, vm)?;
546+
.set_item(self.code.names[*idx as usize], value, vm)?;
547547
Ok(None)
548548
}
549549
bytecode::Instruction::StoreDeref(i) => {
@@ -556,28 +556,30 @@ impl ExecutingFrame<'_> {
556556
Ok(None)
557557
}
558558
bytecode::Instruction::DeleteLocal(idx) => {
559-
let name = &self.code.names[*idx as usize];
559+
let name = self.code.names[*idx as usize];
560560
let res = self.locals.mapping().ass_subscript(name, None, vm);
561561

562562
match res {
563563
Ok(()) => {}
564564
Err(e) if e.fast_isinstance(&vm.ctx.exceptions.key_error) => {
565-
return Err(
566-
vm.new_name_error(format!("name '{}' is not defined", name), name)
567-
)
565+
return Err(vm.new_name_error(
566+
format!("name '{}' is not defined", name),
567+
name.to_owned(),
568+
))
568569
}
569570
Err(e) => return Err(e),
570571
}
571572
Ok(None)
572573
}
573574
bytecode::Instruction::DeleteGlobal(idx) => {
574-
let name = &self.code.names[*idx as usize];
575-
match self.globals.del_item(&**name, vm) {
575+
let name = self.code.names[*idx as usize];
576+
match self.globals.del_item(name, vm) {
576577
Ok(()) => {}
577578
Err(e) if e.fast_isinstance(&vm.ctx.exceptions.key_error) => {
578-
return Err(
579-
vm.new_name_error(format!("name '{}' is not defined", name), name)
580-
)
579+
return Err(vm.new_name_error(
580+
format!("name '{}' is not defined", name),
581+
name.to_owned(),
582+
))
581583
}
582584
Err(e) => return Err(e),
583585
}
@@ -938,8 +940,8 @@ impl ExecutingFrame<'_> {
938940
}
939941
bytecode::Instruction::LoadMethod { idx } => {
940942
let obj = self.pop_value();
941-
let method_name = self.code.names[*idx as usize].clone();
942-
let method = PyMethod::get(obj, method_name, vm)?;
943+
let method_name = self.code.names[*idx as usize];
944+
let method = PyMethod::get(obj, method_name.to_owned(), vm)?;
943945
let (target, is_method, func) = match method {
944946
PyMethod::Function { target, func } => (target, true, func),
945947
PyMethod::Attribute(val) => (vm.ctx.none(), false, val),
@@ -1106,7 +1108,7 @@ impl ExecutingFrame<'_> {
11061108
self.globals
11071109
.get_chain(self.builtins, name, vm)?
11081110
.ok_or_else(|| {
1109-
vm.new_name_error(format!("name '{}' is not defined", name), &name.to_owned())
1111+
vm.new_name_error(format!("name '{}' is not defined", name), name.to_owned())
11101112
})
11111113
}
11121114

@@ -1145,10 +1147,10 @@ impl ExecutingFrame<'_> {
11451147
#[cfg_attr(feature = "flame-it", flame("Frame"))]
11461148
fn import_from(&mut self, vm: &VirtualMachine, idx: bytecode::NameIdx) -> PyResult {
11471149
let module = self.last_value();
1148-
let name = &self.code.names[idx as usize];
1149-
let err = || vm.new_import_error(format!("cannot import name '{}'", name), name.clone());
1150+
let name = self.code.names[idx as usize];
1151+
let err = || vm.new_import_error(format!("cannot import name '{}'", name), name);
11501152
// Load attribute, and transform any error into import error.
1151-
if let Some(obj) = vm.get_attribute_opt(module.clone(), name.clone())? {
1153+
if let Some(obj) = vm.get_attribute_opt(module.clone(), name)? {
11521154
return Ok(obj);
11531155
}
11541156
// fallback to importing '{module.__name__}.{name}' from sys.modules
@@ -1743,23 +1745,23 @@ impl ExecutingFrame<'_> {
17431745
}
17441746

17451747
fn load_attr(&mut self, vm: &VirtualMachine, attr: bytecode::NameIdx) -> FrameResult {
1746-
let attr_name = self.code.names[attr as usize].clone();
1748+
let attr_name = self.code.names[attr as usize];
17471749
let parent = self.pop_value();
17481750
let obj = parent.get_attr(attr_name, vm)?;
17491751
self.push_value(obj);
17501752
Ok(None)
17511753
}
17521754

17531755
fn store_attr(&mut self, vm: &VirtualMachine, attr: bytecode::NameIdx) -> FrameResult {
1754-
let attr_name = self.code.names[attr as usize].clone();
1756+
let attr_name = self.code.names[attr as usize];
17551757
let parent = self.pop_value();
17561758
let value = self.pop_value();
17571759
parent.set_attr(attr_name, value, vm)?;
17581760
Ok(None)
17591761
}
17601762

17611763
fn delete_attr(&mut self, vm: &VirtualMachine, attr: bytecode::NameIdx) -> FrameResult {
1762-
let attr_name = self.code.names[attr as usize].clone();
1764+
let attr_name = self.code.names[attr as usize];
17631765
let parent = self.pop_value();
17641766
parent.del_attr(attr_name, vm)?;
17651767
Ok(None)

vm/src/import.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ pub fn import_codeobj(
142142
if set_file_attr {
143143
attrs.set_item(
144144
identifier!(vm, __file__),
145-
code_obj.source_path.clone().into(),
145+
code_obj.source_path.to_object(),
146146
vm,
147147
)?;
148148
}

vm/src/vm/vm_new.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -97,13 +97,10 @@ impl VirtualMachine {
9797
self.new_exception_msg(type_error, msg)
9898
}
9999

100-
pub fn new_name_error(&self, msg: String, name: &PyStrRef) -> PyBaseExceptionRef {
100+
pub fn new_name_error(&self, msg: String, name: PyStrRef) -> PyBaseExceptionRef {
101101
let name_error_type = self.ctx.exceptions.name_error.clone();
102102
let name_error = self.new_exception_msg(name_error_type, msg);
103-
name_error
104-
.as_object()
105-
.set_attr("name", name.clone(), self)
106-
.unwrap();
103+
name_error.as_object().set_attr("name", name, self).unwrap();
107104
name_error
108105
}
109106

0 commit comments

Comments
 (0)