blob: a0658a5c40a9c3f6f3378139154b536e2377fa6e [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package flash.tools.debugger.concrete;
import java.lang.ArrayIndexOutOfBoundsException;
import java.io.UnsupportedEncodingException;
import flash.tools.debugger.Isolate;
import flash.util.FieldFormat;
import flash.util.Trace;
/**
* DMessage.java
*
* Wraps the contents of a specific message and provides a set of APIs that allow for
* typed extraction of fields within the message.
*
* No interpretation of the messages contents is performed, this is left to the
* user of this class. The code was constructed in this fashion, so that it more
* closely mimics the DataReader/DataWriter classes used in the Player code.
*
* The type of the message should be one of the InXXX or OutXXX constant integers,
* but no checking of conformance is provided in this class.
*/
public class DMessage
{
/**
* This set of constants defines the message types RECEIVED from the player
* through our debug socket
*/
public static final int InUnknown = -1;
public static final int InSetMenuState = 0;
public static final int InSetProperty = 1;
public static final int InExit = 2;
public static final int InNewObject = 3;
public static final int InRemoveObject = 4;
public static final int InTrace = 5;
public static final int InErrorTarget = 6;
public static final int InErrorExecLimit = 7;
public static final int InErrorWith = 8;
public static final int InErrorProtoLimit = 9;
public static final int InSetVariable = 10;
public static final int InDeleteVariable = 11;
public static final int InParam = 12;
public static final int InPlaceObject = 13;
public static final int InScript = 14;
public static final int InAskBreakpoints = 15;
public static final int InBreakAt = 16;
public static final int InContinue = 17;
public static final int InSetLocalVariables = 18;
public static final int InSetBreakpoint = 19;
public static final int InNumScript = 20;
public static final int InRemoveScript = 21;
public static final int InRemoveBreakpoint = 22;
public static final int InNotSynced = 23;
public static final int InErrorURLOpen = 24;
public static final int InProcessTag = 25;
public static final int InVersion = 26;
public static final int InBreakAtExt = 27;
public static final int InSetVariable2 = 28;
public static final int InSquelch = 29;
public static final int InGetVariable = 30;
public static final int InFrame = 31;
public static final int InOption = 32;
public static final int InWatch = 33;
public static final int InGetSwf = 34;
public static final int InGetSwd = 35;
public static final int InErrorException = 36;
public static final int InErrorStackUnderflow = 37;
public static final int InErrorZeroDivide = 38;
public static final int InErrorScriptStuck = 39;
public static final int InBreakReason = 40;
public static final int InGetActions = 41;
public static final int InSwfInfo = 42;
public static final int InConstantPool = 43;
public static final int InErrorConsole = 44;
public static final int InGetFncNames = 45;
// 46 through 52 are for profiling
public static final int InCallFunction = 54;
public static final int InWatch2 = 55;
public static final int InPassAllExceptionsToDebugger = 56;
public static final int InBinaryOp = 57;
public static final int InIsolateCreate = 58;
public static final int InIsolateExit = 59;
public static final int InIsolateEnumerate = 60;
public static final int InSetActiveIsolate = 61;
public static final int InIsolate = 62;
public static final int InSetExceptionBreakpoint = 63;
public static final int InRemoveExceptionBreakpoint = 64;
// If you add another message here, adjust the following line
// and add a new case to the inTypeName() method below.
public static final int InSIZE = InRemoveExceptionBreakpoint + 1; /* last ID used +1 */
/**
* This set of constants defines the message types SENT to the player from our
* debug socket (WARNING: ID space overlaps with InXXX)
*/
public static final int OutUnknown = -2;
public static final int OutZoomIn = 0;
public static final int OutZoomOut = 1;
public static final int OutZoom100 = 2;
public static final int OutHome = 3;
public static final int OutSetQuality = 4;
public static final int OutPlay = 5;
public static final int OutLoop = 6;
public static final int OutRewind = 7;
public static final int OutForward = 8;
public static final int OutBack = 9;
public static final int OutPrint = 10;
public static final int OutSetVariable = 11;
public static final int OutSetProperty = 12;
public static final int OutExit = 13;
public static final int OutSetFocus = 14;
public static final int OutContinue = 15;
public static final int OutStopDebug = 16;
public static final int OutSetBreakpoints = 17;
public static final int OutRemoveBreakpoints = 18;
public static final int OutRemoveAllBreakpoints = 19;
public static final int OutStepOver = 20;
public static final int OutStepInto = 21;
public static final int OutStepOut = 22;
public static final int OutProcessedTag = 23;
public static final int OutSetSquelch = 24;
public static final int OutGetVariable = 25;
public static final int OutGetFrame = 26;
public static final int OutGetOption = 27;
public static final int OutSetOption = 28;
public static final int OutAddWatch = 29; // 16-bit id; used for as2
public static final int OutRemoveWatch = 30; // 16-bit id; used for as2
public static final int OutStepContinue = 31;
public static final int OutGetSwf = 32;
public static final int OutGetSwd = 33;
public static final int OutGetVariableWhichInvokesGetter = 34;
public static final int OutGetBreakReason = 35;
public static final int OutGetActions = 36;
public static final int OutSetActions = 37;
public static final int OutSwfInfo = 38;
public static final int OutConstantPool = 39;
public static final int OutGetFncNames = 40;
// 41 through 47 are for profiling
public static final int OutCallFunction = 48;
public static final int OutAddWatch2 = 49; // 32-bit id; used for as3
public static final int OutRemoveWatch2 = 50; // 32-bit id; used for as3
public static final int OutPassAllExceptionsToDebugger = 51;
public static final int OutBinaryOp = 52;
public static final int OutIsolateEnumerate = 53;
public static final int OutSetActiveIsolate = 54;
public static final int OutSetExceptionBreakpoint = 55;
public static final int OutRemoveExceptionBreakpoint= 56;
// If you add another message here, adjust the following line
// and add a new case to the outTypeName() method below.
public static final int OutSIZE = OutRemoveExceptionBreakpoint + 1; /* last ID used +1 */
/**
* Enums originally extracted from shared_tcserver/tcparser.h; these correspond
* to Flash player values that are currently in playerdebugger.h, class DebugAtomType.
*/
public static final int kNumberType = 0;
public static final int kBooleanType = 1;
public static final int kStringType = 2;
public static final int kObjectType = 3;
public static final int kMovieClipType = 4;
public static final int kNullType = 5;
public static final int kUndefinedType = 6;
public static final int kReferenceType = 7;
public static final int kArrayType = 8;
public static final int kObjectEndType = 9;
public static final int kStrictArrayType = 10;
public static final int kDateType = 11;
public static final int kLongStringType = 12;
public static final int kUnsupportedType = 13;
public static final int kRecordSetType = 14;
public static final int kXMLType = 15;
public static final int kTypedObjectType = 16;
public static final int kAvmPlusObjectType = 17;
public static final int kNamespaceType = 18;
public static final int kTraitsType = 19; // This one is special: When passed to the debugger, it indicates
// that the "variable" is not a variable at all, but rather is a
// class name. For example, if class Y extends class X, then
// we will send a kDTypeTraits for class Y; then we'll send all the
// members of class Y; then we'll send a kDTypeTraits for class X;
// and then we'll send all the members of class X. This is only
// used by the AVM+ debugger.
/* byte array of our message and current index into it */
byte[] m_content; /* the data bytes of the message */
int m_index; /* current position within the content array */
int m_type; /* one of OutXXX or InXXX integer constants */
/**
* Pointer size (in bytes) expected by the Flash player; either
* 4 for the 32-bit player, or 8 for the 64-bit player.
*/
private static int m_sizeofPtr;
/* Debugging only: The contents of this message, formatted as a string for display */
private StringBuilder m_debugFormatted;
/* Debugging only: The number of bytes from the input that we have formatted into m_debugFormatted */
private int m_debugFormattedThroughIndex;
private int m_targetIsolate;
/* used by our cache to create empty DMessages */
public DMessage(int size)
{
m_content = new byte[size];
m_debugFormatted = new StringBuilder();
m_debugFormattedThroughIndex = 0;
m_targetIsolate = Isolate.DEFAULT_ID;
clear();
}
/* getters/setters */
public int getType() { return m_type; }
public String getInTypeName() { return inTypeName(getType()); }
public String getOutTypeName() { return outTypeName(getType()); }
public byte[] getData() { return m_content; }
public int getSize() { return (m_content == null) ? 0 : m_content.length; }
public int getRemaining() { return getSize()-m_index; }
public int getPosition() { return m_index; }
public int getTargetIsolate() { return m_targetIsolate; }
public void setType(int t) { m_type = t; }
public void setTargetIsolate(int id) {m_targetIsolate = id;}
/**
* Gets pointer size (in bytes) expected by the Flash player; either
* 4 for the 32-bit player, or 8 for the 64-bit player.
*/
public static int getSizeofPtr()
{
assert m_sizeofPtr != 0;
return m_sizeofPtr;
}
/**
* Sets pointer size (in bytes) expected by the Flash player; either
* 4 for the 32-bit player, or 8 for the 64-bit player.
*/
public static void setSizeofPtr(int size)
{
assert size != 0;
m_sizeofPtr = size;
}
/**
* Allow the message to be 're-parsed' by someone else
*/
public void reset()
{
m_index = 0;
}
/**
* Allow the message to be reused later
*/
public void clear()
{
setType(-1);
setTargetIsolate(Isolate.DEFAULT_ID);
m_debugFormatted.setLength(0);
m_debugFormattedThroughIndex = 0;
reset();
}
private long get(int bytes) throws ArrayIndexOutOfBoundsException
{
if (m_index+bytes > m_content.length)
throw new ArrayIndexOutOfBoundsException(m_content.length-m_index+" < "+bytes); //$NON-NLS-1$
long value = 0;
for (int i=0; i<bytes; ++i) {
long byteValue = m_content[m_index++] & 0xff;
long byteValueShifted = byteValue << (8*i);
value |= byteValueShifted;
}
debugAppendNumber(value, bytes);
return value;
}
/**
* Extract the next byte
*/
public int getByte() throws ArrayIndexOutOfBoundsException
{
return (int) get(1);
}
/**
* Extract the next 2 bytes, which form a 16b integer, from the message
*/
public int getWord() throws ArrayIndexOutOfBoundsException
{
return (int) get(2);
}
/**
* Extract the next 4 bytes, which form a 32b integer, from the message
*/
public long getDWord() throws ArrayIndexOutOfBoundsException
{
return get(4);
}
/**
* Extract the next 8 bytes, which form a 64b integer, from the message
*/
public long getLong() throws ArrayIndexOutOfBoundsException
{
return get(8);
}
/**
* Extract a pointer from the message -- either 8 bytes or 4 bytes,
* depending on how big pointers are in the target Flash player
*/
public long getPtr() throws ArrayIndexOutOfBoundsException
{
return get(getSizeofPtr());
}
/**
* Heart wrenchingly slow but since we don't have a length so we can't
* do much better
*/
public String getString() throws ArrayIndexOutOfBoundsException
{
int startAt = m_index;
boolean done = false;
/* scan looking for a terminating null */
while(!done)
{
int ch = m_content[m_index++];
if (ch == 0)
done = true;
else if (m_index > m_content.length)
throw new ArrayIndexOutOfBoundsException("no string terminator found @"+m_index); //$NON-NLS-1$
}
/* build a new string and return it */
String s;
try
{
// The player uses UTF-8
s = new String(m_content, startAt, m_index-startAt-1, "UTF-8"); //$NON-NLS-1$
}
catch(UnsupportedEncodingException uee)
{
// couldn't convert so let's try the default
s = new String(m_content, startAt, m_index-startAt-1);
}
debugAppendString(s);
return s;
}
/**
* Appends a number to the end of the message
* @param val the number
* @param bytes how many bytes should be written
*/
public void put(long val, int bytes) throws ArrayIndexOutOfBoundsException
{
if (m_index+bytes > m_content.length)
throw new ArrayIndexOutOfBoundsException(m_content.length-m_index+" < "+bytes); //$NON-NLS-1$
for (int i=0; i<bytes; ++i)
m_content[m_index++] = (byte)(val >> 8*i);
debugAppendNumber(val, bytes);
}
/**
* Appends a byte to the end of the message
*/
public void putByte(byte val) throws ArrayIndexOutOfBoundsException
{
put(val, 1);
}
/**
* Appends 2 bytes, which form a 16b integer, into the message
*/
public void putWord(int val) throws ArrayIndexOutOfBoundsException
{
put(val, 2);
}
/**
* Appends 4 bytes, which form a 32b integer, into the message
*/
public void putDWord(int val) throws ArrayIndexOutOfBoundsException
{
put(val, 4);
}
/**
* Appends 8 bytes, which form a 64b integer, into the message
*/
public void putLong(long val) throws ArrayIndexOutOfBoundsException
{
put(val, 8);
}
/**
* Appends a pointer into the message -- either 8 bytes or 4 bytes,
* depending on how big pointers are in the target Flash player
*/
public void putPtr(long val) throws ArrayIndexOutOfBoundsException
{
put(val, getSizeofPtr());
}
/**
* Helper to get the number of bytes that a string will need when it is sent
* across the socket to the Flash player. Do *not* use string.length(),
* because that will return an incorrect result for strings that have non-
* ASCII characters.
*/
public static int getStringLength(String s)
{
try
{
return s.getBytes("UTF-8").length; //$NON-NLS-1$
}
catch (UnsupportedEncodingException e)
{
if (Trace.error) Trace.trace(e.toString());
return 0;
}
}
/**
* Place a string into the message (using UTF-8 encoding)
*/
public void putString(String s) throws ArrayIndexOutOfBoundsException, UnsupportedEncodingException
{
/* convert the string into a byte array */
byte[] bytes = s.getBytes("UTF-8"); //$NON-NLS-1$
int length = bytes.length;
int endAt = m_index + length + 1;
if (endAt > m_content.length)
throw new ArrayIndexOutOfBoundsException(endAt+" > "+m_content.length); //$NON-NLS-1$
/* copy the string as a byte array */
System.arraycopy(bytes, 0, m_content, m_index, length);
m_index += length;
/* now the null terminator */
m_content[m_index++] = '\0';
debugAppendString(s);
}
// Debugging helper function: we've parsed a number out of the stream of input bytes,
// so record that as a hex number of the appropriate length, e.g. "0x12" or "0x1234"
// or "0x12345678", depending on numBytes.
private void debugAppendNumber(long value, int numBytes)
{
if (PlayerSession.m_debugMsgOn || PlayerSession.m_debugMsgFileOn)
{
StringBuilder sb = new StringBuilder();
sb.append("0x"); //$NON-NLS-1$
FieldFormat.formatLongToHex(sb, value, numBytes * 2, true);
debugAppend(sb.toString());
}
}
// Debugging helper function: we've parsed a string out of the stream of input bytes,
// so record it as a quoted string in the formatted debugging output.
private void debugAppendString(String s)
{
if (PlayerSession.m_debugMsgOn || PlayerSession.m_debugMsgFileOn)
debugAppend('"' + s + '"');
}
// Debugging helper function: append a string to the formatted debugging output.
private void debugAppend(String s)
{
if (PlayerSession.m_debugMsgOn || PlayerSession.m_debugMsgFileOn)
{
if (m_index > m_debugFormattedThroughIndex)
{
m_debugFormattedThroughIndex = m_index;
if (m_debugFormatted.length() > 0)
m_debugFormatted.append(' ');
m_debugFormatted.append(s);
}
}
}
public String inToString() { return inToString(16); }
public String inToString(int maxContentBytes)
{
StringBuilder sb = new StringBuilder();
sb.append(getInTypeName());
sb.append('[');
sb.append(getSize());
sb.append("] "); //$NON-NLS-1$
if (getSize() > 0)
appendContent(sb, maxContentBytes);
return sb.toString();
}
public String outToString() { return outToString(16); }
public String outToString(int maxContentBytes)
{
StringBuilder sb = new StringBuilder();
sb.append(getOutTypeName());
sb.append('[');
sb.append(getSize());
sb.append("] "); //$NON-NLS-1$
if (getSize() > 0)
appendContent(sb, maxContentBytes);
return sb.toString();
}
public StringBuilder appendContent(StringBuilder sb, int max)
{
int size = getSize();
byte[] data = getData();
int i = 0;
// First, output formatted content -- content for which some of the other functions
// in this class, such as getDWord and getString, did formatting.
sb.append(m_debugFormatted);
// Now, for any left-over bytes which no one bothered to parse, output them as hex.
for(i=0; i<max && i+m_debugFormattedThroughIndex<size; i++)
{
int v = data[i+m_debugFormattedThroughIndex] & 0xff;
sb.append(" 0x"); //$NON-NLS-1$
FieldFormat.formatLongToHex(sb, v, 2, true);
}
if (i+m_debugFormattedThroughIndex < size)
sb.append(" ..."); //$NON-NLS-1$
return sb;
}
/**
* Convenience function for converting a type into a name used mainly for debugging
* but can also be used during trace facility of command line session
*/
public static String inTypeName(int type)
{
String s = "InUnknown(" + type + ")"; //$NON-NLS-1$ //$NON-NLS-2$
switch(type)
{
case InSetMenuState:
s = "InSetMenuState"; //$NON-NLS-1$
break;
case InSetProperty:
s = "InSetProperty"; //$NON-NLS-1$
break;
case InExit:
s = "InExit"; //$NON-NLS-1$
break;
case InNewObject:
s = "InNewObject"; //$NON-NLS-1$
break;
case InRemoveObject:
s = "InRemoveObject"; //$NON-NLS-1$
break;
case InTrace:
s = "InTrace"; //$NON-NLS-1$
break;
case InErrorTarget:
s = "InErrorTarget"; //$NON-NLS-1$
break;
case InErrorExecLimit:
s = "InErrorExecLimit"; //$NON-NLS-1$
break;
case InErrorWith:
s = "InErrorWith"; //$NON-NLS-1$
break;
case InErrorProtoLimit:
s = "InErrorProtoLimit"; //$NON-NLS-1$
break;
case InSetVariable:
s = "InSetVariable"; //$NON-NLS-1$
break;
case InDeleteVariable:
s = "InDeleteVariable"; //$NON-NLS-1$
break;
case InParam:
s = "InParam"; //$NON-NLS-1$
break;
case InPlaceObject:
s = "InPlaceObject"; //$NON-NLS-1$
break;
case InScript:
s = "InScript"; //$NON-NLS-1$
break;
case InAskBreakpoints:
s = "InAskBreakpoints"; //$NON-NLS-1$
break;
case InBreakAt:
s = "InBreakAt"; //$NON-NLS-1$
break;
case InContinue:
s = "InContinue"; //$NON-NLS-1$
break;
case InSetLocalVariables:
s = "InSetLocalVariables"; //$NON-NLS-1$
break;
case InSetBreakpoint:
s = "InSetBreakpoint"; //$NON-NLS-1$
break;
case InNumScript:
s = "InNumScript"; //$NON-NLS-1$
break;
case InRemoveScript:
s = "InRemoveScript"; //$NON-NLS-1$
break;
case InRemoveBreakpoint:
s = "InRemoveBreakpoint"; //$NON-NLS-1$
break;
case InNotSynced:
s = "InNotSynced"; //$NON-NLS-1$
break;
case InErrorURLOpen:
s = "InErrorURLOpen"; //$NON-NLS-1$
break;
case InProcessTag:
s = "InProcessTag"; //$NON-NLS-1$
break;
case InVersion:
s = "InVersion"; //$NON-NLS-1$
break;
case InBreakAtExt:
s = "InBreakAtExt"; //$NON-NLS-1$
break;
case InSetVariable2:
s = "InSetVariable2"; //$NON-NLS-1$
break;
case InSquelch:
s = "InSquelch"; //$NON-NLS-1$
break;
case InGetVariable:
s = "InGetVariable"; //$NON-NLS-1$
break;
case InFrame:
s = "InFrame"; //$NON-NLS-1$
break;
case InOption:
s = "InOption"; //$NON-NLS-1$
break;
case InWatch:
s = "InWatch"; //$NON-NLS-1$
break;
case InGetSwf:
s = "InGetSwf"; //$NON-NLS-1$
break;
case InGetSwd:
s = "InGetSwd"; //$NON-NLS-1$
break;
case InErrorException:
s = "InErrorException"; //$NON-NLS-1$
break;
case InErrorStackUnderflow:
s = "InErrorStackUnderflow"; //$NON-NLS-1$
break;
case InErrorZeroDivide:
s = "InErrorZeroDivide"; //$NON-NLS-1$
break;
case InErrorScriptStuck:
s = "InErrorScriptStuck"; //$NON-NLS-1$
break;
case InBreakReason:
s = "InBreakReason"; //$NON-NLS-1$
break;
case InGetActions:
s = "InGetActions"; //$NON-NLS-1$
break;
case InSwfInfo:
s = "InSwfInfo"; //$NON-NLS-1$
break;
case InConstantPool:
s = "InConstantPool"; //$NON-NLS-1$
break;
case InErrorConsole:
s = "InErrorConsole"; //$NON-NLS-1$
break;
case InGetFncNames:
s = "InGetFncNames"; //$NON-NLS-1$
break;
case InCallFunction:
s = "InCallFunction"; //$NON-NLS-1$
break;
case InWatch2:
s = "InWatch2"; //$NON-NLS-1$
break;
case InPassAllExceptionsToDebugger:
s = "InPassAllExceptionsToDebugger"; //$NON-NLS-1$
break;
case InBinaryOp:
s = "InBinaryOp"; //$NON-NLS-1$
break;
case InIsolateCreate:
s = "InIsolateCreate"; //$NON-NLS-1$
break;
case InIsolateExit:
s = "InIsolateExit"; //$NON-NLS-1$
break;
case InIsolateEnumerate:
s = "InIsolateEnumerate"; //$NON-NLS-1$
break;
case InSetActiveIsolate:
s = "InSetActiveIsolate"; //$NON-NLS-1$
break;
case InIsolate:
s = "InIsolate"; //$NON-NLS-1$
break;
case InSetExceptionBreakpoint:
s = "InSetExceptionBreakpoint"; //$NON-NLS-1$
break;
case InRemoveExceptionBreakpoint:
s = "InRemoveExceptionBreakpoint"; //$NON-NLS-1$
break;
}
return s;
}
/**
* Convenience function for converting a type into a name used mainly for debugging
* but can also be used during trace facility of command line session
*/
public static String outTypeName(int type)
{
String s = "OutUnknown(" + type + ")"; //$NON-NLS-1$ //$NON-NLS-2$
switch(type)
{
case OutZoomIn:
s = "OutZoomIn"; //$NON-NLS-1$
break;
case OutZoomOut:
s = "OutZoomOut"; //$NON-NLS-1$
break;
case OutZoom100:
s = "OutZoom100"; //$NON-NLS-1$
break;
case OutHome:
s = "OutHome"; //$NON-NLS-1$
break;
case OutSetQuality:
s = "OutSetQuality"; //$NON-NLS-1$
break;
case OutPlay:
s = "OutPlay"; //$NON-NLS-1$
break;
case OutLoop:
s = "OutLoop"; //$NON-NLS-1$
break;
case OutRewind:
s = "OutRewind"; //$NON-NLS-1$
break;
case OutForward:
s = "OutForward"; //$NON-NLS-1$
break;
case OutBack:
s = "OutBack"; //$NON-NLS-1$
break;
case OutPrint:
s = "OutPrint"; //$NON-NLS-1$
break;
case OutSetVariable:
s = "OutSetVariable"; //$NON-NLS-1$
break;
case OutSetProperty:
s = "OutSetProperty"; //$NON-NLS-1$
break;
case OutExit:
s = "OutExit"; //$NON-NLS-1$
break;
case OutSetFocus:
s = "OutSetFocus"; //$NON-NLS-1$
break;
case OutContinue:
s = "OutContinue"; //$NON-NLS-1$
break;
case OutStopDebug:
s = "OutStopDebug"; //$NON-NLS-1$
break;
case OutSetBreakpoints:
s = "OutSetBreakpoints"; //$NON-NLS-1$
break;
case OutRemoveBreakpoints:
s = "OutRemoveBreakpoints"; //$NON-NLS-1$
break;
case OutRemoveAllBreakpoints:
s = "OutRemoveAllBreakpoints"; //$NON-NLS-1$
break;
case OutStepOver:
s = "OutStepOver"; //$NON-NLS-1$
break;
case OutStepInto:
s = "OutStepInto"; //$NON-NLS-1$
break;
case OutStepOut:
s = "OutStepOut"; //$NON-NLS-1$
break;
case OutProcessedTag:
s = "OutProcessedTag"; //$NON-NLS-1$
break;
case OutSetSquelch:
s = "OutSetSquelch"; //$NON-NLS-1$
break;
case OutGetVariable:
s = "OutGetVariable"; //$NON-NLS-1$
break;
case OutGetFrame:
s = "OutGetFrame"; //$NON-NLS-1$
break;
case OutGetOption:
s = "OutGetOption"; //$NON-NLS-1$
break;
case OutSetOption:
s = "OutSetOption"; //$NON-NLS-1$
break;
case OutAddWatch:
s = "OutAddWatch"; //$NON-NLS-1$
break;
case OutRemoveWatch:
s = "OutRemoveWatch"; //$NON-NLS-1$
break;
case OutStepContinue:
s = "OutStepContinue"; //$NON-NLS-1$
break;
case OutGetSwf:
s = "OutGetSwf"; //$NON-NLS-1$
break;
case OutGetSwd:
s = "OutGetSwd"; //$NON-NLS-1$
break;
case OutGetVariableWhichInvokesGetter:
s = "OutGetVariableWhichInvokesGetter"; //$NON-NLS-1$
break;
case OutGetBreakReason:
s = "OutGetBreakReason"; //$NON-NLS-1$
break;
case OutGetActions:
s = "OutGetActions"; //$NON-NLS-1$
break;
case OutSetActions:
s = "OutSetActions"; //$NON-NLS-1$
break;
case OutSwfInfo:
s = "OutSwfInfo"; //$NON-NLS-1$
break;
case OutConstantPool:
s = "OutConstantPool"; //$NON-NLS-1$
break;
case OutGetFncNames:
s = "OutGetFncNames"; //$NON-NLS-1$
break;
case OutCallFunction:
s = "OutCallFunction"; //$NON-NLS-1$
break;
case OutAddWatch2:
s = "OutAddWatch2"; //$NON-NLS-1$
break;
case OutRemoveWatch2:
s = "OutRemoveWatch2"; //$NON-NLS-1$
break;
case OutPassAllExceptionsToDebugger:
s = "OutPassAllExceptionsToDebugger"; //$NON-NLS-1$
break;
case OutBinaryOp:
s = "OutBinaryOp"; //$NON-NLS-1$
break;
case OutIsolateEnumerate:
s = "OutIsolateEnumerate"; //$NON-NLS-1$
break;
case OutSetActiveIsolate:
s = "OutSetActiveIsolate"; //$NON-NLS-1$
break;
case OutSetExceptionBreakpoint:
s = "OutSetExceptionBreakpoint"; //$NON-NLS-1$
break;
case OutRemoveExceptionBreakpoint:
s = "OutRemoveExceptionBreakpoint"; //$NON-NLS-1$
break;
}
return s;
}
}