changes: 1. declare an error if not within a procedure or function 2. Check for mismatched Begin/End blocks. 3. Check for child objects within end_object
// This tracks number of nested objects in method. // !Zn is the level of !n when the proc/funct started. Upon // completion !n should be that value. If not error. // If error, compiler stack is messed up #IF (!Zn = !n) #ELSE #ERROR DFERR_COMP_UNRESOVLED_CONTROL_BLOCK Mismatch in Method #SET B$ (!b | 4) // stack is screwed up..we have no idea if we are in proc #ENDIF // When Proc started we set !Zm to 0. It counts nested objects. It // should be zero. If not we have an error. // If error, compiler stack is messed up #IF (!Zm > 0) #ERROR DFERR_COMP_MISSING_END_OBJECT Mismatch in Method #SET B$ (!b | 4) // stack is screwed up..we have no idea if we are in proc #ENDIF #IFDEF MANGLE_NAMES // Let NUM_ARGUMENTS get referenced again in the code, if it has been turned off. #ALLOW NUM_ARGUMENTS #UNDEF __@INSIDE_FUNCTION@__ // Leaving function/proc. #ENDIF #IF (!b & 4) // are we within a Procedure #SET B$ (!b & 3) // reset flag to in_procedure #POP U$ #REPLACE OBJ$!Za$LNUM |CI!Zg // Update the count in the local cmd. // !A [] OBJ$END$HANDLER |CI0 !A [] $0455 |CI0 #REPLACE OBJ$!Za$ENDPROC !a #POP U$ #POP ZG$ #STKSYM #ELSE #ERROR DFERR_COMP_ILLEGAL_CODE_PLACEMENT End_Funct/End_proc command .not. within a method #ENDIF