summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpaul <paul@3ad0048d-3df7-0310-abae-a5850022a9f2>2009-10-23 16:51:41 +0000
committerpaul <paul@3ad0048d-3df7-0310-abae-a5850022a9f2>2009-10-23 16:51:41 +0000
commitaa8185dcf05b8742f2ecc0b2ef0b9ecd8c42c339 (patch)
treea4295e8769e27b27cae942b50bcdcb5b730d9466
parenteecb90fade430fe2014106d4ab654cb221112b56 (diff)
downloadfpc-aa8185dcf05b8742f2ecc0b2ef0b9ecd8c42c339.tar.gz
compiler: fix string for-in loop. now it uses a temp variable to store string expression result
git-svn-id: http://svn.freepascal.org/svn/fpc/branches/paul@13934 3ad0048d-3df7-0310-abae-a5850022a9f2
-rw-r--r--features/compiler/pstatmnt.pas19
1 files changed, 15 insertions, 4 deletions
diff --git a/features/compiler/pstatmnt.pas b/features/compiler/pstatmnt.pas
index 01a193bda8..7b173fe967 100644
--- a/features/compiler/pstatmnt.pas
+++ b/features/compiler/pstatmnt.pas
@@ -513,16 +513,25 @@ implementation
function create_string_loop(hloopvar, hloopbody, expr: tnode): tnode;
var
loopstatement, loopbodystatement: tstatementnode;
- loopvar: ttempcreatenode;
+ loopvar, stringvar: ttempcreatenode;
stringindex, loopbody, forloopnode: tnode;
begin
{ result is a block of statements }
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 }
loopvar := ctempcreatenode.create(
sinttype,
- sizeof(tstringdef(expr.resultdef).len),
+ sinttype.size,
tt_persistent,true);
addstatement(loopstatement,loopvar);
@@ -532,20 +541,22 @@ implementation
loopbody:=internalstatements(loopbodystatement);
// for-in loop variable := string_expression[index]
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 }
addstatement(loopbodystatement,hloopbody);
forloopnode:=cfornode.create(ctemprefnode.create(loopvar),
genintconstnode(1),
- cinlinenode.create(in_length_x,false,expr.getcopy),
+ cinlinenode.create(in_length_x,false,ctemprefnode.create(stringvar)),
loopbody,
false);
addstatement(loopstatement,forloopnode);
{ free the loop counter }
addstatement(loopstatement,ctempdeletenode.create(loopvar));
+ { free the temp variable for expression }
+ addstatement(loopstatement,ctempdeletenode.create(stringvar));
end;