earlier returning for error · RustPython/RustPython@bd3d4cf · GitHub
Skip to content

Commit bd3d4cf

Browse files
committed
earlier returning for error
1 parent a4a0243 commit bd3d4cf

26 files changed

Lines changed: 274 additions & 360 deletions

vm/src/builtins.rs

Lines changed: 4 additions & 5 deletions

vm/src/bytesinner.rs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -127,13 +127,10 @@ impl ByteInnerNewOptions {
127127
let mut data_bytes = vec![];
128128
for elem in elements {
129129
let v = objint::to_int(vm, &elem)?;
130-
if let Some(i) = v.to_u8() {
131-
data_bytes.push(i);
132-
} else {
133-
return Err(
134-
vm.new_value_error("bytes must be in range(0, 256)".to_owned())
135-
);
136-
}
130+
let i = v.to_u8().ok_or_else(|| {
131+
vm.new_value_error("bytes must be in range(0, 256)".to_owned())
132+
})?;
133+
data_bytes.push(i);
137134
}
138135
Ok(data_bytes)
139136
}

vm/src/cformat.rs

Lines changed: 33 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -254,40 +254,41 @@ impl CFormatSpec {
254254
_ => 6,
255255
};
256256
let magnitude = num.abs();
257-
format!("{:.*}", precision, magnitude)
257+
Ok(format!("{:.*}", precision, magnitude))
258258
}
259259
CFormatType::Float(CFloatType::Exponent(_)) => {
260-
return Err("Not yet implemented for %e and %E".to_owned())
260+
Err("Not yet implemented for %e and %E".to_owned())
261261
}
262262
CFormatType::Float(CFloatType::General(_)) => {
263-
return Err("Not yet implemented for %g and %G".to_owned())
263+
Err("Not yet implemented for %g and %G".to_owned())
264264
}
265265
_ => unreachable!(),
266-
};
266+
}?;
267267

268-
if self.flags.contains(CConversionFlags::ZERO_PAD) {
268+
let formatted = if self.flags.contains(CConversionFlags::ZERO_PAD) {
269269
let fill_char = if !self.flags.contains(CConversionFlags::LEFT_ADJUST) {
270270
'0'
271271
} else {
272272
' '
273273
};
274-
Ok(format!(
274+
format!(
275275
"{}{}",
276276
sign_string,
277277
self.fill_string(
278278
magnitude_string,
279279
fill_char,
280280
Some(sign_string.chars().count())
281281
)
282-
))
282+
)
283283
} else {
284-
Ok(self.fill_string(format!("{}{}", sign_string, magnitude_string), ' ', None))
285-
}
284+
self.fill_string(format!("{}{}", sign_string, magnitude_string), ' ', None)
285+
};
286+
Ok(formatted)
286287
}
287288

288289
fn format(&self, vm: &VirtualMachine, obj: PyObjectRef) -> PyResult<String> {
289290
// do the formatting by type
290-
match &self.format_type {
291+
let formatted = match &self.format_type {
291292
CFormatType::String(preconversor) => {
292293
let result = match preconversor {
293294
CFormatPreconversor::Str => vm.to_str(&obj)?,
@@ -296,7 +297,7 @@ impl CFormatSpec {
296297
TryFromObject::try_from_object(vm, vm.call_method(&obj, "decode", vec![])?)?
297298
}
298299
};
299-
Ok(self.format_string(result.borrow_value().to_owned()))
300+
self.format_string(result.borrow_value().to_owned())
300301
}
301302
CFormatType::Number(number_type) => {
302303
if !objtype::isinstance(&obj, &vm.ctx.types.int_type) {
@@ -311,20 +312,19 @@ impl CFormatSpec {
311312
obj.lease_class()
312313
)));
313314
}
314-
Ok(self.format_number(objint::get_value(&obj)))
315+
self.format_number(objint::get_value(&obj))
315316
}
316-
CFormatType::Float(_) => if let Some(value) = objfloat::try_float(&obj, vm)? {
317+
CFormatType::Float(_) => {
318+
let value = objfloat::try_float(&obj, vm)?.ok_or_else(|| {
319+
vm.new_type_error(format!(
320+
"%{} format: an floating point or integer is required, not {}",
321+
self.format_char,
322+
obj.lease_class().name
323+
))
324+
})?;
317325
self.format_float(value)
318-
} else {
319-
let required_type_string = "an floating point or integer";
320-
return Err(vm.new_type_error(format!(
321-
"%{} format: {} is required, not {}",
322-
self.format_char,
323-
required_type_string,
324-
obj.lease_class()
325-
)));
326+
.map_err(|e| vm.new_not_implemented_error(e))?
326327
}
327-
.map_err(|e| vm.new_not_implemented_error(e)),
328328
CFormatType::Character => {
329329
let ch = {
330330
if objtype::isinstance(&obj, &vm.ctx.types.int_type) {
@@ -348,9 +348,10 @@ impl CFormatSpec {
348348
Err(vm.new_type_error("%c requires int or char".to_owned()))
349349
}
350350
}?;
351-
Ok(self.format_char(ch))
351+
self.format_char(ch)
352352
}
353-
}
353+
};
354+
Ok(formatted)
354355
}
355356
}
356357

