Browse Source

* Fix bug ID #31699 (@@end label in asm block)

git-svn-id: trunk@35914 -
michael 8 years ago
parent
commit
f3f661140a
2 changed files with 25 additions and 1 deletions
  1. 7 1
      packages/fcl-passrc/src/pparser.pp
  2. 18 0
      packages/fcl-passrc/tests/tcstatements.pas

+ 7 - 1
packages/fcl-passrc/src/pparser.pp

@@ -4155,6 +4155,10 @@ begin
 end;
 end;
 
 
 procedure TPasParser.ParseAsmBlock(AsmBlock: TPasImplAsmStatement);
 procedure TPasParser.ParseAsmBlock(AsmBlock: TPasImplAsmStatement);
+
+Var
+  LastToken : TToken;
+
 begin
 begin
   if po_asmwhole in Options then
   if po_asmwhole in Options then
     begin
     begin
@@ -4187,11 +4191,13 @@ begin
     end
     end
   else
   else
     begin
     begin
+    LastToken:=tkEOF;
     NextToken;
     NextToken;
-    While CurToken<>tkEnd do
+    While Not ((CurToken=tkEnd) and (LastToken<>tkAt)) do
       begin
       begin
       // ToDo: allow @@end
       // ToDo: allow @@end
       AsmBlock.Tokens.Add(CurTokenText);
       AsmBlock.Tokens.Add(CurTokenText);
+      LastToken:=CurToken;
       NextToken;
       NextToken;
       end;
       end;
     end;
     end;

+ 18 - 0
packages/fcl-passrc/tests/tcstatements.pas

@@ -113,6 +113,7 @@ Type
     procedure TestTryExceptRaise;
     procedure TestTryExceptRaise;
     Procedure TestAsm;
     Procedure TestAsm;
     Procedure TestAsmBlock;
     Procedure TestAsmBlock;
+    Procedure TestAdmBlockWithEndLabel;
     Procedure TestGotoInIfThen;
     Procedure TestGotoInIfThen;
     procedure AssignToAddress;
     procedure AssignToAddress;
   end;
   end;
@@ -1660,6 +1661,23 @@ begin
   ParseModule;
   ParseModule;
 end;
 end;
 
 
+procedure TTestStatementParser.TestAdmBlockWithEndLabel;
+begin
+  Source.Add('{$MODE DELPHI}');
+  Source.Add('function BitsHighest(X: Cardinal): Integer;');
+  Source.Add('asm');
+  Source.Add('  MOV ECX, EAX');
+  Source.Add('  MOV EAX, -1');
+  Source.Add('  BSR EAX, ECX');
+  Source.Add('  JNZ @@End');
+  Source.Add('  MOV EAX, -1');
+  Source.Add('@@End:');
+  Source.Add('end;');
+  Source.Add('begin');
+  Source.Add('end.');
+  ParseModule;
+end;
+
 Procedure TTestStatementParser.AssignToAddress;
 Procedure TTestStatementParser.AssignToAddress;
 
 
 begin
 begin