@@ -1308,6 +1308,52 @@ function Compiler:compileStatement(statement, funcDepth)
13081308 -- Function Declaration
13091309 if (statement .kind == AstKind .FunctionDeclaration ) then
13101310 local retReg = self :compileFunction (statement , funcDepth );
1311+ if (# statement .indices > 0 ) then
1312+ local tblReg ;
1313+ if statement .scope .isGlobal then
1314+ tblReg = self :allocRegister (false );
1315+ self :addStatement (self :setRegister (scope , tblReg , Ast .StringExpression (statement .scope :getVariableName (statement .id ))), {tblReg }, {}, false );
1316+ self :addStatement (self :setRegister (scope , tblReg , Ast .IndexExpression (self :env (scope ), self :register (scope , tblReg ))), {tblReg }, {tblReg }, true );
1317+ else
1318+ if self .scopeFunctionDepths [statement .scope ] == funcDepth then
1319+ if self :isUpvalue (statement .scope , statement .id ) then
1320+ tblReg = self :allocRegister (false );
1321+ local reg = self :getVarRegister (statement .scope , statement .id , funcDepth );
1322+ self :addStatement (self :setRegister (scope , tblReg , self :getUpvalueMember (scope , self :register (scope , reg ))), {tblReg }, {reg }, true );
1323+ else
1324+ tblReg = self :getVarRegister (statement .scope , statement .id , funcDepth , retReg );
1325+ end
1326+ else
1327+ tblReg = self :allocRegister (false );
1328+ local upvalId = self :getUpvalueId (statement .scope , statement .id );
1329+ scope :addReferenceToHigherScope (self .containerFuncScope , self .currentUpvaluesVar );
1330+ self :addStatement (self :setRegister (scope , tblReg , self :getUpvalueMember (scope , Ast .IndexExpression (Ast .VariableExpression (self .containerFuncScope , self .currentUpvaluesVar ), Ast .NumberExpression (upvalId )))), {tblReg }, {}, true );
1331+ end
1332+ end
1333+
1334+ for i = 1 , # statement .indices - 1 do
1335+ local index = statement .indices [i ];
1336+ local indexReg = self :compileExpression (Ast .StringExpression (index ), funcDepth , 1 )[1 ];
1337+ local tblRegOld = tblReg ;
1338+ tblReg = self :allocRegister (false );
1339+ self :addStatement (self :setRegister (scope , tblReg , Ast .IndexExpression (self :register (scope , tblRegOld ), self :register (scope , indexReg ))), {tblReg }, {tblReg , indexReg }, false );
1340+ self :freeRegister (tblRegOld , false );
1341+ self :freeRegister (indexReg , false );
1342+ end
1343+
1344+ local index = statement .indices [# statement .indices ];
1345+ local indexReg = self :compileExpression (Ast .StringExpression (index ), funcDepth , 1 )[1 ];
1346+ self :addStatement (Ast .AssignmentStatement ({
1347+ Ast .AssignmentIndexing (self :register (scope , tblReg ), self :register (scope , indexReg )),
1348+ }, {
1349+ self :register (scope , retReg ),
1350+ }), {}, {tblReg , indexReg , retReg }, true );
1351+ self :freeRegister (indexReg , false );
1352+ self :freeRegister (tblReg , false );
1353+ self :freeRegister (retReg , false );
1354+
1355+ return ;
1356+ end
13111357 if statement .scope .isGlobal then
13121358 local tmpReg = self :allocRegister (false );
13131359 self :addStatement (self :setRegister (scope , tmpReg , Ast .StringExpression (statement .scope :getVariableName (statement .id ))), {tmpReg }, {}, false );
0 commit comments