@@ -1308,6 +1308,52 @@ function Compiler:compileStatement(statement, funcDepth)
1308
1308
-- Function Declaration
1309
1309
if (statement .kind == AstKind .FunctionDeclaration ) then
1310
1310
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
1311
1357
if statement .scope .isGlobal then
1312
1358
local tmpReg = self :allocRegister (false );
1313
1359
self :addStatement (self :setRegister (scope , tmpReg , Ast .StringExpression (statement .scope :getVariableName (statement .id ))), {tmpReg }, {}, false );
0 commit comments