File: ExceptPrg.pas

package info (click to toggle)
lazarus 2.0.0%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 214,460 kB
  • sloc: pascal: 1,862,622; xml: 265,709; cpp: 56,595; sh: 3,008; java: 609; makefile: 535; perl: 297; sql: 222; ansic: 137
file content (152 lines) | stat: -rw-r--r-- 2,545 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
program ExceptPrg;  {$INLINE OFF}
{$IFDEF TEST_WITH_HPLUS}
  {$H+}
{$ELSE}
  {$H-}
{$ENDIF}

//{$DEFINE  TEST_NO_EXCEPTION_TYPE}{$DEFINE TEST_NO_POINTER_VAR}{$DEFINE TEST_NO_EXCEPTION_TYPE}{$DEFINE TEST_NO_EXCEPTION_VAR}
uses sysutils;

{$IFnDEF TEST_NO_EXCEPTION_TYPE}
type
  MyESome = class(Exception) end;
  MyEOther = class(Exception) end;
{$ENDIF}

var
  i: integer;
  {$IFnDEF TEST_NO_POINTER_VAR}
  p: pointer; // ensure pointer is in symbol info
  {$ENDIF}
  {$IFnDEF TEST_NO_STRING_VAR}
  s: string[100];
  {$ENDIF}
  {$IFnDEF TEST_NO_EXCEPTION_VAR}
  x: Exception;
  {$ENDIF}

  {$IFnDEF TEST_NO_EXCEPTION_TYPE}
  procedure foo;
    var a: string;
  begin
    a:= 'abc ΓΌΓΌ {[''[{ \n\t'#13#9'#';
    raise MyESome.create(a);
  end;
  {$ENDIF}

  {$IFDEF TEST_EXCEPTION_AT}
  procedure Bar;
  begin
    raise Exception.create('at1') at
    get_caller_addr(get_caller_frame(get_frame)),
    get_caller_frame(get_caller_frame(get_frame));
  end;

  procedure Bar1;
  begin
    Bar();
  end;

  procedure Bar2;
  begin
    Bar1();
  end;

  procedure BarBar;
  begin
    raise Exception.create('at2') at
    get_caller_addr(get_frame),
    get_caller_frame(get_frame);
  end;

  procedure BarBar1;
  begin
    BarBar();
  end;

  procedure BarBar2;
  begin
    BarBar1();
  end;
  {$ENDIF}

  {$IFDEF TEST_RUNERR}
  {$R+}
  procedure Run;
  var a: array of integer;
  begin
    SetLength(a, 2);
    a[0] := -2;
    a[1] := a[length(a)-a[0]];
  end;

  procedure Run1;
  begin
    Run();
  end;
  {$ENDIF}

  {$IFDEF TEST_ASSERT}
  {$C+}
  procedure check;
  begin
    Assert(false, 'denied');
  end;

  procedure check1;
  begin
    check();
  end;
  {$ENDIF}
begin
  IsConsole := true; // dont show unhandled exceptions
  {$IFnDEF TEST_NO_POINTER_VAR}
  p := nil;
  {$ENDIF}
  //foo;

  {$IFnDEF TEST_SKIP_EXCEPTION_1}
  try
    {$IFnDEF TEST_NO_EXCEPTION_VAR}
    x := Exception.Create('foo');
    raise x;
    {$ELSE}
    raise Exception.Create('foo');
    {$ENDIF}
  except
    on e: Exception do begin
      {$IFnDEF TEST_NO_STRING_VAR}
      s := IntToStr(PtrInt(Pointer(e)));
      Freemem(GetMem(1)); //writeln(e.Message + s);
      {$ELSE}
      Freemem(GetMem(1)); //writeln(e.Message);
      {$ENDIF}
    end;
  end;
  Freemem(GetMem(1));
  {$ENDIF}

  {$IFDEF TEST_EXCEPTION_AT}
  try
  Bar2();
  except end;
  try
  BarBar2();
  except end;
  {$ENDIF}

  {$IFDEF TEST_RUNERR}
  Run1();
  {$ENDIF}

  {$IFDEF TEST_ASSERT}
  check1();
  {$ENDIF}

  {$IFnDEF TEST_NO_EXCEPTION_TYPE}
  foo;
  {$ENDIF}

  Freemem(GetMem(1));
end.