@@ -92,14 +92,11 @@ interface
9292 opAssignGlobalArray,
9393 opAssignLocalVar,
9494 opAssignLocalArray,
95- opJumpEqual,
96- opJumpEqual1,
97- opJumpUnconditional,
98- opJumpEqualOrGreater2,
99- opJumpEqualOrLesser2,
100-
95+ opJumpEqualRel,
10196 opJumpEqual1Rel,
10297 opJumpUnconditionalRel,
98+ opJumpEqualOrGreater2Rel,
99+ opJumpEqualOrLesser2Rel,
103100
104101 opOperatorInc,
105102
@@ -713,14 +710,11 @@ TSECacheMap = class(TSECacheMapAncestor)
713710 3 , // opAssignGlobalArray,
714711 3 , // opAssignLocalVar,
715712 4 , // opAssignLocalArray,
716- 2 , // opJumpEqual,
717- 3 , // opJumpEqual1,
718- 2 , // opJumpUnconditional,
719- 6 , // opJumpEqualOrGreater2,
720- 6 , // opJumpEqualOrLesser2,
721-
713+ 2 , // opJumpEqualRel,
722714 3 , // opJumpEqual1Rel,
723715 2 , // opJumpUnconditionalRel,
716+ 6 , // opJumpEqualOrGreater2Rel,
717+ 6 , // opJumpEqualOrLesser2Rel,
724718
725719 4 , // opOperatorInc,
726720
@@ -5541,14 +5535,11 @@ procedure TSEVM.Exec;
55415535 labelAssignGlobalArray,
55425536 labelAssignLocalVar,
55435537 labelAssignLocalArray,
5544- labelJumpEqual,
5545- labelJumpEqual1,
5546- labelJumpUnconditional,
5547- labelJumpEqualOrGreater2,
5548- labelJumpEqualOrLesser2,
5549-
5538+ labelJumpEqualRel,
55505539 labelJumpEqual1Rel,
55515540 labelJumpUnconditionalRel,
5541+ labelJumpEqualOrGreater2Rel,
5542+ labelJumpEqualOrLesser2Rel,
55525543
55535544 labelOperatorInc,
55545545
@@ -5609,14 +5600,11 @@ procedure TSEVM.Exec;
56095600 @labelAssignGlobalArray,
56105601 @labelAssignLocalVar,
56115602 @labelAssignLocalArray,
5612- @labelJumpEqual,
5613- @labelJumpEqual1,
5614- @labelJumpUnconditional,
5615- @labelJumpEqualOrGreater2,
5616- @labelJumpEqualOrLesser2,
5617-
5603+ @labelJumpEqualRel,
56185604 @labelJumpEqual1Rel,
56195605 @labelJumpUnconditionalRel,
5606+ @labelJumpEqualOrGreater2Rel,
5607+ @labelJumpEqualOrLesser2Rel,
56205608
56215609 @labelOperatorInc,
56225610
@@ -6024,71 +6012,55 @@ procedure TSEVM.Exec;
60246012 Inc(CodePtrLocal);
60256013 DispatchGoto;
60266014 end ;
6027- { $ifndef SE_COMPUTED_GOTO} opJumpEqual :{ $endif}
6015+ { $ifndef SE_COMPUTED_GOTO} opJumpEqualRel :{ $endif}
60286016 begin
6029- labelJumpEqual :
6017+ labelJumpEqualRel :
60306018 B := Pop;
60316019 A := Pop;
60326020 if SEValueEqual(A^, B^) then
6033- CodePtrLocal := Integer(BinaryLocal[CodePtrLocal + 1 ].VarPointer)
6021+ CodePtrLocal := CodePtrLocal + Integer(BinaryLocal[CodePtrLocal + 1 ].VarPointer)
60346022 else
60356023 Inc(CodePtrLocal, 2 );
60366024 DispatchGoto;
60376025 end ;
6038- { $ifndef SE_COMPUTED_GOTO} opJumpEqual1 :{ $endif}
6026+ { $ifndef SE_COMPUTED_GOTO} opJumpEqual1Rel :{ $endif}
60396027 begin
6040- labelJumpEqual1 :
6028+ labelJumpEqual1Rel :
60416029 A := Pop;
60426030 if SEValueEqual(A^, BinaryLocal[CodePtrLocal + 1 ]) then
6043- CodePtrLocal := Integer(BinaryLocal[CodePtrLocal + 2 ].VarPointer)
6031+ CodePtrLocal := CodePtrLocal + Integer(BinaryLocal[CodePtrLocal + 2 ].VarPointer)
60446032 else
60456033 Inc(CodePtrLocal, 3 );
60466034 DispatchGoto;
60476035 end ;
6048- { $ifndef SE_COMPUTED_GOTO} opJumpUnconditional :{ $endif}
6036+ { $ifndef SE_COMPUTED_GOTO} opJumpUnconditionalRel :{ $endif}
60496037 begin
6050- labelJumpUnconditional :
6051- CodePtrLocal := Integer(BinaryLocal[CodePtrLocal + 1 ].VarPointer);
6038+ labelJumpUnconditionalRel :
6039+ CodePtrLocal := CodePtrLocal + Integer(BinaryLocal[CodePtrLocal + 1 ].VarPointer);
60526040 DispatchGoto;
60536041 end ;
6054- { $ifndef SE_COMPUTED_GOTO} opJumpEqualOrGreater2 :{ $endif}
6042+ { $ifndef SE_COMPUTED_GOTO} opJumpEqualOrGreater2Rel :{ $endif}
60556043 begin
6056- labelJumpEqualOrGreater2 :
6044+ labelJumpEqualOrGreater2Rel :
60576045 B := GetVariable(BinaryLocal[CodePtrLocal + 3 ].VarPointer, BinaryLocal[CodePtrLocal + 4 ].VarPointer);
60586046 A := GetVariable(BinaryLocal[CodePtrLocal + 1 ].VarPointer, BinaryLocal[CodePtrLocal + 2 ].VarPointer);
60596047 if SEValueGreaterOrEqual(A^, B^) then
6060- CodePtrLocal := Integer(BinaryLocal[CodePtrLocal + 5 ].VarPointer)
6048+ CodePtrLocal := CodePtrLocal + Integer(BinaryLocal[CodePtrLocal + 5 ].VarPointer)
60616049 else
60626050 Inc(CodePtrLocal, 6 );
60636051 DispatchGoto;
60646052 end ;
6065- { $ifndef SE_COMPUTED_GOTO} opJumpEqualOrLesser2 :{ $endif}
6053+ { $ifndef SE_COMPUTED_GOTO} opJumpEqualOrLesser2Rel :{ $endif}
60666054 begin
6067- labelJumpEqualOrLesser2 :
6055+ labelJumpEqualOrLesser2Rel :
60686056 B := GetVariable(BinaryLocal[CodePtrLocal + 3 ].VarPointer, BinaryLocal[CodePtrLocal + 4 ].VarPointer);
60696057 A := GetVariable(BinaryLocal[CodePtrLocal + 1 ].VarPointer, BinaryLocal[CodePtrLocal + 2 ].VarPointer);
60706058 if SEValueLesserOrEqual(A^, B^) then
6071- CodePtrLocal := Integer(BinaryLocal[CodePtrLocal + 5 ].VarPointer)
6059+ CodePtrLocal := CodePtrLocal + Integer(BinaryLocal[CodePtrLocal + 5 ].VarPointer)
60726060 else
60736061 Inc(CodePtrLocal, 6 );
60746062 DispatchGoto;
60756063 end ;
6076- { $ifndef SE_COMPUTED_GOTO} opJumpEqual1Rel:{ $endif}
6077- begin
6078- labelJumpEqual1Rel:
6079- A := Pop;
6080- if SEValueEqual(A^, BinaryLocal[CodePtrLocal + 1 ]) then
6081- CodePtrLocal := CodePtrLocal + Integer(BinaryLocal[CodePtrLocal + 2 ].VarPointer)
6082- else
6083- Inc(CodePtrLocal, 3 );
6084- DispatchGoto;
6085- end ;
6086- { $ifndef SE_COMPUTED_GOTO} opJumpUnconditionalRel:{ $endif}
6087- begin
6088- labelJumpUnconditionalRel:
6089- CodePtrLocal := CodePtrLocal + Integer(BinaryLocal[CodePtrLocal + 1 ].VarPointer);
6090- DispatchGoto;
6091- end ;
60926064 { $ifndef SE_COMPUTED_GOTO} opCallRef:{ $endif}
60936065 begin
60946066 labelCallRef:
@@ -9076,7 +9048,7 @@ procedure TEvilC.Parse;
90769048
90779049 ReturnList := ReturnStack.Pop;
90789050 for I := 0 to ReturnList.Count - 1 do
9079- Patch(Integer(ReturnList[I]), Pointer(Self.Binary.Count));
9051+ Patch(Integer(ReturnList[I]), Pointer(Self.Binary.Count) - (Integer(ReturnList[I]) - 2 ) );
90809052 Emit([Pointer(opPopFrame)]);
90819053
90829054 // The pointer may be changed due to reallocation, need to query for it again
@@ -9310,21 +9282,21 @@ procedure TEvilC.Parse;
93109282 IsComparison := False;
93119283 end else
93129284 begin
9313- JumpEnd := Emit([Pointer(opJumpEqual1 ), False, Pointer(0 )]);
9285+ JumpEnd := Emit([Pointer(opJumpEqual1Rel ), False, Pointer(0 )]);
93149286 end ;
93159287 end ;
93169288 ParseBlock;
9317- JumpBlock := Emit([Pointer(opJumpUnconditional ), Pointer(0 )]);
9289+ JumpBlock := Emit([Pointer(opJumpUnconditionalRel ), Pointer(0 )]);
93189290 EndBlock := Self.Binary.Count;
93199291 ContinueList := ContinueStack.Pop;
93209292 BreakList := BreakStack.Pop;
93219293 for I := 0 to ContinueList.Count - 1 do
9322- Patch(Integer(ContinueList[I]), Pointer(StartBlock));
9294+ Patch(Integer(ContinueList[I]), Pointer(StartBlock) - (Integer(ContinueList[I]) - 1 ) );
93239295 for I := 0 to BreakList.Count - 1 do
9324- Patch(Integer(BreakList[I]), Pointer(EndBlock));
9325- Patch(JumpBlock - 1 , Pointer(StartBlock));
9296+ Patch(Integer(BreakList[I]), Pointer(EndBlock) - (Integer(BreakList[I]) - 1 ) );
9297+ Patch(JumpBlock - 1 , Pointer(StartBlock) - (JumpBlock - 2 ) );
93269298 if IsComparison then
9327- Patch(JumpEnd - 1 , Pointer(EndBlock));
9299+ Patch(JumpEnd - 1 , Pointer(EndBlock) - (JumpEnd - 3 ) );
93289300 finally
93299301 ContinueList.Free;
93309302 BreakList.Free;
@@ -9367,20 +9339,20 @@ procedure TEvilC.Parse;
93679339 IsComparison := False;
93689340 end else
93699341 begin
9370- JumpEnd := Emit([Pointer(opJumpEqual1 ), False, Pointer(0 )]);
9342+ JumpEnd := Emit([Pointer(opJumpEqual1Rel ), False, Pointer(0 )]);
93719343 end ;
93729344 end ;
9373- JumpBlock := Emit([Pointer(opJumpUnconditional ), Pointer(0 )]);
9345+ JumpBlock := Emit([Pointer(opJumpUnconditionalRel ), Pointer(0 )]);
93749346 EndBlock := Self.Binary.Count;
93759347 ContinueList := ContinueStack.Pop;
93769348 BreakList := BreakStack.Pop;
93779349 for I := 0 to ContinueList.Count - 1 do
9378- Patch(Integer(ContinueList[I]), Pointer(ContinueBlock));
9350+ Patch(Integer(ContinueList[I]), Pointer(ContinueBlock) - (Integer(ContinueList[I]) - 1 ) );
93799351 for I := 0 to BreakList.Count - 1 do
9380- Patch(Integer(BreakList[I]), Pointer(EndBlock));
9381- Patch(JumpBlock - 1 , Pointer(StartBlock));
9352+ Patch(Integer(BreakList[I]), Pointer(EndBlock) - (Integer(BreakList[I]) - 1 ) );
9353+ Patch(JumpBlock - 1 , Pointer(StartBlock) - (JumpBlock - 2 ) );
93829354 if IsComparison then
9383- Patch(JumpEnd - 1 , Pointer(EndBlock));
9355+ Patch(JumpEnd - 1 , Pointer(EndBlock) - (JumpEnd - 3 ) );
93849356 finally
93859357 ContinueList.Free;
93869358 BreakList.Free;
@@ -9457,18 +9429,18 @@ procedure TEvilC.Parse;
94579429 // EmitPushVar(VarHiddenTargetIdent);
94589430 if Token.Kind = tkTo then
94599431 begin
9460- JumpEnd := Emit([Pointer(opJumpEqualOrGreater2 ), Pointer(VarIdent.Addr), GetIdentLocalValue(VarIdent), Pointer(VarHiddenTargetIdent.Addr), GetIdentLocalValue(VarHiddenTargetIdent), Pointer(0 )]);
9432+ JumpEnd := Emit([Pointer(opJumpEqualOrGreater2Rel ), Pointer(VarIdent.Addr), GetIdentLocalValue(VarIdent), Pointer(VarHiddenTargetIdent.Addr), GetIdentLocalValue(VarHiddenTargetIdent), Pointer(0 )]);
94619433 end else
94629434 if Token.Kind = tkDownto then
94639435 begin
9464- JumpEnd := Emit([Pointer(opJumpEqualOrLesser2 ), Pointer(VarIdent.Addr), GetIdentLocalValue(VarIdent), Pointer(VarHiddenTargetIdent.Addr), GetIdentLocalValue(VarHiddenTargetIdent), Pointer(0 )]);
9436+ JumpEnd := Emit([Pointer(opJumpEqualOrLesser2Rel ), Pointer(VarIdent.Addr), GetIdentLocalValue(VarIdent), Pointer(VarHiddenTargetIdent.Addr), GetIdentLocalValue(VarHiddenTargetIdent), Pointer(0 )]);
94659437 end ;
94669438
94679439 ParseBlock;
94689440
94699441 ContinueBlock := Self.Binary.Count;
94709442 Emit([Pointer(opOperatorInc), Pointer(VarIdent.Addr), GetVarFrame(VarIdent), Step]);
9471- JumpBlock := Emit([Pointer(opJumpUnconditional ), Pointer(0 )]);
9443+ JumpBlock := Emit([Pointer(opJumpUnconditionalRel ), Pointer(0 )]);
94729444 EndBLock := JumpBlock;
94739445 end else
94749446 begin
@@ -9499,7 +9471,7 @@ procedure TEvilC.Parse;
94999471 StartBlock := Self.Binary.Count;
95009472 // EmitPushVar(VarHiddenTargetIdent);
95019473 // EmitPushVar(VarHiddenCountIdent);
9502- JumpEnd := Emit([Pointer(opJumpEqualOrLesser2 ), Pointer(VarHiddenTargetIdent.Addr), GetIdentLocalValue(VarHiddenTargetIdent), Pointer(VarHiddenCountIdent.Addr), GetIdentLocalValue(VarHiddenCountIdent), Pointer(0 )]);
9474+ JumpEnd := Emit([Pointer(opJumpEqualOrLesser2Rel ), Pointer(VarHiddenTargetIdent.Addr), GetIdentLocalValue(VarHiddenTargetIdent), Pointer(VarHiddenCountIdent.Addr), GetIdentLocalValue(VarHiddenCountIdent), Pointer(0 )]);
95039475
95049476 EmitPushVar(VarHiddenArrayIdent);
95059477 EmitPushVar(VarHiddenCountIdent);
@@ -9511,18 +9483,18 @@ procedure TEvilC.Parse;
95119483
95129484 ContinueBlock := Self.Binary.Count;
95139485 Emit([Pointer(opOperatorInc), Pointer(VarHiddenCountIdent.Addr), GetVarFrame(VarHiddenCountIdent), 1 ]);
9514- JumpBlock := Emit([Pointer(opJumpUnconditional ), Pointer(0 )]);
9486+ JumpBlock := Emit([Pointer(opJumpUnconditionalRel ), Pointer(0 )]);
95159487 EndBLock := JumpBlock;
95169488 end ;
95179489
95189490 ContinueList := ContinueStack.Pop;
95199491 BreakList := BreakStack.Pop;
95209492 for I := 0 to ContinueList.Count - 1 do
9521- Patch(Integer(ContinueList[I]), Pointer(ContinueBlock));
9493+ Patch(Integer(ContinueList[I]), Pointer(ContinueBlock) - (Integer(ContinueList[I]) - 1 ) );
95229494 for I := 0 to BreakList.Count - 1 do
9523- Patch(Integer(BreakList[I]), Pointer(EndBlock));
9524- Patch(JumpBlock - 1 , Pointer(StartBlock));
9525- Patch(JumpEnd - 1 , Pointer(EndBlock));
9495+ Patch(Integer(BreakList[I]), Pointer(EndBlock) - (Integer(BreakList[I]) - 1 ) );
9496+ Patch(JumpBlock - 1 , Pointer(StartBlock) - (JumpBlock - 2 ) );
9497+ Patch(JumpEnd - 1 , Pointer(EndBlock) - (JumpEnd - 6 ) );
95269498 finally
95279499 ContinueList.Free;
95289500 BreakList.Free;
@@ -9539,21 +9511,23 @@ procedure TEvilC.Parse;
95399511 JumpEnd: Integer;
95409512 begin
95419513 ParseExpr(False);
9542- JumpBlock1 := Emit([Pointer(opJumpEqual1 ), True, Pointer(0 )]);
9543- JumpBlock2 := Emit([Pointer(opJumpUnconditional ), Pointer(0 )]);
9514+ JumpBlock1 := Emit([Pointer(opJumpEqual1Rel ), True, Pointer(0 )]);
9515+ JumpBlock2 := Emit([Pointer(opJumpUnconditionalRel ), Pointer(0 )]);
95449516 StartBlock1 := Self.Binary.Count;
95459517 ParseBlock;
9546- JumpEnd := Emit([Pointer(opJumpUnconditional), Pointer(0 )]);
95479518 StartBlock2 := Self.Binary.Count;
9519+ JumpEnd := -1 ;
95489520 if PeekAtNextToken.Kind = tkElse then
95499521 begin
9522+ JumpEnd := Emit([Pointer(opJumpUnconditionalRel), Pointer(0 )]);
95509523 NextToken;
95519524 ParseBlock;
95529525 end ;
95539526 EndBlock2 := Self.Binary.Count;
9554- Patch(JumpBlock1 - 1 , Pointer(StartBlock1));
9555- Patch(JumpBlock2 - 1 , Pointer(StartBlock2));
9556- Patch(JumpEnd - 1 , Pointer(EndBlock2));
9527+ Patch(JumpBlock1 - 1 , Pointer(StartBlock1) - (JumpBlock1 - 3 ));
9528+ Patch(JumpBlock2 - 1 , Pointer(StartBlock2) - (JumpBlock2 - 2 ));
9529+ if JumpEnd >= 0 then
9530+ Patch(JumpEnd - 1 , Pointer(EndBlock2) - (JumpEnd - 2 ));
95579531 end ;
95589532
95599533 procedure ParseSwitch ;
@@ -9589,23 +9563,23 @@ procedure TEvilC.Parse;
95899563 begin
95909564 ParseExpr(False);
95919565 EmitPushVar(VarHiddenIdent);
9592- JumpBlock1 := Emit([Pointer(opJumpEqual ), Pointer(0 )]);
9593- JumpBlock2 := Emit([Pointer(opJumpUnconditional ), Pointer(0 )]);
9566+ JumpBlock1 := Emit([Pointer(opJumpEqualRel ), Pointer(0 )]);
9567+ JumpBlock2 := Emit([Pointer(opJumpUnconditionalRel ), Pointer(0 )]);
95949568 end ;
95959569 StartCaseBlock := Self.Binary.Count;
95969570 if JumpNextBlock <> -1 then
95979571 begin
9598- Patch(JumpNextBlock - 1 , Pointer(StartCaseBlock));
9572+ Patch(JumpNextBlock - 1 , Pointer(StartCaseBlock) - (JumpNextBlock - 2 ) );
95999573 JumpNextBlock := -1 ;
96009574 end ;
96019575 PeekAtNextTokenExpected([tkColon]);
96029576 ParseBlock(True);
96039577 if Token.Kind = tkCase then
96049578 begin
9605- JumpNextBlock := Emit([Pointer(opJumpUnconditional ), Pointer(0 )]);
9579+ JumpNextBlock := Emit([Pointer(opJumpUnconditionalRel ), Pointer(0 )]);
96069580 EndCaseBlock := Self.Binary.Count;
9607- Patch(JumpBlock1 - 1 , Pointer(StartCaseBlock));
9608- Patch(JumpBlock2 - 1 , Pointer(EndCaseBlock));
9581+ Patch(JumpBlock1 - 1 , Pointer(StartCaseBlock) - (JumpBlock1 - 2 ) );
9582+ Patch(JumpBlock2 - 1 , Pointer(EndCaseBlock) - (JumpBlock2 - 2 ) );
96099583 end else
96109584 Break;
96119585 end ;
@@ -9615,7 +9589,7 @@ procedure TEvilC.Parse;
96159589 BreakList := BreakStack.Pop;
96169590
96179591 for I := 0 to BreakList.Count - 1 do
9618- Patch(Integer(BreakList[I]), Pointer(EndBlock));
9592+ Patch(Integer(BreakList[I]), Pointer(EndBlock) - (Integer(BreakList[I]) - 1 ) );
96199593 finally
96209594 BreakList.Free;
96219595 end ;
@@ -9836,7 +9810,7 @@ procedure TEvilC.Parse;
98369810 JumpCatchBlock := Emit([Pointer(opPushTrap), Pointer(0 )]);
98379811 ParseBlock;
98389812 Emit([Pointer(opPopTrap)]);
9839- JumpFinallyBlock := Emit([Pointer(opJumpUnconditional ), Pointer(0 )]);
9813+ JumpFinallyBlock := Emit([Pointer(opJumpUnconditionalRel ), Pointer(0 )]);
98409814
98419815 Self.ScopeStack.Push(Self.VarList.Count);
98429816 CatchBlock := Self.Binary.Count;
@@ -9854,7 +9828,7 @@ procedure TEvilC.Parse;
98549828 ParseBlock;
98559829
98569830 Patch(JumpCatchBlock - 1 , Pointer(CatchBlock));
9857- Patch(JumpFinallyBlock - 1 , Pointer(Self.Binary.Count));
9831+ Patch(JumpFinallyBlock - 1 , Pointer(Self.Binary.Count) - (JumpFinallyBlock - 2 ) );
98589832 I := Self.ScopeStack.Pop;
98599833 Self.VarList.DeleteRange(I, Self.VarList.Count - I);
98609834 end ;
@@ -10018,15 +9992,15 @@ procedure TEvilC.Parse;
100189992 if BreakStack.Count = 0 then
100199993 Error(' Not in loop but "break" found' , Token);
100209994 List := BreakStack.Peek;
10021- List.Add(Pointer(Emit([Pointer(opJumpUnconditional ), Pointer(0 )]) - 1 ));
9995+ List.Add(Pointer(Emit([Pointer(opJumpUnconditionalRel ), Pointer(0 )]) - 1 ));
100229996 end ;
100239997 tkContinue:
100249998 begin
100259999 NextToken;
1002610000 if ContinueStack.Count = 0 then
1002710001 Error(' Not in loop but "continue" found' , Token);
1002810002 List := ContinueStack.Peek;
10029- List.Add(Pointer(Emit([Pointer(opJumpUnconditional ), Pointer(0 )]) - 1 ));
10003+ List.Add(Pointer(Emit([Pointer(opJumpUnconditionalRel ), Pointer(0 )]) - 1 ));
1003010004 end ;
1003110005 tkReturn:
1003210006 begin
@@ -10597,11 +10571,10 @@ initialization
1059710571 Pointer(opPushLocalVar), Pointer(0 ), Pointer(0 ),
1059810572 Pointer(opPushConst), false,
1059910573 Pointer(opOperatorEqual),
10600- Pointer(opJumpEqual1 ), true, Pointer(11 ),
10601- Pointer(opJumpUnconditional ), Pointer(17 ),
10574+ Pointer(opJumpEqual1Rel ), true, Pointer(5 ),
10575+ Pointer(opJumpUnconditionalRel ), Pointer(8 ),
1060210576 Pointer(opPushLocalVar), Pointer(1 ), Pointer(0 ),
1060310577 Pointer(opThrow),
10604- Pointer(opJumpUnconditional), Pointer(17 ),
1060510578 Pointer(opPopFrame)
1060610579 ];
1060710580 FunctionThrow := [
0 commit comments