http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/07f5a7de/debugger/src/flash/tools/debugger/concrete/DManager.java
----------------------------------------------------------------------
diff --git a/debugger/src/flash/tools/debugger/concrete/DManager.java
b/debugger/src/flash/tools/debugger/concrete/DManager.java
deleted file mode 100644
index a8b1c8a..0000000
--- a/debugger/src/flash/tools/debugger/concrete/DManager.java
+++ /dev/null
@@ -1,2583 +0,0 @@
-/*
- * 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.io.InputStream;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-import flash.tools.debugger.Isolate;
-import flash.tools.debugger.SourceLocator;
-import flash.tools.debugger.SuspendReason;
-import flash.tools.debugger.SwfInfo;
-import flash.tools.debugger.Value;
-import flash.tools.debugger.VariableAttribute;
-import flash.tools.debugger.VariableType;
-import flash.tools.debugger.events.BreakEvent;
-import flash.tools.debugger.events.ConsoleErrorFault;
-import flash.tools.debugger.events.DebugEvent;
-import flash.tools.debugger.events.DivideByZeroFault;
-import flash.tools.debugger.events.ExceptionFault;
-import flash.tools.debugger.events.FaultEvent;
-import flash.tools.debugger.events.FileListModifiedEvent;
-import flash.tools.debugger.events.InvalidWithFault;
-import flash.tools.debugger.events.IsolateCreateEvent;
-import flash.tools.debugger.events.IsolateExitEvent;
-import flash.tools.debugger.events.ProtoLimitFault;
-import flash.tools.debugger.events.RecursionLimitFault;
-import flash.tools.debugger.events.ScriptTimeoutFault;
-import flash.tools.debugger.events.StackUnderFlowFault;
-import flash.tools.debugger.events.SwfLoadedEvent;
-import flash.tools.debugger.events.SwfUnloadedEvent;
-import flash.tools.debugger.events.TraceEvent;
-import flash.util.Trace;
-
-/**
- * Implements the receiving and updating of debug state from the socket
- * connection of the Flash Player.
- */
-public class DManager implements DProtocolNotifierIF, SourceLocator {
- private final HashMap<String, String> m_parms;
-
- private final HashMap<Integer, DIsolate> m_isolates; /*
-
* WARNING: accessed
-
* from multiple threads
-
*/
-
- /**
- * The currently active isolate or worker
- */
- private Isolate m_activeIsolate = DEFAULT_ISOLATE;
-
- private LinkedList<DebugEvent> m_event; /*
-
* our event queue; WARNING:
-
* accessed from multiple threads
-
*/
- private SourceLocator m_sourceLocator;
-
-
- private boolean m_squelchEnabled; /*
- * true
if we are talking to a squelch
- *
enabled debug player
- */
- private int m_playerVersion; /*
- * player
version number obtained from InVersion
- * message;
e.g. 9 for Flash Player 9.0
- */
-
- private boolean m_sourceListModified; /*
-
* deprecated; indicates m_source has
-
* changed since last call to
-
* getSource(). WARNING: lock with
-
* synchronized (m_source) { ... }
-
*/
- private byte[] m_actions; /* deprecated */
- private String[] m_lastConstantPool; /* deprecated */
-
- // SWF/SWD fetching and parsing
- private String m_uri;
- private byte[] m_swf; // latest swf obtained from get swf
- private byte[] m_swd; // latest swd obtained from get swd
-
- private Map<String, String> m_options = new HashMap<String, String>();
// Player
-
//
options
-
// that
-
// have
-
// been
-
//
queried
-
// by
-
//
OutGetOption,
-
// and
-
// come
-
// back
-
// via
-
//
InOption
-
- public static final String ARGUMENTS_MARKER = "$arguments";
//$NON-NLS-1$
- public static final String SCOPE_CHAIN_MARKER = "$scopechain";
//$NON-NLS-1$
-
- private static final DIsolate DEFAULT_ISOLATE =
DIsolate.DEFAULT_ISOLATE;
- private Isolate m_inIsolate = DEFAULT_ISOLATE;
- private final Object m_inIsolateLock;
- private final Object m_activeIsolateLock;
- private boolean m_wideLines;
- private DManagerIsolateState m_mainState;
- private HashMap<Integer, DManagerIsolateState> m_isolateState;
-
-
- class DManagerIsolateState {
- public DSuspendInfo m_suspendInfo;
- public DSwfInfo m_lastSwfInfo; /*
-
* hack for syncing swfinfo records with
-
* incoming InScript messages
-
*/
- public DVariable m_lastInGetVariable;/*
-
* hack for getVariable call to work
-
* with getters
-
*/
- public boolean m_attachChildren; /*
-
* hack for getVariable call to work
-
* with getters
-
*/
- public DVariable m_lastInCallFunction; /* hack for callFunction
to work */
- public DVariable m_lastInBinaryOp;
- private boolean m_executingPlayerCode;
- private FaultEvent m_faultEventDuringPlayerCodeExecution;
-
- public final ArrayList<DLocation> m_breakpoints; /*
-
* WARNING: accessed
-
* from multiple threads
-
*/
- public final Map<Integer, DModule> m_source; /*
-
* WARNING: accessed from
-
* multiple threads
-
*/
- private final ArrayList<DSwfInfo> m_swfInfo; /*
-
* WARNING: accessed from
-
* multiple threads
-
*/
- private final ArrayList<DWatch> m_watchpoints; /*
-
* WARNING: accessed
-
* from multiple threads
-
*/
-
- /**
- * The currently active stack frames.
- */
- public ArrayList<DStackContext> m_frames;
-
- /**
- * The stack frames that were active the last time the player
was
- * suspended.
- */
- public ArrayList<DStackContext> m_previousFrames;
-
- /**
- * A list of all known variables in the player. Stored as a
mapping from
- * an object's id to its DValue.
- */
- public Map<Long, DValue> m_values;
-
- /**
- * A list of all known variables in the player from the
previous time
- * the player was suspended. Stored as a mapping from an
object's id to
- * its DValue.
- */
- public Map<Long, DValue> m_previousValues;
-
- public DManagerIsolateState() {
- m_source = new HashMap<Integer, DModule>();
- m_values = new HashMap<Long, DValue>();
- m_previousValues = new HashMap<Long, DValue>();
- m_frames = new ArrayList<DStackContext>();
- m_previousFrames = new ArrayList<DStackContext>();
- m_suspendInfo = null;
- m_lastInCallFunction = null;
- m_breakpoints = new ArrayList<DLocation>();
- m_swfInfo = new ArrayList<DSwfInfo>();
- m_watchpoints = new ArrayList<DWatch>();
- m_suspendInfo = null;
- m_lastInGetVariable = null;
- m_attachChildren = true;
- m_lastInCallFunction = null;
-
- }
- }
-
- private DManagerIsolateState getIsolateState(int isolateId) {
- if (isolateId == Isolate.DEFAULT_ID)
- return m_mainState;
-
- DManagerIsolateState isolateState = null;
- if (!m_isolateState.containsKey(isolateId)) {
- isolateState = new DManagerIsolateState();
- m_isolateState.put(isolateId, isolateState);
- } else
- isolateState = m_isolateState.get(isolateId);
- return isolateState;
- }
-
- public DManager() {
- m_parms = new HashMap<String, String>();
-
- m_isolates = new HashMap<Integer, DIsolate>();
- m_isolates.put(Isolate.DEFAULT_ID, DEFAULT_ISOLATE);
- m_event = new LinkedList<DebugEvent>();
- m_sourceLocator = null;
- m_squelchEnabled = false;
- m_lastConstantPool = null;
- m_playerVersion = -1; // -1 => unknown
- m_isolateState = new HashMap<Integer, DManagerIsolateState>();
- m_mainState = new DManagerIsolateState();
- m_isolateState.put(Isolate.DEFAULT_ID, m_mainState);
- m_inIsolateLock = new Object();
- m_activeIsolateLock = new Object();
- m_wideLines = false;
- }
-
- public void setWideLines(boolean value) {
- m_wideLines = value;
- }
-
- public String getURI() {
- return m_uri;
- }
-
- public byte[] getSWF() {
- return m_swf;
- }
-
- public byte[] getSWD() {
- return m_swd;
- }
-
- public byte[] getActions() {
- return m_actions;
- }
-
- /** Returns the Flash Player version number; e.g. 9 for Flash Player
9.0 */
- public int getVersion() {
- return m_playerVersion;
- }
-
- public SourceLocator getSourceLocator() {
- return m_sourceLocator;
- }
-
- public void setSourceLocator(SourceLocator sl) {
- m_sourceLocator = sl;
- }
-
- /**
- * If this feature is enabled then we do not attempt to attach child
- * variables to parents.
- */
- public void enableChildAttach(boolean enable, int isolateId) {
- getIsolateState(isolateId).m_attachChildren = enable;
- }
-
- // return/clear the last variable seen from an InGetVariable message
- public DVariable lastVariable(int isolateId) {
- return getIsolateState(isolateId).m_lastInGetVariable;
- }
-
- public void clearLastVariable(int isolateId) {
- getIsolateState(isolateId).m_lastInGetVariable = null;
- }
-
- // return/clear the last variable seen from an InCallFunction message
- public DVariable lastFunctionCall(int isolateId) {
- return getIsolateState(isolateId).m_lastInCallFunction;
- }
-
- public void clearLastFunctionCall(int isolateId) {
- getIsolateState(isolateId).m_lastInCallFunction = null;
- }
-
- // return/clear the last binary op result seen from an InBinaryOp
message
- public DVariable lastBinaryOp(int isolateId) {
- return getIsolateState(isolateId).m_lastInBinaryOp;
- }
-
- public void clearLastBinaryOp(int isolateId) {
- getIsolateState(isolateId).m_lastInBinaryOp = null;
- }
-
- /*
- * Frees up any information we have kept about
- */
- void freeCaches(int isolateId) {
- clearFrames(isolateId);
- freeValueCache(isolateId);
- }
-
- void freeValueCache(int isolateId) {
- DManagerIsolateState state = getIsolateState(isolateId);
- state.m_previousValues = state.m_values;
- state.m_values = new HashMap<Long, DValue>();
-
- int size = getFrameCount(isolateId);
- for (int i = 0; i < size; i++)
- getFrame(i, isolateId).markStale();
- }
-
- // continuing our execution
- void continuing(int isolateId) {
- freeCaches(isolateId);
- getIsolateState(isolateId).m_suspendInfo = null;
- }
-
- /**
- * Variables
- */
- DValue getOrCreateValue(long id, int isolateId) {
- DValue v = getValue(id, isolateId);
- if (v == null) {
- v = new DValue(id, isolateId);
- putValue(id, v, isolateId);
- }
- return v;
- }
-
- public DSwfInfo[] getSwfInfos(int isolateId) {
- ArrayList<DSwfInfo> swfInfos =
getIsolateState(isolateId).m_swfInfo;
- synchronized (swfInfos) {
- return swfInfos.toArray(new DSwfInfo[swfInfos.size()]);
- }
- }
-
- public DSwfInfo getSwfInfo(int at, int isolateId) {
- ArrayList<DSwfInfo> swfInfos =
getIsolateState(isolateId).m_swfInfo;
- synchronized (swfInfos) {
- return swfInfos.get(at);
- }
- }
-
- public int getSwfInfoCount(int isolateId) {
- ArrayList<DSwfInfo> swfInfos =
getIsolateState(isolateId).m_swfInfo;
- synchronized (swfInfos) {
- return swfInfos.size();
- }
- }
-
- /**
- * Obtains a SwfInfo object at the given index or if one doesn't yet
exist
- * at that location, creates a new empty one there and returns it.
- */
- DSwfInfo getOrCreateSwfInfo(int at, int isolateId) {
- ArrayList<DSwfInfo> swfInfos =
getIsolateState(isolateId).m_swfInfo;
- synchronized (swfInfos) {
- DSwfInfo i = (at > -1 && at <
getSwfInfoCount(isolateId)) ? getSwfInfo(
- at, isolateId) : null;
- if (i == null) {
- // are we above water
- at = (at < 0) ? 0 : at;
-
- // fill all the gaps with null; really
shouldn't be any...
- while (at >= swfInfos.size())
- swfInfos.add(null);
-
- i = new DSwfInfo(at, isolateId);
- swfInfos.set(at, i);
- }
- return i;
- }
- }
-
- /**
- * Get the most recently active swfInfo object. We define active as the
most
- * recently seen swfInfo
- */
- DSwfInfo getActiveSwfInfo(int isolateId) {
- int count = getSwfInfoCount(isolateId);
-
- // pick up the last one seen
- DSwfInfo swf = getIsolateState(isolateId).m_lastSwfInfo;
-
- // still don't have one then get or create the most recent one
- // works if count = 0
- if (swf == null)
- swf = getOrCreateSwfInfo(count - 1, isolateId);
-
- if (swf.hasAllSource()) {
- // already full so create a new one on the end
- swf = getOrCreateSwfInfo(count, isolateId);
- }
- return swf;
- }
-
- /**
- * Walk the list of scripts and add them to our swfInfo object This
method
- * may be called when min/max are zero and the swd has not yet fully
loaded
- * in the player or it could be called before we have all the scripts.
- */
- void tieScriptsToSwf(DSwfInfo info, int isolateId) {
- if (!info.hasAllSource()) {
- int min = info.getFirstSourceId();
- int max = info.getLastSourceId();
- // System.out.println("attaching scripts
"+min+"-"+max+" to "+info.getUrl());
- for (int i = min; i <= max; i++) {
- DModule m = getSource(i, isolateId);
- if (m == null) {
- // this is ok, it means the scripts are
coming...
- } else {
- info.addSource(i, m);
- }
- }
- }
- }
-
- /**
- * Record a new source file.
- *
- * @param name
- * filename in "basepath;package;filename" format
- * @param swfIndex
- * the index of the SWF with which this source is
associated, or
- * -1 is we don't know
- * @return true if our list of source files was modified, or false if we
- * already knew about that particular source file.
- */
- private boolean putSource(int swfIndex, int moduleId, int bitmap,
- String name, String text, int isolateId) {
- // if isolateIndex is not -1, augment swfIndex and moduleId
with isolate
- // info.
- Map<Integer, DModule> source =
getIsolateState(isolateId).m_source;
- synchronized (source) {
- // if we haven't already recorded this script then do
so.
- if (!source.containsKey(moduleId)) {
- DModule s = new DModule(this, moduleId, bitmap,
name, text, isolateId);
-
- // put source in our large pool
- source.put(moduleId, s);
-
- // put the source in the currently active swf
- DSwfInfo swf;
- if (swfIndex == -1) // caller didn't tell us
what swf thi is for
- swf = getActiveSwfInfo(isolateId); //
... so guess
- else
- swf = getOrCreateSwfInfo(swfIndex,
isolateId);
-
- swf.addSource(moduleId, s);
-
- return true;
- }
-
- return false;
- }
- }
-
- /**
- * Remove our record of a particular source file.
- *
- * @param id
- * the id of the file to forget about.
- * @return true if source file was removed; false if we didn't know
about it
- * to begin with.
- */
- private boolean removeSource(int id, int isolateId) {
- Map<Integer, DModule> source =
getIsolateState(isolateId).m_source;
- synchronized (source) {
- try {
- source.remove(id);
- } catch (Exception e) {
- return false;
- }
- return true;
- }
- }
-
- public DModule getSource(int id, int isolateId) {
- Map<Integer, DModule> source =
getIsolateState(isolateId).m_source;
- synchronized (source) {
- return source.get(id);
- }
- }
-
- // @deprecated
- public DModule[] getSources() {
- Map<Integer, DModule> source =
getIsolateState(Isolate.DEFAULT_ID).m_source;
- synchronized (source) {
- m_sourceListModified = false;
-
- /* find out the size of the array */
- int count = source.size();
- DModule[] ar = new DModule[count];
-
- count = 0;
- for (DModule sf : source.values())
- ar[count++] = sf;
- return ar;
- }
- }
-
- // @deprecated
- boolean sourceListModified() {
- Map<Integer, DModule> source =
getIsolateState(Isolate.DEFAULT_ID).m_source;
- synchronized (source) {
- return m_sourceListModified;
- }
- }
-
- public DValue getValue(long id, int isolateId) {
- return getIsolateState(isolateId).m_values.get(id);
- }
-
- /**
- * Returns the previous value object for the given id -- that is, the
value
- * that that object had the last time the player was suspended. Never
- * requests it from the player (because it can't, of course). Returns
- * <code>null</code> if we don't have a value for that id.
- */
- public DValue getPreviousValue(long id, int isolateId) {
- return getIsolateState(isolateId).m_previousValues.get(id);
- }
-
- void putValue(long id, DValue v, int isolateId) {
- if (id != Value.UNKNOWN_ID) {
- getIsolateState(isolateId).m_values.put(id, v);
- }
- }
-
- DValue removeValue(long id, int isolateId) {
- return getIsolateState(isolateId).m_values.remove((int)id);
- }
-
- void addVariableMember(long parentId, DVariable child, int isolateId) {
- DValue parent = getValue(parentId, isolateId);
- addVariableMember(parent, child, isolateId);
- }
-
- void addVariableMember(DValue parent, DVariable child, int isolateId) {
- if (getIsolateState(isolateId).m_attachChildren) {
- // There are certain situations when the Flash player
will send us
- // more
- // than one variable or getter with the same name.
Basically, when a
- // subclass implements (or overrides) something that
was also
- // declared in a
- // superclass, then we'll see that variable or getter
in both the
- // superclass and the subclass.
- //
- // Here are a few situations where that affects the
debugger in
- // different
- // ways:
- //
- // 1. When a class implements an interface, the class
instance
- // actually has
- // *two* members for each implemented function: One
which is public
- // and
- // represents the implementation function, and another
which is
- // internal
- // to the interface, and represents the declaration of
the function.
- // Both of these come in to us. In the UI, the one we
want to show
- // is
- // the public one. They come in in random order (they
are stored in
- // a
- // hash table in the VM), so we don't know which one
will come
- // first.
- //
- // 2. When a superclass has a private member "m", and a
subclass has
- // its own
- // private member with the same name "m", we will
receive both of
- // them.
- // (They are scoped by different packages.) In this
case, the first
- // one
- // the player sent us is the one from the subclass, and
that is the
- // one
- // we want to display in the debugger.
- //
- // The following logic correctly deals with all
variations of those
- // cases.
- if (parent != null) {
- DVariable existingChildWithSameName =
parent.findMember(child
- .getName());
- if (existingChildWithSameName != null) {
- int existingScope =
existingChildWithSameName.getScope();
- int newScope = child.getScope();
-
- if (existingScope ==
VariableAttribute.NAMESPACE_SCOPE
- && newScope ==
VariableAttribute.PUBLIC_SCOPE) {
- // This is the case described
above where a class
- // implements an interface,
- // so that class's definition
includes both a
- // namespace-scoped declaration
- // and a public declaration, in
random order; in this
- // case, the
- // namespace-scoped declaration
came first. We want to
- // use the public
- // declaration.
- parent.addMember(child);
- } else if (existingScope ==
VariableAttribute.PUBLIC_SCOPE
- && newScope ==
VariableAttribute.NAMESPACE_SCOPE) {
- // One of two things happened
here:
- //
- // 1. This is the case
described above where a class
- // implements an interface,
- // so that class's definition
includes both a
- // namespace-scoped declaration
- // and a public declaration, in
random order; in this
- // case, the
- // public declaration came
first. It is tempting to use
- // the public
- // member in this case, but
there is a catch...
- // 2. It might be more
complicated than that: Perhaps
- // there is interface I,
- // and class C1 implements I,
but class C2 extends C1,
- // and overrides
- // one of the members of I that
was already implemented
- // by C1. In this
- // case, the public declaration
from C2 came first, but
- // now we are seeing
- // a namespace-scoped
declaration in C1. We need to
- // record that the
- // member is public, but we
also need to record that it
- // is a member
- // of the base class, not just
a member of the
- // superclass.
- //
- // The easiest way to deal with
both cases is to use the
- // child that came from
- // the superclass, but to
change its scope to public.
- child.makePublic();
- parent.addMember(child);
- } else if (existingScope !=
VariableAttribute.PRIVATE_SCOPE
- && existingScope ==
newScope) {
- // This is a public, protected,
internal, or
- // namespace-scoped member which
- // was defined in a base class
and overridden in a
- // subclass. We want to
- // use the member from the base
class, to that the
- // debugger knows where the
- // variable was actually
defined.
- parent.addMember(child);
- } else if (existingScope ==
VariableAttribute.PRIVATE_SCOPE
- && existingScope ==
newScope) {
-
parent.addInheritedPrivateMember(child);
- }
- } else {
- parent.addMember(child);
- }
- }
- // put child in the registry if it has an id and not
already there
- DValue childValue = (DValue) child.getValue();
- long childId = childValue.getId();
- if (childId != Value.UNKNOWN_ID) {
- DValue existingValue = getValue(childId,
isolateId);
- if (existingValue != null) {
- assert existingValue == childValue; //
TODO is this right?
-
// what about getters?
- } else {
- putValue(childId, childValue,
isolateId);
- }
- }
- }
- }
-
- // TODO is this right?
- void addVariableMember(long parentId, DVariable child, long doubleAsId,
- int isolateId) {
- addVariableMember(parentId, child, isolateId);
-
- // double book the child under another id
- if (getIsolateState(isolateId).m_attachChildren)
- putValue(doubleAsId, (DValue) child.getValue(),
isolateId);
- }
-
- // @deprecated last pool that was read
- public String[] getConstantPool() {
- return m_lastConstantPool;
- }
-
- /**
- * Breakpoints
- */
- public DLocation getBreakpoint(int id, int isolateId) {
- ArrayList<DLocation> breakpoints =
getIsolateState(isolateId).m_breakpoints;
- synchronized (breakpoints) {
- DLocation loc = null;
- int which = findBreakpoint(id, isolateId);
- if (which > -1)
- loc = breakpoints.get(which);
- return loc;
- }
- }
-
- int findBreakpoint(int id, int isolateId) {
- ArrayList<DLocation> breakpoints =
getIsolateState(isolateId).m_breakpoints;
- synchronized (breakpoints) {
- int which = -1;
- int size = breakpoints.size();
- for (int i = 0; which < 0 && i < size; i++) {
- DLocation l = breakpoints.get(i);
- if (l.getId() == id)
- which = i;
- }
- return which;
- }
- }
-
- DLocation removeBreakpoint(int id, int isolateId) {
- ArrayList<DLocation> breakpoints =
getIsolateState(isolateId).m_breakpoints;
- synchronized (breakpoints) {
- DLocation loc = null;
- int which = findBreakpoint(id, isolateId);
- if (which > -1) {
- loc = breakpoints.get(which);
- breakpoints.remove(which);
- }
-
- return loc;
- }
- }
-
- void addBreakpoint(int id, DLocation l, int isolateId) {
- ArrayList<DLocation> breakpoints =
getIsolateState(isolateId).m_breakpoints;
- synchronized (breakpoints) {
- breakpoints.add(l);
- }
- }
-
- public DLocation[] getBreakpoints(int isolateId) {
- ArrayList<DLocation> breakpoints =
getIsolateState(isolateId).m_breakpoints;
- synchronized (breakpoints) {
- return breakpoints.toArray(new
DLocation[breakpoints.size()]);
- }
- }
-
- /**
- * Watchpoints
- */
- public DWatch getWatchpoint(int at, int isolateId) {
- DManagerIsolateState state = getIsolateState(isolateId);
- synchronized (state.m_watchpoints) {
- return state.m_watchpoints.get(at);
- }
- }
-
- public int getWatchpointCount(int isolateId) {
- DManagerIsolateState state = getIsolateState(isolateId);
- synchronized (state.m_watchpoints) {
- return state.m_watchpoints.size();
- }
- }
-
- public DWatch[] getWatchpoints(int isolateId) {
- DManagerIsolateState state = getIsolateState(isolateId);
- synchronized (state.m_watchpoints) {
- return state.m_watchpoints.toArray(new
DWatch[state.m_watchpoints.size()]);
- }
- }
-
- boolean addWatchpoint(DWatch w, int isolateId) {
- ArrayList<DWatch> lockObject =
getIsolateState(isolateId).m_watchpoints;
- synchronized (lockObject) {
- return lockObject.add(w);
- }
- }
-
- DWatch removeWatchpoint(int tag, int isolateId) {
- ArrayList<DWatch> lockObject =
getIsolateState(isolateId).m_watchpoints;
- synchronized (lockObject) {
- DWatch w = null;
- int at = findWatchpoint(tag, isolateId);
- if (at > -1)
- w = lockObject.remove(at);
- return w;
- }
- }
-
- int findWatchpoint(int tag, int isolateId) {
- ArrayList<DWatch> lockObject =
getIsolateState(isolateId).m_watchpoints;
- synchronized (lockObject) {
- int at = -1;
- int size = getWatchpointCount(isolateId);
- for (int i = 0; i < size && at < 0; i++) {
- DWatch w = getWatchpoint(i, isolateId);
- if (w.getTag() == tag)
- at = i;
- }
- return at;
- }
- }
-
- /**
- * Isolates
- */
- public DIsolate getIsolate(int at) {
-
- if (at == Isolate.DEFAULT_ID)
- return (DIsolate) DEFAULT_ISOLATE;
-
- synchronized (m_isolates) {
- return m_isolates.get(at);
- }
- }
-
- public DIsolate getOrCreateIsolate(int at) {
- synchronized (m_isolates) {
- if (m_isolates.containsKey(at)) {
- return m_isolates.get(at);
- } else {
- DIsolate isolate = new DIsolate(at);
- m_isolates.put(at, isolate);
- return isolate;
- }
- }
- }
-
- public int getIsolateCount() {
- synchronized (m_isolates) {
- return m_isolates.size();
- }
- }
-
- public DIsolate[] getIsolates() {
- synchronized (m_isolates) {
- return m_isolates.values().toArray(new
DIsolate[m_isolates.size()]);
- }
- }
-
- boolean addIsolate(DIsolate t) {
- synchronized (m_isolates) {
- m_isolates.put(t.getId(), t);
- return true;
- }
- }
-
- void clearIsolates() {
- synchronized (m_isolates) {
- m_isolates.clear();
- }
- }
-
- DIsolate removeIsolate(int id) {
- synchronized (m_isolates) {
- DIsolate t = null;
- int at = findIsolate(id);
- if (at > -1)
- t = m_isolates.remove(at);
- return t;
- }
- }
-
- int findIsolate(int id) {
- synchronized (m_isolates) {
- if (m_isolates.containsKey(id))
- return id;
- else
- return -1;
- }
- }
-
- void setActiveIsolate(Isolate t) {
- synchronized (m_activeIsolateLock) {
- if (t == null) {
- m_activeIsolate = DEFAULT_ISOLATE;
- } else
- m_activeIsolate = t;
- }
- }
-
- Isolate getActiveIsolate() {
- synchronized (m_activeIsolateLock) {
- return m_activeIsolate;
- }
- }
-
-
- void setInIsolate(Isolate t) {
- synchronized (m_inIsolateLock) {
- if (t == null) {
- m_inIsolate = DEFAULT_ISOLATE;
- } else
- m_inIsolate = t;
- }
- }
-
- Isolate getInIsolate() {
- synchronized (m_inIsolateLock) {
- return m_inIsolate;
- }
- }
-
- Isolate getDefaultIsolate() {
- return DEFAULT_ISOLATE;
- }
-
-
- /**
- * Frame stack management related stuff
- *
- * @return true if we added this frame; false if we ignored it
- */
- boolean addFrame(DStackContext ds, int isolateId) {
- getIsolateState(isolateId).m_frames.add(ds);
- return true;
- }
-
- void clearFrames(int isolateId) {
- if (getIsolateState(isolateId).m_frames.size() > 0)
- getIsolateState(isolateId).m_previousFrames =
getIsolateState(isolateId).m_frames;
- getIsolateState(isolateId).m_frames = new
ArrayList<DStackContext>();
- }
-
- public DStackContext getFrame(int at, int isolateId) {
- return getIsolateState(isolateId).m_frames.get(at);
- }
-
- public int getFrameCount(int isolateId) {
- return getIsolateState(isolateId).m_frames.size();
- }
-
- public DStackContext[] getFrames(int isolateId) {
- ArrayList<DStackContext> frames =
getIsolateState(isolateId).m_frames;
- return frames.toArray(new DStackContext[frames.size()]);
- }
-
- private boolean stringsEqual(String s1, String s2) {
- if (s1 == null)
- return s2 == null;
- else
- return s1.equals(s2);
- }
-
- /**
- * Correlates the old list of stack frames, from the last time the
player
- * was suspended, with the new list of stack frames, attempting to guess
- * which frames correspond to each other. This is done so that
- * Variable.hasValueChanged() can work correctly for local variables.
- */
- private void mapOldFramesToNew(int isolateId) {
- ArrayList<DStackContext> previousFrames = null;
- ArrayList<DStackContext> frames = null;
- Map<Long, DValue> previousValues = null;
-
- previousFrames = getIsolateState(isolateId).m_previousFrames;
- frames = getIsolateState(isolateId).m_frames;
- previousValues = getIsolateState(isolateId).m_previousValues;
-
- int oldSize = previousFrames.size();
- int newSize = frames.size();
-
- // discard all old frames (we will restore some of them below)
- DValue[] oldFrames = new DValue[oldSize];
- for (int depth = 0; depth < oldSize; depth++) {
- oldFrames[depth] = (DValue)
previousValues.remove(Value.BASE_ID
- - depth);
- }
-
- // Start at the end of the stack (the stack frame farthest from
the
- // current one), and try to match up stack frames
- int oldDepth = oldSize - 1;
- int newDepth = newSize - 1;
- while (oldDepth >= 0 && newDepth >= 0) {
- DStackContext oldFrame = previousFrames.get(oldDepth);
- DStackContext newFrame = frames.get(newDepth);
- if (oldFrame != null && newFrame != null) {
- if (stringsEqual(oldFrame.getCallSignature(),
- newFrame.getCallSignature())) {
- DValue frame = oldFrames[oldDepth];
- if (frame != null)
-
previousValues.put(Value.BASE_ID - newDepth, frame);
- }
- }
- oldDepth--;
- newDepth--;
- }
- }
-
- /**
- * Get function is only supported in players that recognize the squelch
- * message.
- */
- public boolean isGetSupported() {
- return m_squelchEnabled;
- }
-
-
- /**
- * Returns a suspend information on why the Player has suspended
execution.
- *
- * @return see SuspendReason
- */
- public DSuspendInfo getSuspendInfo(int isolateId) {
- if (m_isolateState.containsKey(isolateId)) {
- return m_isolateState.get(isolateId).m_suspendInfo;
- }
- return null;
- }
-
- public ArrayList<SwfInfo> getIsolateSwfList() {
- ArrayList<SwfInfo> result = new ArrayList<SwfInfo>();
-
- for (DManagerIsolateState state : m_isolateState.values()) {
- if (state.m_swfInfo != null) {
- result.addAll(state.m_swfInfo);
- }
- }
-
- return result;
- }
-
- /**
- * Event management related stuff
- */
- public int getEventCount() {
- synchronized (m_event) {
- return m_event.size();
- }
- }
-
- /**
- * Get an object on which callers can call wait(), in order to wait
until
- * something happens.
- *
- * Note: The object will be signalled when EITHER of the following
happens:
- * (1) An event is added to the event queue; (2) The network connection
is
- * broken (and thus there will be no more events).
- *
- * @return an object on which the caller can call wait()
- */
- public Object getEventNotifier() {
- return m_event;
- }
-
- public DebugEvent nextEvent() {
- DebugEvent s = null;
- synchronized (m_event) {
- if (m_event.size() > 0)
- s = m_event.removeFirst();
- }
- return s;
- }
-
- public synchronized void addEvent(DebugEvent e) {
- synchronized (m_event) {
- m_event.add(e);
- m_event.notifyAll(); // wake up listeners (see
getEventNotifier())
- }
- }
-
- /**
- * Issued when the socket connection to the player is cut
- */
- public void disconnected() {
- synchronized (m_event) {
- m_event.notifyAll(); // see getEventNotifier()
- }
- }
-
- /**
- * This is the core routine for decoding incoming messages and deciding
what
- * should be done with them. We have registered ourself with DProtocol
to be
- * notified when any incoming messages have been received.
- *
- * It is important to note that we should not rely on the contents of
the
- * message since it may be reused after we exit this method.
- */
- public void messageArrived(DMessage msg, DProtocol which) {
- /*
- * at this point we just open up a big switch statement and
walk through
- * all possible cases
- */
- int type = msg.getType();
- // System.out.println("manager msg =
"+DMessage.inTypeName(type));
- int inIsolateId = getInIsolate() != null ?
getInIsolate().getId()
- : Isolate.DEFAULT_ID;
- if (inIsolateId != Isolate.DEFAULT_ID) {
- msg.setTargetIsolate(inIsolateId);
- }
- switch (type) {
- case DMessage.InVersion: {
- long ver = msg.getDWord();
- m_playerVersion = (int) ver;
-
- // Newer players will send another byte, which is the
pointer size
- // that is used by the player (in bytes).
- int pointerSize;
- if (msg.getRemaining() >= 1)
- pointerSize = msg.getByte();
- else
- pointerSize = 4;
- DMessage.setSizeofPtr(pointerSize);
- break;
- }
-
- case DMessage.InErrorExecLimit: {
- handleFaultEvent(new
RecursionLimitFault(msg.getTargetIsolate()));
- break;
- }
-
- case DMessage.InErrorWith: {
- handleFaultEvent(new
InvalidWithFault(msg.getTargetIsolate()));
- break;
- }
-
- case DMessage.InErrorProtoLimit: {
- handleFaultEvent(new
ProtoLimitFault(msg.getTargetIsolate()));
- break;
- }
-
- case DMessage.InErrorURLOpen: {
-// String url = msg.getString();
-// handleFaultEvent(new InvalidURLFault(url,
msg.getTargetIsolate()));
- break;
- }
-
- case DMessage.InErrorTarget: {
-// String name = msg.getString();
-// handleFaultEvent(new InvalidTargetFault(name,
msg.getTargetIsolate()));
- break;
- }
-
- case DMessage.InErrorException: {
- long offset = msg.getDWord();
- // As of FP9, the player will also send the
"toString()" message
- // of the exception. But for backward compatibility
with older
- // players, we won't assume that that is there.
- String exceptionMessage;
- boolean willExceptionBeCaught = false;
- Value thrown = null;
- if (msg.getRemaining() > 0) {
- exceptionMessage = msg.getString();
- if (msg.getRemaining() > 0) {
- if (msg.getByte() != 0) {
- willExceptionBeCaught =
(msg.getByte() != 0 ? true
- : false);
- msg.getPtr();
- DVariable thrownVar =
extractVariable(msg);
- thrown = thrownVar.getValue();
- }
- }
- } else {
- exceptionMessage = ""; //$NON-NLS-1$
- }
- ExceptionFault exceptionFault = new ExceptionFault(
- exceptionMessage,
willExceptionBeCaught, thrown, msg.getTargetIsolate());
- exceptionFault.isolateId = msg.getTargetIsolate();
- handleFaultEvent(exceptionFault);
- break;
- }
-
- case DMessage.InErrorStackUnderflow: {
-// long offset = msg.getDWord();
- handleFaultEvent(new
StackUnderFlowFault(msg.getTargetIsolate()));
- break;
- }
-
- case DMessage.InErrorZeroDivide: {
-// long offset = msg.getDWord();
- handleFaultEvent(new
DivideByZeroFault(msg.getTargetIsolate()));
- break;
- }
-
- case DMessage.InErrorScriptStuck: {
- handleFaultEvent(new
ScriptTimeoutFault(msg.getTargetIsolate()));
- break;
- }
-
- case DMessage.InErrorConsole: {
- String s = msg.getString();
- handleFaultEvent(new ConsoleErrorFault(s,
msg.getTargetIsolate()));
- break;
- }
-
- case DMessage.InTrace: {
- String text = msg.getString();
- addEvent(new TraceEvent(text));
- break;
- }
-
- case DMessage.InSquelch: {
- long state = msg.getDWord();
- m_squelchEnabled = (state != 0) ? true : false;
- break;
- }
-
- case DMessage.InParam: {
- String name = msg.getString();
- String value = msg.getString();
-
- // here's where we get movie = URL and password which
I'm not sure
- // what to do with?
- // System.out.println(name+"="+value);
- m_parms.put(name, value);
-
- // if string is a "movie", then this is a URL
- if (name.startsWith("movie")) //$NON-NLS-1$
- m_uri = convertToURI(value);
- break;
- }
-
- case DMessage.InPlaceObject: {
- long objId = msg.getPtr();
- String path = msg.getString();
- // m_bag.placeObject((int)objId, path);
- break;
- }
-
- case DMessage.InSetProperty: {
- long objId = msg.getPtr();
- int item = msg.getWord();
- String value = msg.getString();
- break;
- }
-
- case DMessage.InNewObject: {
- long objId = msg.getPtr();
- break;
- }
-
- case DMessage.InRemoveObject: {
- long objId = msg.getPtr();
- // m_bag.removeObject((int)objId);
- break;
- }
-
- case DMessage.InSetVariable: {
- long objId = msg.getPtr();
- String name = msg.getString();
- int dType = msg.getWord();
- int flags = (int) msg.getDWord();
- String value = msg.getString();
-
- // m_bag.createVariable((int)objId, name, dType, flags,
value);
- break;
- }
-
- case DMessage.InDeleteVariable: {
- long objId = msg.getPtr();
- String name = msg.getString();
- // m_bag.deleteVariable((int)objId, name);
- break;
- }
-
- case DMessage.InScript: {
- int module = (int) msg.getDWord();
- int bitmap = (int) msg.getDWord();
- String name = msg.getString(); // in
"basepath;package;filename"
-
// format
- String text = msg.getString();
- int swfIndex = -1;
- int isolateIndex = -1;
-
- /* new in flash player 9: player tells us what swf this
is for */
- if (msg.getRemaining() >= 4)
- swfIndex = (int) msg.getDWord();
-
- isolateIndex = msg.getTargetIsolate();
- getOrCreateIsolate(isolateIndex);
- if (putSource(swfIndex, module, bitmap, name, text,
- isolateIndex)) {
- // have we changed the list since last query
- if (!m_sourceListModified)
- addEvent(new FileListModifiedEvent());
-
- m_sourceListModified = true;
- }
- break;
- }
-
- case DMessage.InRemoveScript: {
- long module = msg.getDWord();
- int isolateId = msg.getTargetIsolate();
- Map<Integer, DModule> source =
getIsolateState(isolateId).m_source;
- synchronized (source) {
- if (removeSource((int) module, isolateId)) {
- // have we changed the list since last
query
- if (!m_sourceListModified)
- addEvent(new
FileListModifiedEvent());
-
- m_sourceListModified = true; /* current
source list is stale */
- }
- }
- break;
- }
-
- case DMessage.InAskBreakpoints: {
- // the player has just loaded a swf and we know the
player
- // has halted, waiting for us to continue. The only
caveat
- // is that it looks like it still does a number of
things in
- // the background which take a few seconds to complete.
- int targetIsolate = msg.getTargetIsolate();
- DSuspendInfo iSusInfo =
getIsolateState(targetIsolate).m_suspendInfo;
- if (iSusInfo == null) {
- iSusInfo = new
DSuspendInfo(SuspendReason.ScriptLoaded, 0,
- 0, 0, 0);
- }
- break;
- }
-
- case DMessage.InBreakAt: {
- long bp = 0, wideLine = 0, wideModule = 0;
- if (!m_wideLines) {
- bp = msg.getDWord();
- }
- else {
- wideModule = msg.getDWord();
- wideLine = msg.getDWord();
- }
- long id = msg.getPtr();
- String stack = msg.getString();
- int targetIsolate = msg.getTargetIsolate();
-
- int module = DLocation.decodeFile(bp);
- int line = DLocation.decodeLine(bp);
- if (m_wideLines) {
- module = (int)wideModule;
- line = (int)wideLine;
- }
- addEvent(new BreakEvent(module, line, targetIsolate));
- break;
- }
-
- case DMessage.InContinue: {
- /* we are running again so trash all our variable
contents */
- continuing(msg.getTargetIsolate());
- break;
- }
-
- case DMessage.InSetLocalVariables: {
-// long objId = msg.getPtr();
- // m_bag.markObjectLocal((int)objId, true);
- break;
- }
-
- case DMessage.InSetBreakpoint: {
- long count = msg.getDWord();
- int targetIsolate = msg.getTargetIsolate();
- while (count-- > 0) {
- long bp = 0, moduleNumber = 0, lineNumber = 0;
- if (!m_wideLines) {
- bp = msg.getDWord();
- }
- else {
- moduleNumber = msg.getDWord();
- lineNumber = msg.getDWord();
- }
-
- int fileId = DLocation.decodeFile(bp);
- int line = DLocation.decodeLine(bp);
- if (m_wideLines) {
- fileId = (int)moduleNumber;
- line = (int)lineNumber;
- }
-
- DModule file = null;
- file = getSource(fileId, targetIsolate);
-
- DLocation l = new DLocation(file, line,
targetIsolate);
-
- if (file != null) {
- addBreakpoint((int) bp, l,
targetIsolate);
- }
- }
- break;
- }
-
- case DMessage.InNumScript: {
- /* lets us know how many scripts there are */
- int num = (int) msg.getDWord();
- int targetIsolate = msg.getTargetIsolate();
- DSwfInfo swf;
-
- /*
- * New as of flash player 9: another dword indicating
which swf this
- * is for. That means we don't have to guess whether
this is for an
- * old SWF which has just had some more modules loaded,
or for a new
- * SWF!
- */
- if (msg.getRemaining() >= 4) {
- int swfIndex = (int) msg.getDWord();
- swf = getOrCreateSwfInfo(swfIndex,
targetIsolate);
- getIsolateState(targetIsolate).m_lastSwfInfo =
swf;
- } else {
- /*
- * This is not flash player 9 (or it is an
early build of fp9).
- *
- * We use this message as a trigger that a new
swf has been
- * loaded, so make sure we are ready to accept
the scripts.
- */
- swf = getActiveSwfInfo(targetIsolate);
- }
-
- // It is NOT an error for the player to have sent us a
new,
- // different sourceExpectedCount from whatever we had
before!
- // In fact, this happens all the time, whenever a SWF
has more
- // than one ABC.
- swf.setSourceExpectedCount(num);
- break;
- }
-
- case DMessage.InRemoveBreakpoint: {
- long count = msg.getDWord();
- int isolateId = msg.getTargetIsolate();
- while (count-- > 0) {
- long bp = msg.getDWord();
- removeBreakpoint((int) bp, isolateId);
- }
- break;
-
- }
-
- case DMessage.InBreakAtExt: {
- long bp = 0, wideLine = 0, wideModule = 0;
- if (!m_wideLines) {
- bp = msg.getDWord();
- }
- else {
- wideModule = msg.getDWord();
- wideLine = msg.getDWord();
- }
- long num = msg.getDWord();
-
- int targetIsolate = msg.getTargetIsolate();
- //
System.out.println(msg.getInTypeName()+",bp="+(bp&0xffff)+":"+(bp>>16));
- /* we have stack info to store away */
- clearFrames(targetIsolate); // just in case
- int depth = 0;
-
- while (num-- > 0) {
- long bpi = 0, wideLinei= 0, wideModulei = 0;
- if (!m_wideLines) {
- bpi = msg.getDWord();
- }
- else {
- wideModulei = msg.getDWord();
- wideLinei = msg.getDWord();
- }
- long id = msg.getPtr();
- String stack = msg.getString();
- int module = DLocation.decodeFile(bpi);
- int line = DLocation.decodeLine(bpi);
- if (m_wideLines) {
- module = (int)wideModulei;
- line = (int)wideLinei;
- }
- DModule m = null;
- m = getSource(module, targetIsolate);
- DStackContext c = new DStackContext(module,
line, m, id, stack,
- depth, targetIsolate);
- // If addFrame() returns false, that means it
chose to ignore
- // this
- // frame, so we do NOT want to increment our
depth for the next
- // time through the loop. If it returns true,
then we do want
- // to.
- if (addFrame(c, targetIsolate))
- ++depth;
- // System.out.println("
this="+id+",@"+(bpi&0xffff)+":"+(bpi>>16)+",stack="+stack);
- }
- mapOldFramesToNew(targetIsolate);
- if (targetIsolate != Isolate.DEFAULT_ID) {
- // ask for isolate id if it is present
- appendIsolateInfoToFrame(targetIsolate);
-
- }
- break;
-
- }
-
- case DMessage.InFrame: {
- // For InFrame the first element is really our frame id
- DValue frame = null;
- DVariable child = null;
- ArrayList<DVariable> v = new ArrayList<DVariable>();
- ArrayList<DVariable> registers = new
ArrayList<DVariable>();
- int targetIsolate = msg.getTargetIsolate();
- int depth = (int) msg.getDWord(); // depth of frame
-
- // make sure we have a valid depth
- if (depth > -1) {
- // first thing is number of registers
- int num = (int) msg.getDWord();
- for (int i = 0; i < num; i++)
- registers.add(extractRegister(msg, i +
1));
- }
-
- int currentArg = -1;
- boolean gettingScopeChain = false;
-
- // then our frame itself
- while (msg.getRemaining() > 0) {
- long frameId = msg.getPtr();
-
- if (frame == null) {
- frame = getOrCreateValue(frameId,
targetIsolate);
- extractVariable(msg); // put the rest
of the info in the
-
// trash
- } else {
- child = extractVariable(msg);
- if (currentArg == -1
- &&
child.getName().equals(ARGUMENTS_MARKER)) {
- currentArg = 0;
- gettingScopeChain = false;
- } else if
(child.getName().equals(SCOPE_CHAIN_MARKER)) {
- currentArg = -1;
- gettingScopeChain = true;
- } else if (currentArg >= 0) {
- // work around a compiler bug:
If the variable's name is
- // "undefined",
- // then change its name to
"_argN", where "N" is the
- // argument index,
- // e.g. _arg1, _arg2, etc.
- ++currentArg;
- if
(child.getName().equals("undefined")) //$NON-NLS-1$
- child.setName("_arg" +
currentArg); //$NON-NLS-1$
- }
-
- // All args and locals get added as
"children" of
- // the frame; but scope chain entries
do not.
- if (!gettingScopeChain)
- addVariableMember(frameId,
child, targetIsolate);
-
- // Everything gets added to the ordered
list of
- // variables that came in.
- v.add(child);
- }
- }
-
- // let's transfer our newly gained knowledge into the
stack context
- if (depth == 0)
- populateRootNode(frame, v, targetIsolate);
- else
- populateFrame(depth, v, targetIsolate);
-
- break;
- }
-
- case DMessage.InOption: {
- String s = msg.getString();
- String v = msg.getString();
- m_options.put(s, v);
- break;
- }
-
- case DMessage.InGetVariable: {
- // For InGetVariable the first element is the original
entity we
- // requested
- DValue parent = null;
- DVariable child = null;
- String definingClass = null;
- int level = 0;
- int targetIsolate = msg.getTargetIsolate();
- int highestLevelWithMembers = -1;
- List<String> classes = new ArrayList<String>();
-
- while (msg.getRemaining() > 0) {
- long parentId = msg.getPtr();
-
- // build or get parent node
- if (parent == null) {
- String name = msg.getString();
-
- // pull the contents of the node which
normally are disposed
- // of except if we did a 0,name call
-
getIsolateState(targetIsolate).m_lastInGetVariable = extractVariable(msg,
name);
-
- parent = getOrCreateValue(parentId,
targetIsolate);
- } else {
- // extract the child and add it to the
parent.
- child = extractVariable(msg);
- if (showMember(child)) {
- if
(child.isAttributeSet(VariableAttribute.IS_DYNAMIC)) {
- // Dynamic attributes
always come in marked as a
- // member of
- // class "Object"; but
to the user, it makes more
- // sense to
- // consider them as
members of the topmost class.
- if (classes.size() > 0)
{
-
child.setDefiningClass(0, classes.get(0));
-
highestLevelWithMembers = Math.max(
-
highestLevelWithMembers, 0);
- }
- } else {
-
child.setDefiningClass(level, definingClass);
- if (definingClass !=
null) {
-
highestLevelWithMembers = Math.max(
-
highestLevelWithMembers, level);
- }
- }
-
addVariableMember(parent.getId(), child, targetIsolate);
- } else {
- if (isTraits(child)) {
- definingClass =
child.getQualifiedName();
- level = classes.size();
-
- // If the traits name
end with "$", then it
- // represents a class
object --
- // in other words, the
variables inside it are
- // static variables of
that
- // class. In that case,
we need to juggle the
- // information. For
example,
- // if we are told that
a variable is a member of
- // "MyClass$", we
actually
- // store it into the
information for "MyClass".
- if
(definingClass.endsWith("$")) { //$NON-NLS-1$
- String
classWithoutDollar = definingClass
-
.substring(0,
-
definingClass.length() - 1);
- int
indexOfClass = classes
-
.indexOf(classWithoutDollar);
- if
(indexOfClass != -1) {
- level =
indexOfClass;
-
definingClass = classWithoutDollar;
- }
- }
-
- // It wasn't static --
so, add this class to the end
- // of the list of
classes
- if (level ==
classes.size()) {
-
classes.add(definingClass);
- }
- }
- }
- }
- }
-
- if (parent != null && parent.getClassHierarchy(true) ==
null) {
- parent.setClassHierarchy(
- classes.toArray(new
String[classes.size()]),
- highestLevelWithMembers + 1);
- }
-
- break;
- }
-
- case DMessage.InWatch: // for AS2; sends 16-bit ID field
- case DMessage.InWatch2: // for AS3; sends 32-bit ID field
- {
- // This message is sent whenever a watchpoint is added
- // modified or removed.
- //
- // For an addition, flags will be non-zero and
- // success will be true.
- //
- // For a modification flags will be non-zero.
- // and oldFlags will be non-zero and success
- // will be true. Additionally oldFlags will not
- // be equal to flags.
- //
- // For a removal flags will be zero. oldFlags
- // will be non-zero.
- //
- // flags identifies the type of watchpoint added,
- // see WatchKind.
- //
- // success indicates whether the operation was
successful
- //
- // request. It will be associated with the watchpoint.
- int success = msg.getWord();
- int oldFlags = msg.getWord();
- int oldTag = msg.getWord();
- int flags = msg.getWord();
- int tag = msg.getWord();
- // for AS2, the ID came in above as a Word. For AS3,
the above value
- // is
- // bogus, and it has been sent again as a DWord.
- long id = ((type == DMessage.InWatch2) ? msg.getPtr() :
msg
- .getWord());
- String name = msg.getString();
- int targetIsolate = msg.getTargetIsolate();
-
- if (success != 0) {
- if (flags == 0) {
- removeWatchpoint(oldTag, targetIsolate);
- } else {
- // modification or addition is the same
to us
- // a new watch is created and added
into the table
- // while any old entry if it exists is
removed.
- removeWatchpoint(oldTag, targetIsolate);
- DWatch w = new DWatch(id, name, flags,
tag, targetIsolate);
- addWatchpoint(w, targetIsolate);
- }
- }
- break;
- }
-
- case DMessage.InGetSwf: {
- // we only house the swf temporarily, PlayerSession then
- // pieces it back into swfinfo record. Also, we don't
- // send any extra data in the message so that we need
not
- // copy the bytes.
- m_swf = msg.getData();
- break;
- }
-
- case DMessage.InGetSwd: {
- // we only house the swd temporarily, PlayerSession then
- // pieces it back into swfinfo record.
- m_swd = msg.getData();
- break;
- }
-
- case DMessage.InBreakReason: {
- // the id map 1-1 with out SuspendReason interface
constants
- int suspendReason = msg.getWord();
- int suspendPlayer = msg.getWord(); // item index of
player
- int breakOffset = (int) msg.getDWord(); // current
script offset
- int prevBreakOffset = (int) msg.getDWord(); // prev
script offset
- int nextBreakOffset = (int) msg.getDWord(); // next
script offset
- int targetIsolate = msg.getTargetIsolate();
-
- getIsolateState(targetIsolate).m_suspendInfo = new
DSuspendInfo(
- suspendReason, suspendPlayer,
breakOffset,
- prevBreakOffset, nextBreakOffset);
-
- // augment the current frame with this information. It
- // should work ok since we only get this message after a
- // InBreakAtExt message
- try {
- DStackContext c = getFrame(0, targetIsolate);
- c.setOffset(breakOffset);
- c.setSwfIndex(suspendPlayer);
- } catch (Exception e) {
- if (Trace.error) {
- Trace.trace("Oh my god, gag me with a
spoon...getFrame(0) call failed"); //$NON-NLS-1$
- e.printStackTrace();
- }
- }
- break;
- }
-
- // obtain raw action script byte codes
- case DMessage.InGetActions: {
- int item = msg.getWord();
- int rsvd = msg.getWord();
- int at = (int) msg.getDWord();
- int len = (int) msg.getDWord();
- int i = 0;
-
- m_actions = (len <= 0) ? null : new byte[len];
- while (len-- > 0)
- m_actions[i++] = (byte) msg.getByte();
-
- break;
- }
-
- // obtain data about a SWF
- case DMessage.InSwfInfo: {
- int count = msg.getWord();
- int targetIsolate = msg.getTargetIsolate();
- for (int i = 0; i < count; i++) {
- long index = msg.getDWord();
- long id = msg.getPtr();
-
- // get it
- DSwfInfo info = null;
-
- info = getOrCreateSwfInfo((int) index,
targetIsolate);
- getIsolateState(targetIsolate).m_lastSwfInfo =
info;
-
- // remember which was last seen
-
- if (id != 0) {
- boolean debugComing = (msg.getByte() ==
0) ? false : true;
- byte vmVersion = (byte) msg.getByte();
// AS vm version
-
// number (1 = avm+,
-
// 0 == avm-)
- int rsvd1 = msg.getWord();
-
- long swfSize = msg.getDWord();
- long swdSize = msg.getDWord();
- long scriptCount = msg.getDWord();
- long offsetCount = msg.getDWord();
- long breakpointCount = msg.getDWord();
-
- long port = msg.getDWord();
- String path = msg.getString();
- String url = msg.getString();
- String host = msg.getString();
- Map<Long, Integer> local2global = new
HashMap<Long, Integer>();
- int minId = Integer.MAX_VALUE;
- int maxId = Integer.MIN_VALUE;
- // now we read in the swd debugging map
(which provides
- // local to global mappings of the
script ids
- /* anirudhs: Parsing this is only
necessary if we are in
- AVM1. (See PlayerSession::run(),
there is a vmVersion
- check before calling parseSwfSwd().
*/
- if (swdSize > 0) {
- long num = msg.getDWord();
- for (int j = 0; j < num; j++) {
- if (msg.getRemaining()
< DMessage.getSizeofPtr()) {
- /* The SWD
debugging map sent out by
- * AVM2 often
runs short usually in 64-bit
- * debug
player. We can stop with what we know
- * and move on.
- */
- break;
- }
- long local =
msg.getPtr();
- int global = (int)
msg.getDWord();
- local2global.put(local,
global);
- minId = (global <
minId) ? global : minId;
- maxId = (global >
maxId) ? global : maxId;
- }
- }
- // If its a new record then the swf
size would have been
- // unknown at creation time
- boolean justCreated =
(info.getSwfSize() == 0);
-
- // if we are a avm+ engine then we
don't wait for the swd to
- // load
- if (vmVersion > 0) {
- debugComing = false;
- info.setVmVersion(vmVersion);
- info.setPopulated(); // added
by mmorearty on 9/5/05 for
-
// RSL debugging
- }
-
- // update this swfinfo with the lastest
data
- info.freshen(id, path, url, host, port,
debugComing,
- swfSize, swdSize,
breakpointCount, offsetCount,
- scriptCount,
local2global, minId, maxId);
- // now tie any scripts that have been
loaded into this
- // swfinfo object
- tieScriptsToSwf(info, targetIsolate);
-
- // notify if its newly created
- if (justCreated)
- addEvent(new SwfLoadedEvent(id,
(int) index, path, url,
- host, port,
swfSize));
- } else {
- // note our state before marking it
- boolean alreadyUnloaded =
info.isUnloaded();
-
- // clear it out
- info.setUnloaded();
-
- // notify if this information is new.
- if (!alreadyUnloaded)
- addEvent(new
SwfUnloadedEvent(info.getId(),
- info.getPath(),
(int) index));
- }
- // System.out.println("[SWFLOAD] Loaded
"+path+", size="+swfSize+", scripts="+scriptCount);
- }
- break;
- }
-
- // obtain the constant pool of some player
- case DMessage.InConstantPool: {
- int item = msg.getWord();
- int count = (int) msg.getDWord();
-
- String[] pool = new String[count];
- for (int i = 0; i < count; i++) {
- long id = msg.getPtr();
- DVariable var = extractVariable(msg);
-
- // we only need the contents of the variable
- pool[i] = var.getValue().getValueAsString();
- }
- m_lastConstantPool = pool;
- break;
- }
-
- // obtain one or more function name line number
mappings.
- case DMessage.InGetFncNames: {
- long id = msg.getDWord(); // module id
- long count = msg.getDWord(); // number of entries
-
- // get the DModule
- DModule m = getSource((int) id, msg.getTargetIsolate());
- if (m != null) {
- for (int i = 0; i < count; i++) {
- int offset = (int) msg.getDWord();
- int firstLine = (int) msg.getDWord();
- int lastLine = (int) msg.getDWord();
- String name = msg.getString();
-
- // now add the entries
- m.addLineFunctionInfo(offset,
firstLine, lastLine, name);
- }
- }
- break;
- }
-
- case DMessage.InCallFunction:
- case DMessage.InBinaryOp: {
- // For InCallFunction the first element is the original
function we
- // requested
- DValue parent = null;
- int targetIsolate = msg.getTargetIsolate();
- DVariable child = null;
- String definingClass = null;
- int level = 0;
- int highestLevelWithMembers = -1;
- List<String> classes = new ArrayList<String>();
-
- if (type == DMessage.InBinaryOp)
- msg.getDWord(); // id
-
- while (msg.getRemaining() > 0) {
- long parentId = msg.getPtr();
-
- // build or get parent node
- if (parent == null) {
- String name = msg.getString();
-
- // pull the contents of the node which
normally are disposed
- // of except if we did a 0,name call
- DVariable var = extractVariable(msg,
name);
- if (type == DMessage.InCallFunction) {
-
getIsolateState(targetIsolate).m_lastInCallFunction = var;
- }
- else {
-
getIsolateState(targetIsolate).m_lastInBinaryOp = var;
- }
-
- parent = getOrCreateValue(parentId,
targetIsolate);
- } else {
- // extract the child and add it to the
parent.
- child = extractVariable(msg);
- if (showMember(child)) {
- if
(child.isAttributeSet(VariableAttribute.IS_DYNAMIC)) {
- // Dynamic attributes
always come in marked as a
- // member of
- // class "Object"; but
to the user, it makes more
- // sense to
- // consider them as
members of the topmost class.
- if (classes.size() > 0)
{
-
child.setDefiningClass(0, classes.get(0));
-
highestLevelWithMembers = Math.max(
-
highestLevelWithMembers, 0);
- }
- } else {
-
child.setDefiningClass(level, definingClass);
- if (definingClass !=
null) {
-
highestLevelWithMembers = Math.max(
-
highestLevelWithMembers, level);
- }
- }
-
addVariableMember(parent.getId(), child, targetIsolate);
- } else {
- if (isTraits(child)) {
- definingClass =
child.getQualifiedName();
- level = classes.size();
-
- // If the traits name
end with "$", then it
- // represents a class
object --
- // in other words, the
variables inside it are
- // static variables of
that
- // class. In that case,
we need to juggle the
- // information. For
example,
- // if we are told that
a variable is a member of
- // "MyClass$", we
actually
- // store it into the
information for "MyClass".
- if
(definingClass.endsWith("$")) { //$NON-NLS-1$
- String
classWithoutDollar = definingClass
-
.substring(0,
-
definingClass.length() - 1);
- int
indexOfClass = classes
-
.indexOf(classWithoutDollar);
- if
(indexOfClass != -1) {
- level =
indexOfClass;
-
definingClass = classWithoutDollar;
- }
- }
-
- // It wasn't static --
so, add this class to the end
- // of the list of
classes
- if (level ==
classes.size()) {
-
classes.add(definingClass);
- }
- }
- }
- }
- }
-
- if (parent != null && parent.getClassHierarchy(true) ==
null) {
- parent.setClassHierarchy(
- classes.toArray(new
String[classes.size()]),
- highestLevelWithMembers + 1);
- }
-
- break;
- }
-
- case DMessage.InIsolateCreate: {
- long id = msg.getDWord();
- isolateCreate((int) id);
-
- break;
- }
-
- case DMessage.InIsolateExit: {
- long id = msg.getDWord();
- // Implementation dependency on runtime in case id
mechanism is
- // changed:
- // Typecast id into an int.
- DIsolate isolate = removeIsolate((int) id);
- addEvent(new IsolateExitEvent(isolate));
-
- break;
- }
-
- case DMessage.InIsolateEnumerate: {
- // clearIsolates();
- //
- // long lenIsolate = msg.getDWord();
- //
- // for ( int i = 0; i < lenIsolate; i++) {
- // long id = msg.getDWord();
- // addIsolate(new DIsolate(id));
- // }
-
- break;
- }
-
- case DMessage.InSetActiveIsolate: {
- long id = msg.getDWord();
-
- boolean success = msg.getByte() != 0 ? true : false;
-
- /** Ignore inset since we don't wait
- * for response anymore.
- */
-// synchronized (m_activeIsolateLock) {
-// if (success) {
-// int at = findIsolate((int) id);
-// if (at > -1)
-//
setActiveIsolate(getIsolate(at));
-// } else {
-// setActiveIsolate(null);
-// }
-// }
-
- break;
- }
-
- case DMessage.InIsolate: {
- long id = msg.getDWord();
- synchronized (m_inIsolateLock) {
- int at = findIsolate((int) id);
- if (at != -1)
- setInIsolate(getIsolate(at));
- else {
- if (id != Isolate.DEFAULT_ID) {
-
setInIsolate(isolateCreate((int) id));
- } else
- setInIsolate(null);
- }
- }
- break;
- }
-
- case DMessage.InSetExceptionBreakpoint: {
-
- int result = msg.getWord();
- String exceptionBP = msg.getString();
- int remaining = msg.getRemaining();
- break;
- }
-
- case DMessage.InRemoveExceptionBreakpoint: {
- int result = msg.getWord();
- String exceptionBP = msg.getString();
- int remaining = msg.getRemaining();
- break;
- }
-
- default: {
- break;
- }
- }
- }
-
- private DIsolate isolateCreate(int id) {
- int idx = findIsolate(id);
- if (idx == -1) {
- DIsolate isolate = new DIsolate(id);
- addIsolate(isolate);
- setInIsolate(isolate);
- addEvent(new IsolateCreateEvent(isolate));
- return isolate;
- }
- return getIsolate(idx);
-
- }
-
- private void appendIsolateInfoToFrame(int isolateid) {
- // augment the current frame with this information. It
- // should work ok since we only get this message after a
- // InBreakAtExt message
- try {
- DStackContext c = getFrame(0, isolateid);
- c.setIsolateId(isolateid);
- } catch (Exception e) {
- if (Trace.error) {
- Trace.trace("Oh my god, gag me with a
spoon...getFrame(0) call failed"); //$NON-NLS-1$
- e.printStackTrace();
- }
- }
- }
-
- /**
- * Returns whether a given child member should be shown, or should be
- * filtered out.
- */
- private boolean showMember(DVariable child) {
- if (isTraits(child))
- return false;
- return true;
- }
-
- /**
- * Returns whether this is not a variable at all, but is instead a
- * representation of a "traits" object. A "traits" object is the Flash
- * player's way of describing one class.
- */
- private boolean isTraits(DVariable variable) {
- Value value = variable.getValue();
- if (value.getType() == VariableType.UNKNOWN
- &&
Value.TRAITS_TYPE_NAME.equals(value.getTypeName())) {
- return true;
- }
- return false;
- }
-
- /**
- * Here's where some ugly stuff happens. Since our context contains more
- * info than what's contained within the stackcontext, we augment it
with
- * the variables. Also, we build up a list of variables that appears
under
- * root, that can be accessed without further qualification; this
includes
- * args, locals and _global.
- */
- void populateRootNode(DValue frame, ArrayList<DVariable>
orderedChildList,
- int isolateId) {
- // first populate the stack node with children
- populateFrame(0, orderedChildList, isolateId);
-
- /**
- * We mark it as members obtained so that we don't go to the
player and
- * request it, which would be bad, since its our artifical
creation.
- */
- DValue base = getOrCreateValue(Value.BASE_ID, isolateId);
- base.setMembersObtained(true);
-
- /**
- * Technically, we don't need to create the following nodes,
but we like
- * to give them nice type names
- */
-
- // now let's create a _global node and attach it to base
- }
-
- /**
- * We are done, so let's look for a number of special variables, since
our
- * frame comes in 3 pieces. First off is a "this" pointer, followed by a
- * "$arguments" dummy node, followed by a "super" which marks the end
of the
- * arguments.
- *
- * All of this stuff gets pulled apart after we build the frame node.
- */
- void populateFrame(int depth, ArrayList<DVariable> frameVars, int
isolateId) {
- // get our stack context
- DStackContext context = null;
- boolean inArgs = false;
- int nArgs = -1;
- boolean inScopeChain = false;
-
- // create a root node for each stack frame; first is at BASE_ID
- DValue root = getOrCreateValue(Value.BASE_ID - depth,
isolateId);
-
- if (depth < getFrameCount(isolateId))
- context = getFrame(depth, isolateId);
-
- // trim all current args from this context
- if (context != null)
- context.removeAllVariables();
-
- // use the ordered child list
- Iterator<DVariable> e = frameVars.iterator();
- while (e.hasNext()) {
- DVariable v = e.next();
- String name = v.getName();
-
- // let's clear a couple of attributes that may get in
our way
- v.clearAttribute(VariableAttribute.IS_LOCAL);
- v.clearAttribute(VariableAttribute.IS_ARGUMENT);
- if (name.equals("this")) //$NON-NLS-1$
- {
- if (context != null)
- context.setThis(v);
-
- // from our current frame, put a pseudo this
entry into the
- // cache and hang it off base, mark it as an
implied arg
- v.setAttribute(VariableAttribute.IS_ARGUMENT);
- addVariableMember(root, v, isolateId);
-
- // also add this variable under THIS_ID
- if (depth == 0)
- putValue(Value.THIS_ID, (DValue)
v.getValue(), isolateId);
- } else if (name.equals("super")) //$NON-NLS-1$
- {
- // we are at the end of the arg list and let's
make super part
- // of global
- inArgs = false;
- } else if (name.equals(ARGUMENTS_MARKER)) {
- inArgs = true;
-
- // see if we can extract an arg count from this
variable
- try {
- nArgs = ((Number)
(v.getValue().getValueAsObject()))
- .intValue();
- } catch (NumberFormatException nfe) {
- }
- } else if (name.equals(SCOPE_CHAIN_MARKER)) {
- inArgs = false;
- inScopeChain = true;
- } else {
- // add it to our root, marking it as an arg if
we know,
- // otherwise local
- if (inArgs) {
-
v.setAttribute(VariableAttribute.IS_ARGUMENT);
-
- if (context != null)
- context.addArgument(v);
-
- // decrement arg count if we have it
- if (nArgs > -1) {
- if (--nArgs <= 0)
- inArgs = false;
- }
- } else if (inScopeChain) {
- if (context != null)
- context.addScopeChainEntry(v);
- } else {
-
v.setAttribute(VariableAttribute.IS_LOCAL);
- if (context != null)
- context.addLocal(v);
- }
-
- // add locals and arguments to root
- if (!inScopeChain)
- addVariableMember(root, v, isolateId);
- }
- }
- }
-
- /**
- * Map DMessage / Player attributes to VariableAttributes
- */
- int toAttributes(int pAttr) {
- int attr = pAttr; /* 1-1 mapping */
- return attr;
- }
-
- DVariable extractVariable(DMessage msg) {
- DVariable v = extractVariable(msg, msg.getString());
- return v;
- }
-
- /**
- * Build a variable based on the information we can extract from the
- * messsage
- */
- DVariable extractVariable(DMessage msg, String name) {
- int oType = msg.getWord();
- int flags = (int) msg.getDWord();
- return extractAtom(msg, name, oType, flags);
- }
-
- /**
- * Extracts an builds a register variable
- */
- DVariable extractRegister(DMessage msg, int number) {
- int oType = msg.getWord();
- return extractAtom(msg, "$" + number, oType, 0); //$NON-NLS-1$
- }
-
- /**
- * Does the job of pulling together a variable based on the type of
object
- * encountered.
- */
- DVariable extractAtom(DMessage msg, String name, int oType, int flags) {
- int vType = VariableType.UNKNOWN;
- Object value = null;
- String typeName = ""; //$NON-NLS-1$
- String className = ""; //$NON-NLS-1$
- boolean isPrimitive = false;
-
- /* now we vary depending upon type */
- switch (oType) {
- case DMessage.kNumberType: {
- String s = msg.getString();
- double dval = Double.NaN;
- try {
- dval = Double.parseDouble(s);
- } catch (NumberFormatException nfe) {
- }
-
- value = new Double(dval);
- isPrimitive = true;
- break;
- }
-
- case DMessage.kBooleanType: {
- int bval = msg.getByte();
- value = new Boolean((bval == 0) ? false : true);
- isPrimitive = true;
- break;
- }
-
- case DMessage.kStringType: {
- String s = msg.getString();
-
- value = s;
- isPrimitive = true;
- break;
- }
-
- case DMessage.kObjectType:
- case DMessage.kNamespaceType: {
- long oid = msg.getPtr();
- long cType = (oid == -1) ? 0 : msg.getDWord();
- int isFnc = (oid == -1) ? 0 : msg.getWord();
- int rsvd = (oid == -1) ? 0 : msg.getWord();
- typeName = (oid == -1) ? "" : msg.getString();
//$NON-NLS-1$
- /* anirudhs: Date fix for expression evaluation */
- /* Player 10.2 onwards, the typename for Date comes
- * as <dateformat>@oid where example of date format is:
- * <Tue Feb 7 15:41:16 GMT+0530 2012>
- * We have to fix the typename to how it originally
- * appeared prior to this bug which is Date@oid.
- * Note that even player 9 did not send oType as 11,
- * instead oType was Object where as typeName was Date.
- * What the customer sees is expression evaluation will
- * always try to interpret date as a number.
(ECMA.defaultValue
- * has a check for preferredType of Date to be String)
- */
- if (typeName.startsWith("<")) { //$NON-NLS-1$
- int atIndex = typeName.indexOf('@');
- String dateVal = typeName;
- if (atIndex > -1) {
- dateVal = typeName.substring(0,
atIndex);
- }
- SimpleDateFormat dFormat = new
SimpleDateFormat("<EEE MMM d HH:mm:ss 'GMT'z yyyy>"); //$NON-NLS-1$
- try {
- Date dateObj = dFormat.parse(dateVal);
- if (dateObj != null &&
dateObj.getTime() != 0) {
- oType = DMessage.kDateType;
- typeName = "Date" +
typeName.substring(atIndex); //$NON-NLS-1$
- }
- }
- catch (ParseException e) {
- //ignore
- }
- }
-
- className = DVariable.classNameFor(cType, false);
- value = new Long(oid);
- vType = (isFnc == 0) ? VariableType.OBJECT :
VariableType.FUNCTION;
- break;
- }
-
- case DMessage.kMovieClipType: {
- long oid = msg.getPtr();
- long cType = (oid == -1) ? 0 : msg.getDWord();
- long rsvd = (oid == -1) ? 0 : msg.getDWord();
- typeName = (oid == -1) ? "" : msg.getString();
//$NON-NLS-1$
- className = DVariable.classNameFor(cType, true);
-
- value = new Long(oid);
- vType = VariableType.MOVIECLIP;
- break;
- }
-
- case DMessage.kNullType: {
- value = null;
- isPrimitive = true;
- break;
- }
-
- case DMessage.kUndefinedType: {
- value = Value.UNDEFINED;
- isPrimitive = true;
- break;
- }
-
- case DMessage.kTraitsType: {
- // 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.
- vType = VariableType.UNKNOWN;
- typeName = Value.TRAITS_TYPE_NAME;
- break;
- }
-
- case DMessage.kReferenceType:
- case DMessage.kArrayType:
- case DMessage.kObjectEndType:
- case DMessage.kStrictArrayType:
- case DMessage.kDateType:
- case DMessage.kLongStringType:
- case DMessage.kUnsupportedType:
- case DMessage.kRecordSetType:
- case DMessage.kXMLType:
- case DMessage.kTypedObjectType:
- case DMessage.kAvmPlusObjectType:
- default: {
- // System.out.println("<unknown>");
- break;
- }
- }
- int isolateId = msg.getTargetIsolate();
- // create the variable based on the content we received.
- DValue valueObject = null;
-
- // If value is a Long, then it is the ID of a non-primitive
object;
- // look up to see if we already have that object in our cache.
If
- // it is already in our cache, then we just want to modify the
- // existing object with the new values.
- if (value instanceof Long) {
- valueObject = getValue(((Long) value).longValue(),
isolateId);
- }
-
- if (valueObject == null) {
- // we didn't find it in the cache, so make a new Value
-
- if (isPrimitive) {
- valueObject = DValue.forPrimitive(value,
isolateId);
- valueObject.setAttributes(toAttributes(flags));
- } else {
- valueObject = new DValue(vType, typeName,
className,
- toAttributes(flags), value,
isolateId);
- }
-
- if (value instanceof Long
- && (toAttributes(flags) &
VariableAttribute.HAS_GETTER) == 0)
- putValue(((Long) value).longValue(),
valueObject, isolateId);
- } else {
- // we found it in the cache, so just modify the
properties
- // of the old Value
-
- if (isPrimitive) {
- // figure out some of the properties
- DValue temp = DValue.forPrimitive(value,
isolateId);
- vType = temp.getType();
- typeName = temp.getTypeName();
- className = temp.getClassName();
- }
-
- valueObject.setType(vType);
- valueObject.setTypeName(typeName);
- valueObject.setClassName(className);
- valueObject.setAttributes(toAttributes(flags));
- valueObject.setValue(value);
- }
- if (valueObject != null) {
- valueObject.setIsolateId(isolateId);
- }
- DVariable var = new DVariable(name, valueObject, isolateId);
- return var;
- }
-
- /**
- * The player sends us a URI using '|' instead of ':'
- */
- public static String convertToURI(String playerURL) {
- int index = playerURL.indexOf('|');
- StringBuilder sb = new StringBuilder(playerURL);
- while (index > 0) {
- sb.setCharAt(index, ':');
- index = playerURL.indexOf('|', index + 1);
- }
- return sb.toString();
- }
-
- /**
- * Tell us that we are about to start executing user code in the player,
- * such as a getter, a setter, or a function call. If a FaultEvent
comes in
- * while the code is executing, it is not added to the event queue in
the
- * normal way -- instead, it is saved, and is returned when
- * endPlayerCodeExecution() is called.
- */
- public void beginPlayerCodeExecution(int isolateId) {
- DManagerIsolateState state = getIsolateState(isolateId);
- state.m_executingPlayerCode = true;
- state.m_faultEventDuringPlayerCodeExecution = null;
- }
-
- /**
- * Informs us that user code is no longer executing, and returns the
fault,
- * if any, which occurred while the code was executing.
- */
- public FaultEvent endPlayerCodeExecution(int isolateId) {
- DManagerIsolateState state = getIsolateState(isolateId);
- state.m_executingPlayerCode = false;
- FaultEvent e = state.m_faultEventDuringPlayerCodeExecution;
- state.m_faultEventDuringPlayerCodeExecution = null;
- return e;
- }
-
- /**
- * When we've just received any FaultEvent from the player, this
function
- * gets called. If a getter/setter is currently executing, we'll save
the
- * fault for someone to get later by calling endGetterSetter().
Otherwise,
- * normal code execution is taking place, so we'll add the event to the
- * event queue.
- */
- private void handleFaultEvent(FaultEvent faultEvent) {
- DManagerIsolateState isolateState =
getIsolateState(faultEvent.isolateId);
- boolean executingPlayerCode =
isolateState.m_executingPlayerCode;
- if (executingPlayerCode) {
- FaultEvent faultEventDuringPlayerCodeExecution =
isolateState.m_faultEventDuringPlayerCodeExecution;
-
- if (faultEventDuringPlayerCodeExecution == null) //
only save the
-
// first fault
- {
- // save the event away so that when someone
later calls
- // endGetterSetter(), we can return the fault
that
- // occurred
-
isolateState.m_faultEventDuringPlayerCodeExecution = faultEvent;
- }
- } else {
- // regular code is running; so post the event to the
- // event queue which the client debugger will see
- addEvent(faultEvent);
- }
- }
-
- /*
- * (non-Javadoc)
- *
- * @see
flash.tools.debugger.SourceLocator#locateSource(java.lang.String,
- * java.lang.String, java.lang.String)
- */
- public InputStream locateSource(String path, String pkg, String name) {
- if (m_sourceLocator != null)
- return m_sourceLocator.locateSource(path, pkg, name);
-
- return null;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see flash.tools.debugger.SourceLocator#getChangeCount()
- */
- public int getChangeCount() {
- if (m_sourceLocator != null)
- return m_sourceLocator.getChangeCount();
-
- return 0;
- }
-
- /**
- * Returns the value of a Flash Player option that was requested by
- * OutGetOption and returned by InOption.
- *
- * @param optionName
- * the name of the option
- * @return its value, or null
- */
- public String getOption(String optionName) {
- return m_options.get(optionName);
- }
-}