Skip to main content
aboutsummaryrefslogtreecommitdiffstats
blob: e64f220500f619e5d070b9ba204dff60baa1a1ce (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
/*******************************************************************************
 * Copyright (c) 2005, 2007 IBM Corporation 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:
 *     IBM Corporation - initial API and implementation
 *     Bjorn Freeman-Benson - initial API and implementation
 *******************************************************************************/
package org.eclipse.debug.examples.core.pda.model;

import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.IBreakpointManager;
import org.eclipse.debug.core.model.DebugElement;
import org.eclipse.debug.core.model.IDebugTarget;
import org.eclipse.debug.examples.core.pda.DebugCorePlugin;


/**
 * Common function for PDA debug elements.
 */
public class PDADebugElement extends DebugElement {

	/**
	 * Constructs a new debug element in the given target.
	 * 
	 * @param target debug target
	 */
	public PDADebugElement(IDebugTarget target) {
		super(target);
	}

	/* (non-Javadoc)
	 * @see org.eclipse.debug.core.model.IDebugElement#getModelIdentifier()
	 */
	public String getModelIdentifier() {
		return DebugCorePlugin.ID_PDA_DEBUG_MODEL;
	}
	
	/**
	 * Sends a request to the PDA interpreter, waits for and returns the reply.
	 * <p>
	 * Interpreter commands and replies are as follows:
	 * <ul>
	 * <li><code>clear N</code> - clear the breakpoint on line <code>N</code>;
	 * 		reply is <code>ok</code></li>
	 * <li><code>data</code> - return the contents of the data stack; reply is the data
	 * 		from oldest to newest as a single string <code>"value|value|value|...|value|"</code></li>
	 * <li><code>drop</code> - pops the top stack frame off the call stack setting the 
	 * 		instruction pointer to the calling statement in the calling frame</li>
	 * <li><code>eventstop E B</code> - optionally stop the interpreter when an error event
	 * 		<code>E</code> is encountered; <code>B</code> specifies stop (<code>1</code>) or
	 * 		continue (<code>0</code>). The possible events are <code>unimpinstr</code> and
	 * 		<code>nosuchlabel</code>. Reply is <code>ok</code>. When an event is encountered,
	 * 		the interpreter sends the error event (for example <code>unimlpemented instruction foo</code>)
	 * 		and corresponding suspend event (for example <code>suspended event unimpinstr</code>).</li>
	 * <li><code>exit</code> - end the interpreter; reply is <code>ok</code></li>
	 * <li><code>popdata</code> - pop the top value off the data stack; reply is the value</li>
	 * <li><code>pushdata V</code> - push the value <code>V</code> onto the data stack; reply is
	 * 		<code>ok</code></li>
	 * <li><code>resume</code> - resume execution of the program; reply is <code>ok</code></li>
	 * <li><code>set N</code> - set a line breakpoint on line <code>N</code> (lines are indexed
	 * 		from 0); reply is <code>ok</code></li>
	 * <li><code>setdata N V</code> - set the contents of data stack element <code>N</code> to
	 * 		value <code>V</code> (the data stack is indexed from 0, 0 being the oldest); reply
	 * 		is <code>ok</code></li>
	 * <li><code>setvar N M V</code> - set the contents of variable <code>M</code> from the control
	 * 		stack <code>N</code> to value <code>V</code> (the control stack is indexed from 0,
	 * 		0 being the oldest); reply is <code>ok</code></li>
	 * <li><code>stack</code> - return the contents of the control stack (program counters, function and
	 * 		variable names); reply is control stack from oldest to newest as a single string
	 * 		<code>frame#frame#frame...#frame</code> where each frame is a string
	 * 		<code>"filename|pc|function name|variable name|variable name|...|variable name"</code></li>
	 * <li><code>step</code> - single step forward; reply is <code>ok</code></li>
	 * <li><code>stepreturn</code> - single step forward until the next <code>return</code> op code;
	 * 		stop before executing the <code>return</code> ; reply is <code>ok</code></li>
	 * <li><code>suspend</code> - suspend execution of the program and listen for debug commands;
	 * 		reply is <code>ok</code></li>
	 * <li><code>watch F::V M</code> - set a watchpoint on variable <code>V</code> in function
	 * 		<code>F</code> to magic value <code>M</code>; the magic value is a bit flag corresponding
	 * 		to read access (1), write access (2), or both (3); the magic value 0 clears the watchpoint;
	 * 		reply is <code>ok</code></li>
	 * <li><code>var N M</code> - return the contents of variable <code>M</code> in the control
	 * 		stack frame <code>N</code> (stack frames are indexed from 0, 0 being the oldest);
	 * 		reply is variable value</li>
	 * </ul>
	 * </p>
	 * 
	 * @param request command
	 * @return reply
	 * @throws DebugException if the request fails
	 */	
	public String sendRequest(String request) throws DebugException {
		return getPDADebugTarget().sendRequest(request);
	}
	
	/**
	 * Returns the debug target as a PDA target.
	 * 
	 * @return PDA debug target
	 */
	protected PDADebugTarget getPDADebugTarget() {
	    return (PDADebugTarget) getDebugTarget();
	}
	
	/**
	 * Returns the breakpoint manager
	 * 
     * @return the breakpoint manager
     */
    protected IBreakpointManager getBreakpointManager() {
        return DebugPlugin.getDefault().getBreakpointManager();
    }	
}

Back to the top