From 0074c68ec4f435c5dc0ba6d62ff567c1f146e9ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Capucho?= Date: Tue, 31 Jan 2023 14:58:36 +0000 Subject: [PATCH] valid: Check dependencies between functions calls This commit enforces the forward dependency rules on the IR across functions and their calls, this fixes a crash in a later stage of the validator. --- src/valid/handles.rs | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/valid/handles.rs b/src/valid/handles.rs index 062624daf1..be87e54d48 100644 --- a/src/valid/handles.rs +++ b/src/valid/handles.rs @@ -131,7 +131,7 @@ impl super::Validator { } } - let validate_function = |function: &_| -> Result<_, InvalidHandleError> { + let validate_function = |function_handle, function: &_| -> Result<_, InvalidHandleError> { let &crate::Function { name: _, ref arguments, @@ -175,6 +175,7 @@ impl super::Validator { local_variables, global_variables, functions, + function_handle, )?; } @@ -184,11 +185,11 @@ impl super::Validator { }; for entry_point in entry_points.iter() { - validate_function(&entry_point.function)?; + validate_function(None, &entry_point.function)?; } - for (_function_handle, function) in functions.iter() { - validate_function(function)?; + for (function_handle, function) in functions.iter() { + validate_function(Some(function_handle), function)?; } Ok(()) @@ -229,6 +230,8 @@ impl super::Validator { local_variables: &Arena, global_variables: &Arena, functions: &Arena, + // The handle of the current function or `None` if it's an entry point + current_function: Option>, ) -> Result<(), InvalidHandleError> { let validate_constant = |handle| Self::validate_constant_handle(handle, constants); let validate_type = |handle| Self::validate_type_handle(handle, types); @@ -373,6 +376,9 @@ impl super::Validator { } crate::Expression::CallResult(function) => { Self::validate_function_handle(function, functions)?; + if let Some(handle) = current_function { + handle.check_dep(function)?; + } } crate::Expression::AtomicResult { .. } => (), crate::Expression::ArrayLength(array) => {