private void ResolveExprBlock(Grammar.ASTNodeExprBlock exprBlock, ref int curSegment, Core.DataAccess outputReg) { // Generate an empty tuple store if there are no subexpressions. if (exprBlock.subexprs.Count == 0) { funct.AddInstruction(curSegment, Core.InstructionMoveLiteralTuple.Empty(exprBlock.GetSpan().Displace(1, -1), outputReg)); return; } // Store the indices marking inner locals/registers. var localScopeIndexBefore = localScopeLivenesses.Count; var registerIndexBefore = funct.registerTypes.Count; for (int i = 0; i < exprBlock.subexprs.Count; i++) { try { var subexprOutput = outputReg; if (i < exprBlock.subexprs.Count - 1) { subexprOutput = new Core.DataAccessDiscard(); } this.ResolveExpr(exprBlock.subexprs[i], ref curSegment, subexprOutput); } catch (Core.CheckException) { } } // Mark inner locals as out-of-scope. for (var i = localScopeIndexBefore; i < localScopeLivenesses.Count; i++) { localScopeLivenesses[i] = false; } // Deinit inner registers. for (var i = funct.registerTypes.Count - 1; i >= registerIndexBefore; i--) { funct.AddInstruction(curSegment, Core.InstructionDeinit.ForRegister(i)); } }
private void ResolveExprBlock(Grammar.ASTNodeExprBlock exprBlock, ref int curSegment, Core.DataAccess outputReg) { // Generate an empty tuple store if there are no subexpressions. if (exprBlock.subexprs.Count == 0) { funct.AddInstruction(curSegment, Core.InstructionMoveLiteralTuple.Empty(exprBlock.GetSpan().Displace(1, -1), outputReg)); return; } // Store the indices marking inner locals/registers. var localScopeIndexBefore = localScopeLivenesses.Count; var registerIndexBefore = funct.registerTypes.Count; for (int i = 0; i < exprBlock.subexprs.Count; i++) { try { var subexprOutput = outputReg; if (i < exprBlock.subexprs.Count - 1) subexprOutput = new Core.DataAccessDiscard(); this.ResolveExpr(exprBlock.subexprs[i], ref curSegment, subexprOutput); } catch (Core.CheckException) { } } // Mark inner locals as out-of-scope. for (var i = localScopeIndexBefore; i < localScopeLivenesses.Count; i++) localScopeLivenesses[i] = false; // Deinit inner registers. for (var i = funct.registerTypes.Count - 1; i >= registerIndexBefore; i--) funct.AddInstruction(curSegment, Core.InstructionDeinit.ForRegister(i)); }