forked from M-Labs/nac3
meta: Lift return out of conditional statement
This commit is contained in:
parent
4dc5dbb856
commit
ef04696b02
@ -475,11 +475,11 @@ impl Nac3 {
|
|||||||
|
|
||||||
if let Err(e) = composer.start_analysis(true) {
|
if let Err(e) = composer.start_analysis(true) {
|
||||||
// report error of __modinit__ separately
|
// report error of __modinit__ separately
|
||||||
if !e.contains("<nac3_synthesized_modinit>") {
|
return if !e.contains("<nac3_synthesized_modinit>") {
|
||||||
return Err(CompileError::new_err(format!(
|
Err(CompileError::new_err(format!(
|
||||||
"compilation failed\n----------\n{}",
|
"compilation failed\n----------\n{}",
|
||||||
e
|
e
|
||||||
)));
|
)))
|
||||||
} else {
|
} else {
|
||||||
let msg = Self::report_modinit(
|
let msg = Self::report_modinit(
|
||||||
&arg_names,
|
&arg_names,
|
||||||
@ -489,10 +489,10 @@ impl Nac3 {
|
|||||||
&mut composer.unifier,
|
&mut composer.unifier,
|
||||||
&self.primitive,
|
&self.primitive,
|
||||||
);
|
);
|
||||||
return Err(CompileError::new_err(format!(
|
Err(CompileError::new_err(format!(
|
||||||
"compilation failed\n----------\n{}",
|
"compilation failed\n----------\n{}",
|
||||||
msg.unwrap_or(e)
|
msg.unwrap_or(e)
|
||||||
)));
|
)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let top_level = Arc::new(composer.make_top_level_context());
|
let top_level = Arc::new(composer.make_top_level_context());
|
||||||
|
@ -166,10 +166,10 @@ impl StaticValue for PythonValue {
|
|||||||
if ty_id == self.resolver.primitive_ids.option && name == "_nac3_option".into() {
|
if ty_id == self.resolver.primitive_ids.option && name == "_nac3_option".into() {
|
||||||
let obj = self.value.getattr(py, name.to_string().as_str())?;
|
let obj = self.value.getattr(py, name.to_string().as_str())?;
|
||||||
let id = self.resolver.helper.id_fn.call1(py, (&obj,))?.extract(py)?;
|
let id = self.resolver.helper.id_fn.call1(py, (&obj,))?.extract(py)?;
|
||||||
if self.id == self.resolver.primitive_ids.none {
|
return if self.id == self.resolver.primitive_ids.none {
|
||||||
return Ok(None)
|
Ok(None)
|
||||||
} else {
|
} else {
|
||||||
return Ok(Some((id, obj)))
|
Ok(Some((id, obj)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let def_id = { *self.resolver.pyid_to_def.read().get(&ty_id).unwrap() };
|
let def_id = { *self.resolver.pyid_to_def.read().get(&ty_id).unwrap() };
|
||||||
|
@ -1691,7 +1691,7 @@ pub fn gen_expr<'ctx, 'a, G: CodeGenerator>(
|
|||||||
&& id == ctx.primitives.option.get_obj_id(&ctx.unifier)
|
&& id == ctx.primitives.option.get_obj_id(&ctx.unifier)
|
||||||
{
|
{
|
||||||
match val {
|
match val {
|
||||||
ValueEnum::Static(v) => match v.get_field("_nac3_option".into(), ctx) {
|
ValueEnum::Static(v) => return match v.get_field("_nac3_option".into(), ctx) {
|
||||||
// if is none, raise exception directly
|
// if is none, raise exception directly
|
||||||
None => {
|
None => {
|
||||||
let err_msg = ctx.gen_string(generator, "");
|
let err_msg = ctx.gen_string(generator, "");
|
||||||
@ -1723,13 +1723,13 @@ pub fn gen_expr<'ctx, 'a, G: CodeGenerator>(
|
|||||||
.get_llvm_type(generator, value.custom.unwrap())
|
.get_llvm_type(generator, value.custom.unwrap())
|
||||||
.into_pointer_type()
|
.into_pointer_type()
|
||||||
.const_null();
|
.const_null();
|
||||||
return Ok(Some(ctx.builder.build_load(
|
Ok(Some(ctx.builder.build_load(
|
||||||
ptr,
|
ptr,
|
||||||
"unwrap_none_unreachable_load"
|
"unwrap_none_unreachable_load"
|
||||||
).into()));
|
).into()))
|
||||||
}
|
}
|
||||||
Some(v) => return Ok(Some(v)),
|
Some(v) => Ok(Some(v)),
|
||||||
}
|
},
|
||||||
ValueEnum::Dynamic(BasicValueEnum::PointerValue(ptr)) => {
|
ValueEnum::Dynamic(BasicValueEnum::PointerValue(ptr)) => {
|
||||||
let not_null = ctx.builder.build_is_not_null(ptr, "unwrap_not_null");
|
let not_null = ctx.builder.build_is_not_null(ptr, "unwrap_not_null");
|
||||||
ctx.make_assert(
|
ctx.make_assert(
|
||||||
|
@ -812,17 +812,17 @@ impl<'a> Inferencer<'a> {
|
|||||||
{
|
{
|
||||||
let custom = Some(self.primitives.int64);
|
let custom = Some(self.primitives.int64);
|
||||||
let v: Result<i64, _> = (*val).try_into();
|
let v: Result<i64, _> = (*val).try_into();
|
||||||
if v.is_ok() {
|
return if v.is_ok() {
|
||||||
return Ok(Located {
|
Ok(Located {
|
||||||
location: args[0].location,
|
location: args[0].location,
|
||||||
custom,
|
custom,
|
||||||
node: ExprKind::Constant {
|
node: ExprKind::Constant {
|
||||||
value: ast::Constant::Int(*val),
|
value: ast::Constant::Int(*val),
|
||||||
kind: kind.clone(),
|
kind: kind.clone(),
|
||||||
},
|
},
|
||||||
});
|
})
|
||||||
} else {
|
} else {
|
||||||
return report_error("Integer out of bound", args[0].location)
|
report_error("Integer out of bound", args[0].location)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -832,17 +832,17 @@ impl<'a> Inferencer<'a> {
|
|||||||
{
|
{
|
||||||
let custom = Some(self.primitives.uint32);
|
let custom = Some(self.primitives.uint32);
|
||||||
let v: Result<u32, _> = (*val).try_into();
|
let v: Result<u32, _> = (*val).try_into();
|
||||||
if v.is_ok() {
|
return if v.is_ok() {
|
||||||
return Ok(Located {
|
Ok(Located {
|
||||||
location: args[0].location,
|
location: args[0].location,
|
||||||
custom,
|
custom,
|
||||||
node: ExprKind::Constant {
|
node: ExprKind::Constant {
|
||||||
value: ast::Constant::Int(*val),
|
value: ast::Constant::Int(*val),
|
||||||
kind: kind.clone(),
|
kind: kind.clone(),
|
||||||
},
|
},
|
||||||
});
|
})
|
||||||
} else {
|
} else {
|
||||||
return report_error("Integer out of bound", args[0].location)
|
report_error("Integer out of bound", args[0].location)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -852,17 +852,17 @@ impl<'a> Inferencer<'a> {
|
|||||||
{
|
{
|
||||||
let custom = Some(self.primitives.uint64);
|
let custom = Some(self.primitives.uint64);
|
||||||
let v: Result<u64, _> = (*val).try_into();
|
let v: Result<u64, _> = (*val).try_into();
|
||||||
if v.is_ok() {
|
return if v.is_ok() {
|
||||||
return Ok(Located {
|
Ok(Located {
|
||||||
location: args[0].location,
|
location: args[0].location,
|
||||||
custom,
|
custom,
|
||||||
node: ExprKind::Constant {
|
node: ExprKind::Constant {
|
||||||
value: ast::Constant::Int(*val),
|
value: ast::Constant::Int(*val),
|
||||||
kind: kind.clone(),
|
kind: kind.clone(),
|
||||||
},
|
},
|
||||||
});
|
})
|
||||||
} else {
|
} else {
|
||||||
return report_error("Integer out of bound", args[0].location)
|
report_error("Integer out of bound", args[0].location)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user