blob: bf9de0c838436ee84ce1d0f8de7738339195ef2d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011, 2012 Sierra Wireless and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Sierra Wireless - initial API and implementation
*******************************************************************************/
package org.eclipse.ldt.debug.core.internal;
import org.eclipse.dltk.dbgp.IDbgpStackLevel;
import org.eclipse.dltk.dbgp.exceptions.DbgpException;
import org.eclipse.dltk.debug.core.model.IScriptStack;
import org.eclipse.dltk.debug.core.model.IScriptStackFrame;
import org.eclipse.dltk.internal.debug.core.model.ScriptStackFrame;
import org.eclipse.dltk.internal.debug.core.model.ScriptThread;
/**
* Stack handling for coroutine threads
*
* It behaves differently of regular ScriptThread because it does not handle smart frame refresh and does lazy loading of stack frames.
*/
public class LuaCoroutineStack implements IScriptStack {
private IScriptStackFrame[] frames;
private final Object framesLock = new Object();
private final LuaCoroutine thread;
public LuaCoroutineStack(LuaCoroutine thread) {
this.thread = thread;
this.frames = null;
}
/**
* @see org.eclipse.dltk.internal.debug.core.model.ScriptStack#requrestStackLevels()
*/
protected IDbgpStackLevel[] requestStackLevels() throws DbgpException {
return thread.getDbgpSession().getCoreCommands().getStackLevels();
}
protected void readFrames() throws DbgpException {
final IDbgpStackLevel[] levels = requestStackLevels();
synchronized (framesLock) {
final IScriptStackFrame[] newFrames = new IScriptStackFrame[levels.length];
for (int i = 0; i < newFrames.length; ++i) {
newFrames[i] = new ScriptStackFrame(this, levels[i]);
}
frames = newFrames;
}
}
/**
* @see #getIScriptThread()
* @see org.eclipse.dltk.debug.core.model.IScriptStack#getThread()
*/
public ScriptThread getThread() {
return thread;
}
/**
* @see org.eclipse.dltk.debug.core.model.IScriptStack#size()
*/
public int size() {
synchronized (framesLock) {
return getFrames().length;
}
}
/**
* @see org.eclipse.dltk.debug.core.model.IScriptStack#hasFrames()
*/
public boolean hasFrames() {
synchronized (framesLock) {
return frames == null ? true : frames.length > 0;
}
}
/**
* @see org.eclipse.dltk.debug.core.model.IScriptStack#getFrames()
*/
public IScriptStackFrame[] getFrames() {
synchronized (framesLock) {
if (frames == null) {
try {
readFrames();
} catch (DbgpException e) {
Activator.logError("Cannot read stack frames", e); //$NON-NLS-1$
}
}
return frames;
}
}
/**
* @see org.eclipse.dltk.debug.core.model.IScriptStack#getTopFrame()
*/
public IScriptStackFrame getTopFrame() {
synchronized (framesLock) {
return getFrames()[0];
}
}
public void updateFrames() {
synchronized (framesLock) {
for (int i = 0; i < frames.length; i++) {
((ScriptStackFrame) frames[i]).updateVariables();
}
}
}
public boolean isInitialized() {
synchronized (framesLock) {
return frames != null;
}
}
}