/** * Copyright (c) 2009-2011, The HATS Consortium. All rights reserved. * This file is licensed under the terms of the Modified BSD License. */ package abs.backend.java.lib.runtime; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import abs.backend.java.lib.runtime.TaskStack.Frame; import abs.backend.java.lib.types.ABSValue; import abs.backend.java.observing.MethodView; import abs.backend.java.observing.TaskStackFrameView; import abs.backend.java.observing.TaskStackView; import abs.backend.java.observing.TaskView; /** * TaskStack represents the stack of a task at runtime. * The stack consists of multiple TaskStack.Frames, which * represent a single stack frame of a method invocation. * * @author Jan Schäfer */ class TaskStack implements TaskStackView { private final List<Frame> frames = new ArrayList<Frame>(); private final Task<?> task; TaskStack(Task<?> task) { this.task = task; } synchronized Frame pushNewFrame(MethodView method) { Frame f = new Frame(method); frames.add(f); return f; } synchronized Frame popFrame() { return frames.remove(frames.size()-1); } synchronized int getDepth() { return frames.size(); } public class Frame implements TaskStackFrameView { private final Map<String,ABSValue> values = new HashMap<String,ABSValue>(); private final MethodView method; Frame(MethodView v) { method = v; } @Override public synchronized Set<String> getVariableNames() { return values.keySet(); } @Override public synchronized ABSValue getValue(String variableName) { return values.get(variableName); } synchronized void setValue(String variableName, ABSValue v) { values.put(variableName, v); } @Override public TaskStackView getStack() { return TaskStack.this; } @Override public MethodView getMethod() { return method; } } @Override public List<? extends TaskStackFrameView> getFrames() { return Collections.unmodifiableList(frames); } @Override public synchronized Frame getCurrentFrame() { return frames.get(frames.size()-1); } @Override public synchronized boolean hasFrames() { return ! frames.isEmpty(); } @Override public TaskView getTask() { return task.getView(); } }