@@ -601,11 +602,11 @@ fn parse_literal(text: &str) -> Result<(CFormatPart, &str, usize), ParsingError>
601602
cur_text = remaining;
602603
}
603604
Err(err) => {
604-
if !result_string.is_empty() {
605-
return Ok((CFormatPart::Literal(result_string), cur_text, consumed));
605+
return if !result_string.is_empty() {
606+
Ok((CFormatPart::Literal(result_string), cur_text, consumed))
606607
} else {
607-
return Err((err, consumed));
608-
}
608+
Err((err, consumed))
609+
};
609610
}
610611
}
611612
}
@@ -621,23 +622,19 @@ fn parse_text_inside_parentheses(text: &str) -> Option<(String, &str)> {
621622
let mut chars = text.chars();
622623
let mut contained_text = String::new();
623624
while counter > 0 {
624-
let c = chars.next();
625-
625+
let c = chars.next()?;
626626
match c {
627-
Some('(') => {
627+
'(' => {
628628
counter += 1;
629629
}
630-
Some(')') => {
630+
')' => {
631631
counter -= 1;
632632
}
633-
None => {
634-
return None;
635-
}
636633
_ => (),
637634
}
638635

639636
if counter > 0 {
640-
contained_text.push(c.unwrap());
637+
contained_text.push(c);
641638
}
642639
}
643640

vm/src/format.rs

Lines changed: 19 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,7 @@ impl FormatPreconversor {
3535
return None;
3636
}
3737

38-
match chars.next() {
39-
None => None, // Should fail instead?
40-
Some(c) => FormatPreconversor::from_char(c),
41-
}
38+
FormatPreconversor::from_char(chars.next()?)
4239
}
4340

4441
fn parse_and_consume(text: &str) -> (Option<FormatPreconversor>, &str) {
@@ -686,14 +683,15 @@ impl FormatString {
686683
let mut chars = text.chars();
687684
// This should never be called with an empty str
688685
let first_char = chars.next().unwrap();
686+
// isn't this detectable only with bytes operation?
689687
if first_char == '{' || first_char == '}' {
690688
let maybe_next_char = chars.next();
691689
// if we see a bracket, it has to be escaped by doubling up to be in a literal
692-
if maybe_next_char.is_none() || maybe_next_char.unwrap() != first_char {
693-
return Err(FormatParseError::UnescapedStartBracketInLiteral);
690+
return if maybe_next_char.is_none() || maybe_next_char.unwrap() != first_char {
691+
Err(FormatParseError::UnescapedStartBracketInLiteral)
694692
} else {
695-
return Ok((first_char, chars.as_str()));
696-
}
693+
Ok((first_char, chars.as_str()))
694+
};
697695
}
698696
Ok((first_char, chars.as_str()))
699697
}
@@ -708,11 +706,11 @@ impl FormatString {
708706
cur_text = remaining;
709707
}
710708
Err(err) => {
711-
if !result_string.is_empty() {
712-
return Ok((FormatPart::Literal(result_string), cur_text));
709+
return if !result_string.is_empty() {
710+
Ok((FormatPart::Literal(result_string), cur_text))
713711
} else {
714-
return Err(err);
715-
}
712+
Err(err)
713+
};
716714
}
717715
}
718716
}
@@ -735,20 +733,16 @@ impl FormatString {
735733
// before the bang is a keyword or arg index, after the comma is maybe a conversor spec.
736734
let arg_part = parts[0];
737735

738-
let preconversion_spec = if let Some(conversion) = parts.get(1) {
739-
let mut chars = conversion.chars();
740-
if let Some(ch) = chars.next() {
736+
let preconversion_spec = parts
737+
.get(1)
738+
.map(|conversion| {
741739
// conversions are only every one character
742-
if chars.next().is_some() {
743-
return Err(FormatParseError::UnknownConversion);
744-
}
745-
Some(ch)
746-
} else {
747-
return Err(FormatParseError::UnknownConversion);
748-
}
749-
} else {
750-
None
751-
};
740+
conversion
741+
.chars()
742+
.exactly_one()
743+
.map_err(|_| FormatParseError::UnknownConversion)
744+
})
745+
.transpose()?;
752746

753747
Ok(FormatPart::Field {
754748
field_name: arg_part.to_owned(),

vm/src/frame.rs

Lines changed: 23 additions & 36 deletions

0 commit comments

Comments
 (0)