44-- This Script contains the new Compiler
55
66-- The max Number of variables used as registers
7- local MAX_REGS = 100 ;
7+ local MAX_REGS = 40 ;
88
99local Compiler = {};
1010
@@ -25,6 +25,7 @@ function Compiler:new()
2525 };
2626 activeBlock = nil ;
2727 registersForVar = {};
28+ usedRegisters = 0 ;
2829 maxUsedRegister = 0 ;
2930 registerVars = {};
3031
@@ -48,7 +49,6 @@ function Compiler:new()
4849 AstKind .MulExpression ,
4950 AstKind .DivExpression ,
5051 AstKind .ModExpression ,
51- AstKind .NegateExpression ,
5252 AstKind .PowExpression ,
5353 }
5454 };
@@ -78,12 +78,12 @@ function Compiler:setActiveBlock(block)
7878 self .activeBlock = block ;
7979end
8080
81- function Compiler :addStatement (statement , writes , reads , doNotMove )
81+ function Compiler :addStatement (statement , writes , reads , usesUpvals )
8282 table.insert (self .activeBlock .statements , {
8383 statement = statement ,
8484 writes = lookupify (writes ),
8585 reads = lookupify (reads ),
86- doNotMove = doNotMove or false ,
86+ usesUpvals = usesUpvals or false ,
8787 });
8888end
8989
@@ -93,6 +93,7 @@ function Compiler:compile(ast)
9393 self .activeBlock = nil ;
9494 self .registersForVar = {};
9595 self .maxUsedRegister = 0 ;
96+ self .usedRegisters = 0 ;
9697 self .registerVars = {};
9798
9899
@@ -200,52 +201,51 @@ function Compiler:emitContainerFuncBody()
200201 -- Shuffle Blockstats
201202 for i = 2 , # blockstats do
202203 local stat = blockstats [i ];
203- if not stat .doNotMove then
204- local reads = stat .reads ;
205- local writes = stat .writes ;
206- local maxShift = 0 ;
207- for shift = 1 , i - 1 do
208- local stat2 = blockstats [i - shift ];
209-
210- if stat2 .doNotMove then
204+ local reads = stat .reads ;
205+ local writes = stat .writes ;
206+ local maxShift = 0 ;
207+ local usesUpvals = stat .usesUpvals ;
208+ for shift = 1 , i - 1 do
209+ local stat2 = blockstats [i - shift ];
210+
211+ if stat2 .usesUpvals and usesUpvals then
212+ break ;
213+ end
214+
215+ local reads2 = stat2 .reads ;
216+ local writes2 = stat2 .writes ;
217+ local f = true ;
218+
219+ for r , b in pairs (reads2 ) do
220+ if (writes [r ]) then
221+ f = false ;
211222 break ;
212223 end
224+ end
213225
214- local reads2 = stat2 .reads ;
215- local writes2 = stat2 .writes ;
216- local f = true ;
217-
218- for r , b in pairs (reads2 ) do
226+ if f then
227+ for r , b in pairs (writes2 ) do
219228 if (writes [r ]) then
220229 f = false ;
221230 break ;
222231 end
223- end
224-
225- if f then
226- for r , b in pairs (writes2 ) do
227- if (writes [r ]) then
228- f = false ;
229- break ;
230- end
231- if (reads [r ]) then
232- f = false ;
233- break ;
234- end
232+ if (reads [r ]) then
233+ f = false ;
234+ break ;
235235 end
236236 end
237+ end
237238
238- if not f then
239- break
240- end
241-
242- maxShift = shift ;
239+ if not f then
240+ break
243241 end
244242
245- local shift = math.random (0 , maxShift );
246- for j = 1 , shift do
243+ maxShift = shift ;
244+ end
245+
246+ local shift = math.random (0 , maxShift );
247+ for j = 1 , shift do
247248 blockstats [i - j ], blockstats [i - j + 1 ] = blockstats [i - j + 1 ], blockstats [i - j ];
248- end
249249 end
250250 end
251251
@@ -304,11 +304,13 @@ end
304304
305305function Compiler :freeRegister (id , force )
306306 if force or not (self .registers [id ] == self .VAR_REGISTER ) then
307+ self .usedRegisters = self .usedRegisters - 1 ;
307308 self .registers [id ] = false
308309 end
309310end
310311
311312function Compiler :allocRegister (isVar , isUpval )
313+ self .usedRegisters = self .usedRegisters + 1 ;
312314
313315 -- POS register can be temporarily used
314316 if not isVar and not self .registers [self .POS_REGISTER ] then
@@ -323,9 +325,15 @@ function Compiler:allocRegister(isVar, isUpval)
323325 end
324326
325327 local id = 0 ;
326- repeat
327- id = id + 1 ;
328- until not self .registers [id ];
328+ if self .usedRegisters < MAX_REGS * 0.75 then
329+ repeat
330+ id = math.random (1 , MAX_REGS - 1 );
331+ until not self .registers [id ];
332+ else
333+ repeat
334+ id = id + 1 ;
335+ until not self .registers [id ];
336+ end
329337
330338 if id > self .maxUsedRegister then
331339 self .maxUsedRegister = id ;
@@ -483,6 +491,16 @@ function Compiler:jmp(scope, to)
483491end
484492
485493function Compiler :setPos (scope , val )
494+ if not val then
495+ local v ;
496+ if math.random (1 , 2 ) == 1 then
497+ v = Ast .NilExpression ();
498+ else
499+ v = Ast .BooleanExpression (false );
500+ end
501+ scope :addReferenceToHigherScope (self .containerFuncScope , self .posVar );
502+ return Ast .AssignmentStatement ({Ast .AssignmentVariable (self .containerFuncScope , self .posVar )}, {v });
503+ end
486504 scope :addReferenceToHigherScope (self .containerFuncScope , self .posVar );
487505 return Ast .AssignmentStatement ({Ast .AssignmentVariable (self .containerFuncScope , self .posVar )}, {Ast .NumberExpression (val ) or Ast .NilExpression ()});
488506end
@@ -513,7 +531,7 @@ function Compiler:compileTopNode(node)
513531 if (self .activeBlock .advanceToNextBlock ) then
514532 self .activeBlock .advanceToNextBlock = false ;
515533 self :addStatement (self :setPos (self .activeBlock .scope , nil ), {self .POS_REGISTER }, {}, false );
516- self :addStatement (self :setReturn (self .activeBlock .scope , Ast .TableConstructorExpression ({})), {self .RETURN_REGISTER }, {})
534+ self :addStatement (self :setReturn (self .activeBlock .scope , Ast .TableConstructorExpression ({})), {self .RETURN_REGISTER }, {}, false )
517535 end
518536
519537 self :resetRegisters ();
@@ -551,7 +569,7 @@ function Compiler:compileStatement(statement, funcDepth)
551569 self :freeRegister (reg , false );
552570 end
553571
554- self :addStatement (self :setReturn (scope , Ast .TableConstructorExpression (entries )), {self .RETURN_REGISTER }, regs , true );
572+ self :addStatement (self :setReturn (scope , Ast .TableConstructorExpression (entries )), {self .RETURN_REGISTER }, regs , false );
555573 self .activeBlock .advanceToNextBlock = false ;
556574 self :addStatement (self :setPos (self .activeBlock .scope , nil ), {self .POS_REGISTER }, {}, false );
557575
@@ -582,7 +600,7 @@ function Compiler:compileStatement(statement, funcDepth)
582600 self :freeRegister (exprregs [i ], false );
583601 end
584602
585- self :addStatement (self :copyRegisters (scope , varregs , exprregs ), varregs , exprregs );
603+ self :addStatement (self :copyRegisters (scope , varregs , exprregs ), varregs , exprregs , false );
586604 return ;
587605 end
588606
@@ -597,7 +615,7 @@ function Compiler:compileStatement(statement, funcDepth)
597615 table.insert (argRegs , self :compileExpression (expr , funcDepth , 1 )[1 ]);
598616 end
599617
600- self :addStatement (self :setRegister (scope , retReg , Ast .FunctionCallExpression (self :register (scope , baseReg ), self :registerList (scope , argRegs ))), {retReg }, {baseReg , argRegs }, true );
618+ self :addStatement (self :setRegister (scope , retReg , Ast .FunctionCallExpression (self :register (scope , baseReg ), self :registerList (scope , argRegs ))), {retReg }, {baseReg , unpack ( argRegs ) }, true );
601619 self :freeRegister (baseReg , false );
602620 self :freeRegister (retReg , false );
603621 for i , reg in ipairs (argRegs ) do
@@ -618,8 +636,8 @@ function Compiler:compileStatement(statement, funcDepth)
618636 table.insert (argRegs , self :compileExpression (expr , funcDepth , 1 )[1 ]);
619637 end
620638
621- self :addStatement (self :setRegister (scope , tmpReg , Ast .StringExpression (statement .passSelfFunctionName )), {tmpReg }, {});
622- self :addStatement (self :setRegister (scope , tmpReg , Ast .IndexExpression (self :register (scope , baseReg ), self :register (scope , tmpReg ))), {tmpReg }, {tmpReg , baseReg });
639+ self :addStatement (self :setRegister (scope , tmpReg , Ast .StringExpression (statement .passSelfFunctionName )), {tmpReg }, {}, false );
640+ self :addStatement (self :setRegister (scope , tmpReg , Ast .IndexExpression (self :register (scope , baseReg ), self :register (scope , tmpReg ))), {tmpReg }, {tmpReg , baseReg }, false );
623641
624642 self :addStatement (self :setRegister (scope , tmpReg , Ast .FunctionCallExpression (self :register (scope , tmpReg ), self :registerList (scope , argRegs ))), {tmpReg }, {tmpReg , unpack (argRegs )}, true );
625643 self :freeRegister (baseReg , false );
@@ -645,9 +663,9 @@ function Compiler:compileExpression(expression, funcDepth, numReturns)
645663 for i = 1 , numReturns , 1 do
646664 regs [i ] = self :allocRegister ();
647665 if (i == 1 ) then
648- self :addStatement (self :setRegister (scope , regs [i ], Ast .StringExpression (expression .value )), {regs [i ]}, {});
666+ self :addStatement (self :setRegister (scope , regs [i ], Ast .StringExpression (expression .value )), {regs [i ]}, {}, false );
649667 else
650- self :addStatement (self :setRegister (scope , regs [i ], Ast .NilExpression ()), {regs [i ]}, {});
668+ self :addStatement (self :setRegister (scope , regs [i ], Ast .NilExpression ()), {regs [i ]}, {}, false );
651669 end
652670 end
653671 return regs ;
@@ -659,9 +677,9 @@ function Compiler:compileExpression(expression, funcDepth, numReturns)
659677 for i = 1 , numReturns do
660678 regs [i ] = self :allocRegister ();
661679 if (i == 1 ) then
662- self :addStatement (self :setRegister (scope , regs [i ], Ast .NumberExpression (expression .value )), {regs [i ]}, {});
680+ self :addStatement (self :setRegister (scope , regs [i ], Ast .NumberExpression (expression .value )), {regs [i ]}, {}, false );
663681 else
664- self :addStatement (self :setRegister (scope , regs [i ], Ast .NilExpression ()), {regs [i ]}, {});
682+ self :addStatement (self :setRegister (scope , regs [i ], Ast .NilExpression ()), {regs [i ]}, {}, false );
665683 end
666684 end
667685 return regs ;
@@ -673,9 +691,9 @@ function Compiler:compileExpression(expression, funcDepth, numReturns)
673691 for i = 1 , numReturns do
674692 regs [i ] = self :allocRegister ();
675693 if (i == 1 ) then
676- self :addStatement (self :setRegister (scope , regs [i ], Ast .BooleanExpression (expression .value )), {regs [i ]}, {});
694+ self :addStatement (self :setRegister (scope , regs [i ], Ast .BooleanExpression (expression .value )), {regs [i ]}, {}, false );
677695 else
678- self :addStatement (self :setRegister (scope , regs [i ], Ast .NilExpression ()), {regs [i ]}, {});
696+ self :addStatement (self :setRegister (scope , regs [i ], Ast .NilExpression ()), {regs [i ]}, {}, false );
679697 end
680698 end
681699 return regs ;
@@ -686,7 +704,7 @@ function Compiler:compileExpression(expression, funcDepth, numReturns)
686704 local regs = {};
687705 for i = 1 , numReturns do
688706 regs [i ] = self :allocRegister ();
689- self :addStatement (self :setRegister (scope , regs [i ], Ast .NilExpression ()), {regs [i ]}, {});
707+ self :addStatement (self :setRegister (scope , regs [i ], Ast .NilExpression ()), {regs [i ]}, {}, false );
690708 end
691709 return regs ;
692710 end
@@ -701,16 +719,16 @@ function Compiler:compileExpression(expression, funcDepth, numReturns)
701719 -- Global Variable
702720 regs [i ] = self :allocRegister (false , false );
703721 local tmpReg = self :allocRegister (false , false );
704- self :addStatement (self :setRegister (scope , tmpReg , Ast .StringExpression (expression .scope :getVariableName (expression .id ))), {tmpReg }, {});
705- self :addStatement (self :setRegister (scope , regs [i ], Ast .IndexExpression (self :env (scope ), self :register (scope , tmpReg ))), {regs [i ]}, {tmpReg });
722+ self :addStatement (self :setRegister (scope , tmpReg , Ast .StringExpression (expression .scope :getVariableName (expression .id ))), {tmpReg }, {}, false );
723+ self :addStatement (self :setRegister (scope , regs [i ], Ast .IndexExpression (self :env (scope ), self :register (scope , tmpReg ))), {regs [i ]}, {tmpReg }, true );
706724 self :freeRegister (tmpReg , false );
707725 else
708726 -- Local Variable
709727 regs [i ] = self :getVarRegister (expression .scope , expression .id );
710728 end
711729 else
712730 regs [i ] = self :allocRegister ();
713- self :addStatement (self :setRegister (scope , regs [i ], Ast .NilExpression ()), {regs [i ]}, {});
731+ self :addStatement (self :setRegister (scope , regs [i ], Ast .NilExpression ()), {regs [i ]}, {}, false );
714732 end
715733 end
716734 return regs ;
@@ -754,8 +772,8 @@ function Compiler:compileExpression(expression, funcDepth, numReturns)
754772 table.insert (argRegs , self :compileExpression (expr , funcDepth , 1 )[1 ]);
755773 end
756774
757- self :addStatement (self :setRegister (scope , tmpReg , Ast .StringExpression (expression .passSelfFunctionName )), {tmpReg }, {});
758- self :addStatement (self :setRegister (scope , tmpReg , Ast .IndexExpression (self :register (scope , baseReg ), self :register (scope , tmpReg ))), {tmpReg }, {baseReg , tmpReg });
775+ self :addStatement (self :setRegister (scope , tmpReg , Ast .StringExpression (expression .passSelfFunctionName )), {tmpReg }, {}, false );
776+ self :addStatement (self :setRegister (scope , tmpReg , Ast .IndexExpression (self :register (scope , baseReg ), self :register (scope , tmpReg ))), {tmpReg }, {baseReg , tmpReg }, false );
759777
760778 self :addStatement (self :setRegisters (scope , retRegs , {Ast .FunctionCallExpression (self :register (scope , tmpReg ), self :registerList (scope , argRegs ))}), retRegs , {tmpReg , unpack (argRegs )}, true )
761779 self :freeRegister (baseReg , false );
@@ -775,11 +793,11 @@ function Compiler:compileExpression(expression, funcDepth, numReturns)
775793 local baseReg = self :compileExpression (expression .base , funcDepth , 1 )[1 ];
776794 local indexReg = self :compileExpression (expression .index , funcDepth , 1 )[1 ];
777795
778- self :addStatement (self :setRegister (scope , regs [i ], Ast .IndexExpression (self :register (scope , baseReg ), self :register (scope , indexReg ))), {regs [i ]}, {baseReg , indexReg });
796+ self :addStatement (self :setRegister (scope , regs [i ], Ast .IndexExpression (self :register (scope , baseReg ), self :register (scope , indexReg ))), {regs [i ]}, {baseReg , indexReg }, false );
779797 self :freeRegister (baseReg , false );
780798 self :freeRegister (indexReg , false )
781799 else
782- self :addStatement (self :setRegister (scope , regs [i ], Ast .NilExpression ()), {regs [i ]}, {});
800+ self :addStatement (self :setRegister (scope , regs [i ], Ast .NilExpression ()), {regs [i ]}, {}, false );
783801 end
784802 end
785803 return regs ;
@@ -794,11 +812,43 @@ function Compiler:compileExpression(expression, funcDepth, numReturns)
794812 local lhsReg = self :compileExpression (expression .lhs , funcDepth , 1 )[1 ];
795813 local rhsReg = self :compileExpression (expression .rhs , funcDepth , 1 )[1 ];
796814
797- self :addStatement (self :setRegister (scope , regs [i ], Ast [expression .kind ](self :register (scope , lhsReg ), self :register (scope , rhsReg ))), {regs [i ]}, {lhsReg , rhsReg });
815+ self :addStatement (self :setRegister (scope , regs [i ], Ast [expression .kind ](self :register (scope , lhsReg ), self :register (scope , rhsReg ))), {regs [i ]}, {lhsReg , rhsReg }, false );
798816 self :freeRegister (rhsReg , false );
799817 self :freeRegister (lhsReg , false )
800818 else
801- self :addStatement (self :setRegister (scope , regs [i ], Ast .NilExpression ()), {regs [i ]}, {});
819+ self :addStatement (self :setRegister (scope , regs [i ], Ast .NilExpression ()), {regs [i ]}, {}, false );
820+ end
821+ end
822+ return regs ;
823+ end
824+
825+ if (expression .kind == AstKind .NotExpression ) then
826+ local regs = {};
827+ for i = 1 , numReturns do
828+ regs [i ] = self :allocRegister ();
829+ if (i == 1 ) then
830+ local rhsReg = self :compileExpression (expression .rhs , funcDepth , 1 )[1 ];
831+
832+ self :addStatement (self :setRegister (scope , regs [i ], Ast .NotExpression (self :register (scope , rhsReg ))), {regs [i ]}, {rhsReg }, false );
833+ self :freeRegister (rhsReg , false )
834+ else
835+ self :addStatement (self :setRegister (scope , regs [i ], Ast .NilExpression ()), {regs [i ]}, {}, false );
836+ end
837+ end
838+ return regs ;
839+ end
840+
841+ if (expression .kind == AstKind .NegateExpression ) then
842+ local regs = {};
843+ for i = 1 , numReturns do
844+ regs [i ] = self :allocRegister ();
845+ if (i == 1 ) then
846+ local rhsReg = self :compileExpression (expression .rhs , funcDepth , 1 )[1 ];
847+
848+ self :addStatement (self :setRegister (scope , regs [i ], Ast .NegateExpression (self :register (scope , rhsReg ))), {regs [i ]}, {rhsReg }, false );
849+ self :freeRegister (rhsReg , false )
850+ else
851+ self :addStatement (self :setRegister (scope , regs [i ], Ast .NilExpression ()), {regs [i ]}, {}, false );
802852 end
803853 end
804854 return regs ;
0 commit comments