Skip to content

Commit 090a4d1

Browse files
committed
try method #1
1 parent 58624f9 commit 090a4d1

File tree

2 files changed

+49
-1
lines changed

2 files changed

+49
-1
lines changed

sway-core/src/asm_generation/checks.rs

+40
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use crate::asm_lang::*;
77
use crate::error::*;
88

99
use sway_error::error::CompileError;
10+
use sway_ir::*;
1011

1112
/// Checks for disallowed opcodes in non-contract code.
1213
/// i.e., if this is a script or predicate, we can't use certain contract opcodes.
@@ -74,3 +75,42 @@ fn check_for_contract_opcodes(ops: &[AllocatedOp]) -> CompileResult<()> {
7475
err(vec![], errors)
7576
}
7677
}
78+
79+
pub fn check_invalid_return(ir: &Context, module: &Module) -> CompileResult<()> {
80+
let default_span = sway_types::span::Span::new("no span found".into(), 0, 1, None).unwrap();
81+
match module.get_kind(ir) {
82+
Kind::Contract | Kind::Library => ok((), vec![], vec![]),
83+
Kind::Predicate | Kind::Script => {
84+
let entry_point_function = module
85+
.function_iter(ir)
86+
.find(|func| {
87+
func.get_name(ir) == sway_types::constants::DEFAULT_ENTRY_POINT_FN_NAME
88+
})
89+
.unwrap();
90+
91+
let ret_ty = entry_point_function.get_return_type(ir);
92+
93+
if type_has_ptr(ir, &ret_ty) {
94+
err(
95+
vec![],
96+
vec![CompileError::PointerReturnNotAllowedInMain { span: default_span }],
97+
)
98+
} else {
99+
ok((), vec![], vec![])
100+
}
101+
}
102+
}
103+
}
104+
105+
fn type_has_ptr(ir: &Context, ty: &Type) -> bool {
106+
match ty {
107+
Type::Pointer(_) => true,
108+
Type::Array(aggregate) | Type::Union(aggregate) | Type::Struct(aggregate) => {
109+
match aggregate.get_content(ir) {
110+
AggregateContent::ArrayType(ty, _) => type_has_ptr(ir, ty),
111+
AggregateContent::FieldTypes(tys) => tys.iter().any(|ty| type_has_ptr(ir, ty)),
112+
}
113+
}
114+
_ => false,
115+
}
116+
}

sway-core/src/asm_generation/from_ir.rs

+9-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use super::{
22
asm_builder::AsmBuilder,
3-
checks::check_invalid_opcodes,
3+
checks::{check_invalid_opcodes, check_invalid_return},
44
finalized_asm::FinalizedAsm,
55
programs::{AbstractProgram, ProgramKind},
66
register_sequencer::RegisterSequencer,
@@ -26,6 +26,14 @@ pub fn compile_ir_to_asm(
2626
let mut errors: Vec<CompileError> = Vec::new();
2727

2828
let module = ir.module_iter().next().unwrap();
29+
30+
check!(
31+
check_invalid_return(ir, &module),
32+
return err(warnings, errors),
33+
warnings,
34+
errors
35+
);
36+
2937
let abstract_program = check!(
3038
compile_module_to_asm(RegisterSequencer::new(), ir, module),
3139
return err(warnings, errors),

0 commit comments

Comments
 (0)