File: tmoperator5.pp

package info (click to toggle)
fpc 3.2.2%2Bdfsg-49
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 341,452 kB
  • sloc: pascal: 3,820,194; xml: 194,356; ansic: 9,637; asm: 8,482; java: 5,346; sh: 4,813; yacc: 3,956; makefile: 2,705; lex: 2,661; javascript: 2,454; sql: 929; php: 474; cpp: 145; perl: 136; sed: 132; csh: 34; tcl: 7
file content (138 lines) | stat: -rw-r--r-- 2,188 bytes parent folder | download | duplicates (5)
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
program tmoperator5;

{$MODE DELPHI}

type
  TR1 = record
  private
    class operator Initialize(var aR1: TR1);
    class operator Finalize(var aR1: TR1);
  public
    I: Integer;
  end;

  TR2 = record
  private
    class operator Initialize(var aR2: TR2);
    class operator Finalize(var aR2: TR2);
  public
    S: string;
  end;

{ TR1 }

class operator TR1.Initialize(var aR1: TR1);
begin
  WriteLn('TR1.Initialize');
  aR1.I := 1;
end;

class operator TR1.Finalize(var aR1: TR1);
begin
  if aR1.I <> 2 then
    Halt(1);
  aR1.I := 3;
  WriteLn('TR1.Finalize');
end;

{ TR2 }

class operator TR2.Initialize(var aR2: TR2);
begin
  WriteLn('TR2.Initialize');
  aR2.S := 'A';
end;

class operator TR2.Finalize(var aR2: TR2);
begin
  if aR2.S <> 'B' then
    Halt(2);
  WriteLn('TR2.Finalize');
end;

{ TA }

type 
  TA = object
  public 
    F1: TR1;
  end;

  TB = object(TA)
  public
    F2: TR2;
  end;
  
procedure Foo();
var
  LO: TB;
begin
  if LO.F1.I <> 1 then
    Halt(4);
  if LO.F2.S <> 'A' then
    Halt(5);
  LO.F1.I := 2;
  LO.F2.S := 'B';
end;

var
  O: TB;
  P: ^TB;
begin
  WriteLn('=== Global object variable [begin] ===');
  
  if O.F1.I <> 1 then
    Halt(3);
  if O.F2.S <> 'A' then
    Halt(4);
    
  WriteLn;
  WriteLn('=== Local variable ===');
  Foo();      
    
  WriteLn;
  WriteLn('=== New and Dispose ===');
  New(P);
  if P^.F1.I <> 1 then
    Halt(10);
  if P^.F2.S <> 'A' then
    Halt(11);
  P^.F1.I := 2;
  P^.F2.S := 'B';
  Dispose(P); 
  
  WriteLn;
  WriteLn('=== InitializeArray and FinalizeArray ===');
  GetMem(P, SizeOf(TB));
  InitializeArray(P, TypeInfo(TB), 1);
  if P^.F1.I <> 1 then
    Halt(12);
  if P^.F2.S <> 'A' then
    Halt(13);
  P^.F1.I := 2;  
  P^.F2.S := 'B';  
  FinalizeArray(P, TypeInfo(TB), 1);
  if P^.F1.I <> 3 then
    Halt(14);
  FreeMem(P);

  WriteLn;
  WriteLn('=== Initialize and Finalize ===');
  GetMem(P, SizeOf(TB));
  Initialize(P^);
  if P^.F1.I <> 1 then
    Halt(15);
  if P^.F2.S <> 'A' then
    Halt(16);
  P^.F1.I := 2;  
  P^.F2.S := 'B';  
  Finalize(P^);
  if P^.F1.I <> 3 then
    Halt(17);
  FreeMem(P);

  WriteLn;
  WriteLn('=== Global variable [end] ===');
  O.F1.I := 2;
  O.F2.S := 'B'; 
end.