/*
* Copyright 2013 Guidewire Software, Inc.
*/
package gw.internal.gosu.ir.compiler.bytecode;
import gw.lang.ir.IRSymbol;
import java.util.Collection;
import java.util.HashMap;
public class IRCompilerScope {
private IRCompilerScope _parent;
private HashMap<String, IRCompilerLocalVar> _localVars;
private int _size;
private boolean _active = true;
public IRCompilerScope(IRCompilerScope parent) {
_parent = parent;
_localVars = new HashMap<String, IRCompilerLocalVar>();
}
public IRCompilerLocalVar findLocalVar(IRSymbol symbol) {
if (_localVars.containsKey(symbol.getName())) {
return _localVars.get(symbol.getName());
} else if (_parent != null) {
return _parent.findLocalVar(symbol);
} else {
return null;
}
}
public IRCompilerLocalVar createLocalVar(IRSymbol symbol) {
IRCompilerLocalVar existingVar = findLocalVar( symbol );
if (existingVar == null) {
existingVar = new IRCompilerLocalVar(symbol, totalWidth(), this);
_localVars.put(symbol.getName(), existingVar);
_size += existingVar.getWidth();
}
return existingVar;
}
public Collection<IRCompilerLocalVar> getLocalVars() {
return _localVars.values();
}
public int totalWidth() {
return (_parent == null ? 0 : _parent.totalWidth()) + _size;
}
public boolean isActive() {
return _active;
}
public void scopeRemoved() {
_active = false;
}
}