Kaynağa Gözat

compiler: fix string for-in loop. now it uses a temp variable to store string expression result

git-svn-id: branches/paul/features@13934 -
paul 16 yıl önce
ebeveyn
işleme
51487eee51
1 değiştirilmiş dosya ile 15 ekleme ve 4 silme
  1. 15 4
      compiler/pstatmnt.pas

+ 15 - 4
compiler/pstatmnt.pas

@@ -513,16 +513,25 @@ implementation
         function create_string_loop(hloopvar, hloopbody, expr: tnode): tnode;
         function create_string_loop(hloopvar, hloopbody, expr: tnode): tnode;
         var
         var
           loopstatement, loopbodystatement: tstatementnode;
           loopstatement, loopbodystatement: tstatementnode;
-          loopvar: ttempcreatenode;
+          loopvar, stringvar: ttempcreatenode;
           stringindex, loopbody, forloopnode: tnode;
           stringindex, loopbody, forloopnode: tnode;
         begin
         begin
           { result is a block of statements }
           { result is a block of statements }
           result:=internalstatements(loopstatement);
           result:=internalstatements(loopstatement);
 
 
+          { create a temp variable for expression }
+          stringvar := ctempcreatenode.create(
+            expr.resultdef,
+            expr.resultdef.size,
+            tt_persistent,true);
+
+          addstatement(loopstatement,stringvar);
+          addstatement(loopstatement,cassignmentnode.create(ctemprefnode.create(stringvar),expr.getcopy));
+
           { create a loop counter: signed integer with size of string length }
           { create a loop counter: signed integer with size of string length }
           loopvar := ctempcreatenode.create(
           loopvar := ctempcreatenode.create(
             sinttype,
             sinttype,
-            sizeof(tstringdef(expr.resultdef).len),
+            sinttype.size,
             tt_persistent,true);
             tt_persistent,true);
 
 
           addstatement(loopstatement,loopvar);
           addstatement(loopstatement,loopvar);
@@ -532,20 +541,22 @@ implementation
           loopbody:=internalstatements(loopbodystatement);
           loopbody:=internalstatements(loopbodystatement);
           // for-in loop variable := string_expression[index]
           // for-in loop variable := string_expression[index]
           addstatement(loopbodystatement,
           addstatement(loopbodystatement,
-              cassignmentnode.create(hloopvar, cvecnode.create(expr.getcopy,stringindex)));
+              cassignmentnode.create(hloopvar, cvecnode.create(ctemprefnode.create(stringvar),stringindex)));
 
 
           { add the actual statement to the loop }
           { add the actual statement to the loop }
           addstatement(loopbodystatement,hloopbody);
           addstatement(loopbodystatement,hloopbody);
          
          
           forloopnode:=cfornode.create(ctemprefnode.create(loopvar),
           forloopnode:=cfornode.create(ctemprefnode.create(loopvar),
              genintconstnode(1),
              genintconstnode(1),
-             cinlinenode.create(in_length_x,false,expr.getcopy),
+             cinlinenode.create(in_length_x,false,ctemprefnode.create(stringvar)),
              loopbody,
              loopbody,
              false);
              false);
 
 
           addstatement(loopstatement,forloopnode);
           addstatement(loopstatement,forloopnode);
           { free the loop counter }
           { free the loop counter }
           addstatement(loopstatement,ctempdeletenode.create(loopvar));
           addstatement(loopstatement,ctempdeletenode.create(loopvar));
+          { free the temp variable for expression }
+          addstatement(loopstatement,ctempdeletenode.create(stringvar));
         end;
         end;