diff options
author | paul <paul@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2009-10-23 16:51:41 +0000 |
---|---|---|
committer | paul <paul@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2009-10-23 16:51:41 +0000 |
commit | aa8185dcf05b8742f2ecc0b2ef0b9ecd8c42c339 (patch) | |
tree | a4295e8769e27b27cae942b50bcdcb5b730d9466 | |
parent | eecb90fade430fe2014106d4ab654cb221112b56 (diff) | |
download | fpc-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.pas | 19 |
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; |