@@ -308,9 +308,11 @@ pub fn analyze(tree: Box<Tree>, state: &mut AnalysisState) -> Result<(), String>
308308 analyze ( rhs, state)
309309 }
310310 Tree :: Block ( statements, _) => {
311+ let old_namespace = state. namespace . clone ( ) ;
311312 for statement in statements {
312313 analyze ( Box :: new ( statement. clone ( ) ) , state) ?;
313314 }
315+ state. namespace = old_namespace;
314316 Ok ( ( ) )
315317 }
316318 Tree :: LValueIdentifier ( name) => analyze ( name, state) ,
@@ -445,11 +447,11 @@ pub fn analyze(tree: Box<Tree>, state: &mut AnalysisState) -> Result<(), String>
445447 Ok ( ( ) )
446448 }
447449 Tree :: For ( initializer, condition, updater, expression, _) => {
450+ let old_namespace = state. namespace . clone ( ) ;
448451 let returning_state = state. return_state . clone ( ) ;
449452 if let Some ( initializer_expression) = initializer {
450453 analyze ( initializer_expression, state) ?;
451454 }
452- let old_namespace = state. namespace . clone ( ) ;
453455 analyze ( condition. clone ( ) , state) ?;
454456 if get_variable_type ( condition, state)
455457 . ok_or ( "Variable undefined!" ) ?
@@ -458,7 +460,12 @@ pub fn analyze(tree: Box<Tree>, state: &mut AnalysisState) -> Result<(), String>
458460 return Err ( "Condition must be a boolean" . to_string ( ) ) ;
459461 }
460462 if let Some ( updater_expression) = updater {
463+ let names = state. namespace . iter ( ) . map ( |v| v. 0 ) . len ( ) ;
461464 analyze ( updater_expression, state) ?;
465+ let additional_names = state. namespace . iter ( ) . map ( |v| v. 0 ) . len ( ) ;
466+ if names != additional_names {
467+ return Err ( "Updater Expression cannot define variables" . to_string ( ) ) ;
468+ }
462469 }
463470 state. enter_loop ( ) ;
464471 analyze ( expression, state) ?;
0 commit comments