Browse Source

* free temps created for case-of-string-statements

git-svn-id: trunk@22100 -
Jonas Maebe 13 years ago
parent
commit
3983342648
1 changed files with 6 additions and 2 deletions
  1. 6 2
      compiler/nset.pas

+ 6 - 2
compiler/nset.pas

@@ -646,9 +646,9 @@ implementation
     function tcasenode.pass_1 : tnode;
     function tcasenode.pass_1 : tnode;
       var
       var
          i  : integer;
          i  : integer;
-         node_thenblock,node_elseblock,if_node : tnode;
+         node_thenblock,node_elseblock,if_node,temp_cleanup : tnode;
          tempcaseexpr : ttempcreatenode;
          tempcaseexpr : ttempcreatenode;
-         if_block, init_block,stmt_block : tblocknode;
+         if_block, init_block, stmt_block : tblocknode;
          stmt : tstatementnode;
          stmt : tstatementnode;
          endlabel : tlabelnode;
          endlabel : tlabelnode;
 
 
@@ -684,6 +684,7 @@ implementation
       begin
       begin
          result:=nil;
          result:=nil;
          init_block:=nil;
          init_block:=nil;
+         temp_cleanup:=nil;
          expectloc:=LOC_VOID;
          expectloc:=LOC_VOID;
 
 
          { evalutes the case expression }
          { evalutes the case expression }
@@ -702,6 +703,7 @@ implementation
              tempcaseexpr :=
              tempcaseexpr :=
                ctempcreatenode.create(
                ctempcreatenode.create(
                  left.resultdef, left.resultdef.size, tt_persistent, true);
                  left.resultdef, left.resultdef.size, tt_persistent, true);
+             temp_cleanup := ctempdeletenode.create(tempcaseexpr);
              typecheckpass(tnode(tempcaseexpr));
              typecheckpass(tnode(tempcaseexpr));
 
 
              addstatement(stmt, tempcaseexpr);
              addstatement(stmt, tempcaseexpr);
@@ -766,6 +768,8 @@ implementation
              addstatement(stmt,cgotonode.create(endlabel.labsym));
              addstatement(stmt,cgotonode.create(endlabel.labsym));
              addstatement(stmt, stmt_block);
              addstatement(stmt, stmt_block);
              addstatement(stmt, endlabel);
              addstatement(stmt, endlabel);
+             if assigned(temp_cleanup) then
+               addstatement(stmt, temp_cleanup);
              result := if_block;
              result := if_block;
              elseblock := nil;
              elseblock := nil;
              exit;
              exit;