blob: 5165844717f332ed495f9e29cdf12333817aef82 (
plain)
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
|
{$IFDEF DetectConstFlagCorruption}
TYPE
EConstCorruption=Class(Exception);
{$ENDIF}
PROCEDURE TExpression.UpdateConstants;
function InternalUpdateConstants(expr:pnode):boolean;
{Shouldn't be necessary. Detects both corruption of flags if
DetectConstFlagCorruption is defined
and rebuilds them.}
begin
if Expr<>NIL THEN
case Expr^.NodeType of
VarNode : begin {A symbol is not a constant}
{$IFDEF DetectConstFlagCorruption}
if (ExprIsConstant IN Expr^.Flags) then
Raise EConstCorruption.Create('Corrupt Varnode');
{$ENDIF}
Exclude(Expr^.flags,ExprIsConstant);
Result:=false;
end;
IConstNode,
ConstNode: begin
{$IFDEF DetectConstFlagCorruption}
if NOT (ExprIsConstant IN Expr^.Flags) then
Raise EConstCorruption.Create('Corrupt (I)constnode');
{$ENDIF}
Include(Expr^.flags,ExprIsConstant);
Result:=TRUE;
end;
calcnode: begin
Result:=InternalUpdateConstants(Expr^.Left) AND InternalUpdateConstants(Expr^.Right);
{$IFDEF DetectConstFlagCorruption}
if (ExprIsConstant IN Expr^.Flags)<>Result then
Raise EConstCorruption.Create('Corrupt calcnode');
{$ENDIF}
IF Result THEN
Include(Expr^.flags,ExprIsConstant)
else
Exclude(Expr^.flags,ExprIsConstant)
end;
funcnode: begin
Result:=InternalUpdateConstants(Expr^.Son);
{$IFDEF DetectConstFlagCorruption}
if (ExprIsConstant IN Expr^.Flags)<>Result then
Raise EConstCorruption.Create('Corrupt funcnode');
{$ENDIF}
IF Result THEN
Include(Expr^.flags,ExprIsConstant)
else
Exclude(Expr^.flags,ExprIsConstant)
end;
func2node: begin
Result:=InternalUpdateConstants(Expr^.Son2Left) and InternalUpdateConstants(Expr^.Son2Right);
{$IFDEF DetectConstFlagCorruption}
if (ExprIsConstant IN Expr^.Flags)<>Result then
Raise EConstCorruption.Create('Corrupt func2node');
{$ENDIF}
IF Result THEN
Include(Expr^.flags,ExprIsConstant)
else
Exclude(Expr^.flags,ExprIsConstant)
end;
end;
end;
begin
InternalUpdateConstants(ExprTree);
end;
{
}
|