Ver código fonte

* 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 anos atrás
pai
commit
801fc50e86
1 arquivos alterados com 14 adições e 26 exclusões
  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;