Browse Source

* simplified "case stringexpr of" handling and removed memory leaks due to
symbols that weren't put in any symbol table (and that couldn't be put
anywhere, since they all had the same name)

git-svn-id: trunk@30855 -

Jonas Maebe 10 years ago
parent
commit
801fc50e86
1 changed files with 14 additions and 26 deletions
  1. 14 26
      compiler/nset.pas

+ 14 - 26
compiler/nset.pas

@@ -658,16 +658,15 @@ implementation
 
 
     function tcasenode.pass_1 : tnode;
     function tcasenode.pass_1 : tnode;
       var
       var
-         i  : integer;
-         node_thenblock,node_elseblock,if_node,temp_cleanup : tnode;
+         i: integer;
+         node_thenblock, node_elseblock, if_node,temp_cleanup : tnode;
          tempcaseexpr : ttempcreatenode;
          tempcaseexpr : ttempcreatenode;
-         if_block, init_block, stmt_block : tblocknode;
-         stmt : tstatementnode;
-         endlabel : tlabelnode;
+         if_block, init_block: tblocknode;
+         stmt: tstatementnode;
 
 
       function makeifblock(const labtree : pcaselabel; prevconditblock : tnode): tnode;
       function makeifblock(const labtree : pcaselabel; prevconditblock : tnode): tnode;
         var
         var
-          condit : tnode;
+          condit: tnode;
         begin
         begin
           if assigned(labtree^.less) then
           if assigned(labtree^.less) then
             result := makeifblock(labtree^.less, prevconditblock)
             result := makeifblock(labtree^.less, prevconditblock)
@@ -686,7 +685,8 @@ implementation
 
 
           result :=
           result :=
             cifnode.create(
             cifnode.create(
-              condit, cgotonode.create(pcaseblock(blocks[labtree^.blockid])^.statementlabel.labsym), result);
+              condit, pcaseblock(blocks[labtree^.blockid])^.statement, result);
+          pcaseblock(blocks[labtree^.blockid])^.statement:=nil;
 
 
           if assigned(labtree^.greater) then
           if assigned(labtree^.greater) then
             result := makeifblock(labtree^.greater, result);
             result := makeifblock(labtree^.greater, result);
@@ -754,37 +754,25 @@ implementation
 
 
          if (labels^.label_type = ltConstString) then
          if (labels^.label_type = ltConstString) then
            begin
            begin
-             endlabel:=clabelnode.create(cnothingnode.create,clabelsym.create('$casestrofend'));
-             stmt_block:=internalstatements(stmt);
+             if_node:=makeifblock(labels, elseblock);
+
              for i:=0 to blocks.count-1 do
              for i:=0 to blocks.count-1 do
                begin
                begin
-                 pcaseblock(blocks[i])^.statementlabel:=clabelnode.create(cnothingnode.create,clabelsym.create('$casestrof'));
-                 addstatement(stmt,pcaseblock(blocks[i])^.statementlabel);
-                 addstatement(stmt,pcaseblock(blocks[i])^.statement);
                  pcaseblock(blocks[i])^.statement:=nil;
                  pcaseblock(blocks[i])^.statement:=nil;
-                 addstatement(stmt,cgotonode.create(endlabel.labsym));
                end;
                end;
 
 
-             firstpass(tnode(stmt_block));
-
-             if_node := makeifblock(labels, elseblock);
-
              if assigned(init_block) then
              if assigned(init_block) then
                firstpass(tnode(init_block));
                firstpass(tnode(init_block));
 
 
-             if_block := internalstatements(stmt);
+             if_block:=internalstatements(stmt);
 
 
              if assigned(init_block) then
              if assigned(init_block) then
                addstatement(stmt, init_block);
                addstatement(stmt, init_block);
-
-             addstatement(stmt, if_node);
-             addstatement(stmt,cgotonode.create(endlabel.labsym));
-             addstatement(stmt, stmt_block);
-             addstatement(stmt, endlabel);
+             addstatement(stmt,if_node);
              if assigned(temp_cleanup) then
              if assigned(temp_cleanup) then
-               addstatement(stmt, temp_cleanup);
-             result := if_block;
-             elseblock := nil;
+               addstatement(stmt,temp_cleanup);
+             result:=if_block;
+             elseblock:= nil;
              exit;
              exit;
            end;
            end;