public CodeGenAnalyser(ISyntaxTreeNode astRoot, bool optimize) { _astRoot = astRoot; _currentLocalIdx = 0; _previousVarKind = VariableDeclaration.Kind.Class; _optimize = optimize; }
public override void Visit(VariableDeclaration node) { if (_pass != 1) return; if (_previousVarKind != node.VariableKind) { _currentLocalIdx = 0; } if (node.VariableKind == VariableDeclaration.Kind.Formal) { // Note: this does not take static methods into account // since the only static method in MiniJava is the main // method and it cannot have parameters. node.LocalIndex = (short) (1 + _currentLocalIdx++); } else if (node.VariableKind == VariableDeclaration.Kind.Local && (!_optimize || node.Used)) { node.LocalIndex = _currentLocalIdx++; } _previousVarKind = node.VariableKind; }