12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- { %RESULT=217 }
- {****************************************************************}
- { CODE GENERATOR TEST PROGRAM }
- { By Carl Eric Codere }
- {****************************************************************}
- { NODE TESTED : secondtryfinally() }
- { secondraise() }
- {****************************************************************}
- { PRE-REQUISITES: secondload() }
- { secondassign() }
- { secondtypeconv() }
- { secondtryexcept() }
- { secondcalln() }
- { secondadd() }
- {****************************************************************}
- { DEFINES: }
- { FPC = Target is FreePascal compiler }
- {****************************************************************}
- {****************************************************************}
- program ttryfin2;
- {$ifdef fpc}
- {$mode objfpc}
- {$endif}
- Type
- TAObject = class(TObject)
- a : longint;
- end;
- TBObject = Class(TObject)
- b : longint;
- end;
- { The test cases were taken from the SAL internal architecture manual }
- procedure fail;
- begin
- WriteLn('Failure.');
- halt(1);
- end;
- var
- global_counter : integer;
- Procedure raiseanexception;
- Var A : TAObject;
- begin
- { Writeln ('Creating exception object');}
- A:=TAObject.Create;
- { Writeln ('Raising with this object');}
- raise A;
- { this should never happen, if it does there is a problem! }
- RunError(255);
- end;
- procedure IncrementCounter(x: integer);
- begin
- Inc(global_counter);
- end;
- procedure DecrementCounter(x: integer);
- begin
- Dec(global_counter);
- end;
- { Will the finally clause of a try block be called if the try block raises an exception? }
- Procedure DoTryFinallyOne;
- var
- failed : boolean;
- begin
- Write('Try..Finally with exception rise...');
- global_counter:=0;
- failed:=true;
- Try
- IncrementCounter(global_counter);
- RaiseAnException;
- DecrementCounter(global_counter);
- finally
- if global_counter = 1 then
- failed :=false;
- if failed then
- fail
- else
- WriteLn('Success!');
- end;
- end;
- Begin
- DoTryFinallyOne;
- end.
|