Skip to content

Commit 0d505ad

Browse files
committed
use PyBytinner as arg
1 parent fd614b7 commit 0d505ad

File tree

2 files changed

+47
-79
lines changed

2 files changed

+47
-79
lines changed

vm/src/obj/objbyteinner.rs

Lines changed: 31 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -281,36 +281,35 @@ impl ByteInnerSplitOptions {
281281
#[derive(FromArgs)]
282282
pub struct ByteInnerExpandtabsOptions {
283283
#[pyarg(positional_or_keyword, optional = true)]
284-
tabsize: OptionalArg<PyObjectRef>,
284+
tabsize: OptionalArg<PyIntRef>,
285285
}
286286

287287
impl ByteInnerExpandtabsOptions {
288288
pub fn get_value(self) -> usize {
289-
if let OptionalArg::Present(value) = self.tabsize {
290-
if let Some(v) = objint::get_value(&value).to_usize() {
291-
v
292-
} else {
293-
0
294-
}
295-
} else {
296-
8
289+
match self.tabsize.into_option() {
290+
Some(int) => int.as_bigint().to_usize().unwrap_or(0),
291+
None => 8,
297292
}
298293
}
299294
}
300295

301296
#[derive(FromArgs)]
302297
pub struct ByteInnerSplitlinesOptions {
303298
#[pyarg(positional_or_keyword, optional = true)]
304-
keepends: OptionalArg<PyObjectRef>,
299+
keepends: OptionalArg<bool>,
305300
}
306301

307302
impl ByteInnerSplitlinesOptions {
308-
pub fn get_value(self, vm: &VirtualMachine) -> PyResult<bool> {
309-
if let OptionalArg::Present(value) = self.keepends {
310-
Ok(bool::try_from_object(vm, value)?)
311-
} else {
312-
Ok(false)
303+
pub fn get_value(self) -> bool {
304+
match self.keepends.into_option() {
305+
Some(x) => x,
306+
None => false,
313307
}
308+
// if let OptionalArg::Present(value) = self.keepends {
309+
// Ok(bool::try_from_object(vm, value)?)
310+
// } else {
311+
// Ok(false)
312+
// }
314313
}
315314
}
316315

@@ -836,24 +835,11 @@ impl PyByteInner {
836835
}
837836
}
838837

839-
pub fn partition(
840-
&self,
841-
sep: &PyObjectRef,
842-
reverse: bool,
843-
vm: &VirtualMachine,
844-
) -> PyResult<(Vec<u8>, Vec<u8>)> {
845-
let sep = match try_as_bytes_like(&sep) {
846-
Some(value) => value,
847-
None => {
848-
return Err(
849-
vm.new_type_error(format!("a bytes-like object is required, not {}", sep))
850-
);
851-
}
852-
};
838+
pub fn partition(&self, sep: &PyByteInner, reverse: bool) -> PyResult<(Vec<u8>, Vec<u8>)> {
853839
let splitted = if reverse {
854-
split_slice_reverse(&self.elements, &sep, 1)
840+
split_slice_reverse(&self.elements, &sep.elements, 1)
855841
} else {
856-
split_slice(&self.elements, &sep, 1)
842+
split_slice(&self.elements, &sep.elements, 1)
857843
};
858844
Ok((splitted[0].to_vec(), splitted[1].to_vec()))
859845
}
@@ -890,17 +876,13 @@ impl PyByteInner {
890876
res
891877
}
892878

893-
pub fn splitlines(
894-
&self,
895-
options: ByteInnerSplitlinesOptions,
896-
vm: &VirtualMachine,
897-
) -> PyResult<Vec<&[u8]>> {
898-
let keepends = options.get_value(vm)?;
879+
pub fn splitlines(&self, options: ByteInnerSplitlinesOptions) -> Vec<&[u8]> {
880+
let keepends = options.get_value();
899881

900882
let mut res = vec![];
901883

902884
if self.elements.is_empty() {
903-
return Ok(vec![]);
885+
return vec![];
904886
}
905887

906888
let mut prev_index = 0;
@@ -935,7 +917,7 @@ impl PyByteInner {
935917
}
936918
}
937919

938-
Ok(res)
920+
res
939921
}
940922

941923
pub fn zfill(&self, width: PyIntRef) -> Vec<u8> {
@@ -960,37 +942,16 @@ impl PyByteInner {
960942

961943
pub fn replace(
962944
&self,
963-
old: PyObjectRef,
964-
new: PyObjectRef,
945+
old: PyByteInner,
946+
new: PyByteInner,
965947
count: OptionalArg<PyIntRef>,
966-
vm: &VirtualMachine,
967948
) -> PyResult<Vec<u8>> {
968-
let old = match try_as_bytes_like(&old) {
969-
Some(value) => value,
970-
None => {
971-
return Err(
972-
vm.new_type_error(format!("a bytes-like object is required, not {}", old))
973-
);
974-
}
975-
};
976-
977-
let new = match try_as_bytes_like(&new) {
978-
Some(value) => value,
979-
None => {
980-
return Err(
981-
vm.new_type_error(format!("a bytes-like object is required, not {}", new))
982-
);
983-
}
984-
};
985-
986-
let count = if let OptionalArg::Present(int) = count {
987-
if let Some(value) = int.as_bigint().to_u32() {
988-
value
989-
} else {
990-
self.elements.len() as u32
991-
}
992-
} else {
993-
self.elements.len() as u32
949+
let count = match count.into_option() {
950+
Some(int) => int
951+
.as_bigint()
952+
.to_u32()
953+
.unwrap_or(self.elements.len() as u32),
954+
None => self.elements.len() as u32,
994955
};
995956

996957
let mut res = vec![];
@@ -1003,8 +964,8 @@ impl PyByteInner {
1003964
res.extend_from_slice(&slice[index..]);
1004965
break;
1005966
}
1006-
if &slice[index..index + old.len()] == old.as_slice() {
1007-
res.extend_from_slice(&new);
967+
if &slice[index..index + old.len()] == old.elements.as_slice() {
968+
res.extend_from_slice(&new.elements);
1008969
index += old.len();
1009970
done += 1;
1010971
} else {

vm/src/obj/objbytes.rs

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use crate::obj::objint::PyIntRef;
2+
23
use crate::obj::objslice::PySliceRef;
34
use crate::obj::objstr::PyStringRef;
45
use crate::obj::objtuple::PyTupleRef;
@@ -9,7 +10,9 @@ use core::cell::Cell;
910
use std::ops::Deref;
1011

1112
use crate::function::OptionalArg;
12-
use crate::pyobject::{PyClassImpl, PyContext, PyIterable, PyObjectRef, PyRef, PyResult, PyValue};
13+
use crate::pyobject::{
14+
PyClassImpl, PyContext, PyIterable, PyObjectRef, PyRef, PyResult, PyValue, TryFromObject,
15+
};
1316

1417
use super::objbyteinner::{
1518
ByteInnerExpandtabsOptions, ByteInnerFindOptions, ByteInnerNewOptions, ByteInnerPaddingOptions,
@@ -360,17 +363,21 @@ impl PyBytesRef {
360363
#[pymethod(name = "partition")]
361364
fn partition(self, sep: PyObjectRef, vm: &VirtualMachine) -> PyResult {
362365
// TODO: when implementing bytearray,remember sep ALWAYS converted to bytearray
363-
// even it's bytes or memoryview
364-
let (left, right) = self.inner.partition(&sep, false, vm)?;
366+
// even it's bytes or memoryview so PyByteInner wiil be ok for args
367+
let sepa = PyByteInner::try_from_object(vm, sep.clone())?;
368+
369+
let (left, right) = self.inner.partition(&sepa, false)?;
365370
Ok(vm
366371
.ctx
367372
.new_tuple(vec![vm.ctx.new_bytes(left), sep, vm.ctx.new_bytes(right)]))
368373
}
369374
#[pymethod(name = "rpartition")]
370375
fn rpartition(self, sep: PyObjectRef, vm: &VirtualMachine) -> PyResult {
371376
// TODO: when implementing bytearray,remember sep ALWAYS converted to bytearray
372-
// even it's bytes or memoryview
373-
let (left, right) = self.inner.partition(&sep, true, vm)?;
377+
// even it's bytes or memoryview so PyByteInner wiil be ok for args
378+
let sepa = PyByteInner::try_from_object(vm, sep.clone())?;
379+
380+
let (left, right) = self.inner.partition(&sepa, true)?;
374381
Ok(vm
375382
.ctx
376383
.new_tuple(vec![vm.ctx.new_bytes(left), sep, vm.ctx.new_bytes(right)]))
@@ -385,7 +392,7 @@ impl PyBytesRef {
385392
fn splitlines(self, options: ByteInnerSplitlinesOptions, vm: &VirtualMachine) -> PyResult {
386393
let as_bytes = self
387394
.inner
388-
.splitlines(options, vm)?
395+
.splitlines(options)
389396
.iter()
390397
.map(|x| vm.ctx.new_bytes(x.to_vec()))
391398
.collect::<Vec<PyObjectRef>>();
@@ -400,12 +407,12 @@ impl PyBytesRef {
400407
#[pymethod(name = "replace")]
401408
fn replace(
402409
self,
403-
old: PyObjectRef,
404-
new: PyObjectRef,
410+
old: PyByteInner,
411+
new: PyByteInner,
405412
count: OptionalArg<PyIntRef>,
406413
vm: &VirtualMachine,
407414
) -> PyResult {
408-
Ok(vm.ctx.new_bytes(self.inner.replace(old, new, count, vm)?))
415+
Ok(vm.ctx.new_bytes(self.inner.replace(old, new, count)?))
409416
}
410417
}
411418

0 commit comments

Comments
 (0)