summaryrefslogtreecommitdiff
path: root/fpcsrc/packages/symbolic/src/rearrang.inc
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;

{














}