You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by ah...@apache.org on 2016/04/22 21:29:40 UTC

[18/52] [abbrv] [partial] git commit: [flex-falcon] [refs/heads/feature/maven-migration-test] - move stuff to where I think Maven wants it

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/07f5a7de/debugger/src/main/java/flash/tools/debugger/concrete/DStackContext.java
----------------------------------------------------------------------
diff --git a/debugger/src/main/java/flash/tools/debugger/concrete/DStackContext.java b/debugger/src/main/java/flash/tools/debugger/concrete/DStackContext.java
new file mode 100644
index 0000000..855082e
--- /dev/null
+++ b/debugger/src/main/java/flash/tools/debugger/concrete/DStackContext.java
@@ -0,0 +1,176 @@
+/*
+ * 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.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import flash.tools.debugger.Frame;
+import flash.tools.debugger.Location;
+import flash.tools.debugger.NoResponseException;
+import flash.tools.debugger.NotConnectedException;
+import flash.tools.debugger.NotSuspendedException;
+import flash.tools.debugger.Session;
+import flash.tools.debugger.Variable;
+
+public class DStackContext implements Frame
+{
+	private DModule		m_source;
+	private String		m_functionSignature;
+	private int			m_depth;
+	private int			m_module;
+	private int			m_line;
+	private DVariable	m_this;
+	private Map<String, DVariable> m_args;
+	private Map<String, DVariable> m_locals;
+	private List<DVariable>        m_scopeChain;
+	private DLocation	m_location;
+	private int			m_swfIndex; /* index of swf that we halted within (really part of location) */
+	private int			m_offset;   /* offset within swf where we halted. (really part of location) */
+	private boolean		m_populated;
+	private DVariable	m_activationObject;
+	private int  m_isolateId;
+
+	public DStackContext(int module, int line, DModule f, long thisId /* bogus */,
+			String functionSignature, int depth, int isolateId)
+	{
+		m_source = f;
+		m_module = module;
+		m_line = line;
+		// the passed-in 'thisId' seems to always be equal to one, which does more harm than good
+		m_this = null;
+		m_functionSignature = functionSignature;
+		m_depth = depth;
+		m_args = new LinkedHashMap<String, DVariable>(); // preserves order
+		m_locals = new LinkedHashMap<String, DVariable>(); // preserves order
+		m_scopeChain = new ArrayList<DVariable>();
+		m_populated = false;
+		m_isolateId = isolateId;
+		m_location = new DLocation(m_source, line, isolateId);
+	}
+
+	/*
+	 * @see flash.tools.debugger.Frame#getLocation()
+	 */
+	public Location   getLocation()
+	{
+		return m_location;
+	}
+
+    /*
+     * @see flash.tools.debugger.Frame#getArguments(flash.tools.debugger.Session)
+     */
+    public Variable[] getArguments(Session s) throws NoResponseException, NotSuspendedException, NotConnectedException
+    {
+    	populate(s);
+    	return m_args.values().toArray( new Variable[m_args.size()] );
+    }
+
+	/*
+	 * @see flash.tools.debugger.Frame#getLocals(flash.tools.debugger.Session)
+	 */
+	public Variable[] getLocals(Session s) throws NoResponseException, NotSuspendedException, NotConnectedException
+	{
+		populate(s);
+		return m_locals.values().toArray( new Variable[m_locals.size()] );
+	}
+
+    /*
+     * @see flash.tools.debugger.Frame#getThis(flash.tools.debugger.Session)
+     */
+    public Variable getThis(Session s) throws NoResponseException, NotSuspendedException, NotConnectedException
+	{
+		populate(s);
+		return getThis();
+	}
+
+	/*
+	 * @see flash.tools.debugger.Frame#getScopeChain()
+	 */
+	public Variable[] getScopeChain(Session s) throws NoResponseException, NotSuspendedException, NotConnectedException
+	{
+		populate(s);
+		return m_scopeChain.toArray(new Variable[m_scopeChain.size()]);
+	}
+
+	/* getters */
+	public String		getCallSignature()		{ return m_functionSignature; }
+	public int			getModule()				{ return m_module; }
+	public int			getLine()				{ return m_line; }
+	public DVariable	getThis()				{ return m_this; }
+
+	/* setters */
+	void addArgument(DVariable v)				{ m_args.put(v.getName(), v); }
+	void addLocal(DVariable v)					{ m_locals.put(v.getName(), v); }
+	void addScopeChainEntry(DVariable v)		{ m_scopeChain.add(v); }
+	void removeAllArguments()					{ m_args.clear(); }
+	void removeAllLocals()						{ m_locals.clear(); m_activationObject = null; }
+	void removeAllScopeChainEntries()			{ m_scopeChain.clear(); }
+	void removeAllVariables()					{ removeAllLocals(); removeAllArguments(); removeAllScopeChainEntries(); }
+	void setDepth(int depth)					{ m_depth = depth; }
+	void setThis(DVariable v)					{ m_this = v; }
+	void setSwfIndex(int index)					{ m_swfIndex = index; }
+	void setOffset(int offset)					{ m_offset = offset; }
+	void setIsolateId(int id)					{ m_isolateId = id; }
+	void markStale()							{ m_populated = false; } // triggers a reload of variables.
+
+	/**
+	 * Removes the specified variable from the list of locals, and
+	 * remembers that the specified variable is the "activation object"
+	 * for this frame.  See bug 155031.
+	 */
+	void convertLocalToActivationObject(DVariable v)
+	{
+		m_activationObject = v;
+		m_locals.remove(v.getName());
+	}
+
+	/**
+	 * Gets the activation object for this frame, or <code>null</code>
+	 * if none.  See bug FB-2674.
+	 */
+	DVariable getActivationObject()
+	{
+		return m_activationObject;
+	}
+
+	/**
+	 * Populate ensures that we have some locals and args. That is
+	 * that we have triggered a InFrame call to the player
+	 * @throws NoResponseException
+	 * @throws NotSuspendedException
+	 * @throws NotConnectedException
+	 */
+	void populate(Session s) throws NoResponseException, NotSuspendedException, NotConnectedException
+	{
+		if (!m_populated)
+		{
+			PlayerSession ses = ((PlayerSession)s);
+			ses.requestFrame(m_depth, m_isolateId);
+			
+			m_populated = true;
+		}
+	}
+
+	public int getIsolateId() 
+	{
+		return m_isolateId;
+	}
+}

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/07f5a7de/debugger/src/main/java/flash/tools/debugger/concrete/DSuspendInfo.java
----------------------------------------------------------------------
diff --git a/debugger/src/main/java/flash/tools/debugger/concrete/DSuspendInfo.java b/debugger/src/main/java/flash/tools/debugger/concrete/DSuspendInfo.java
new file mode 100644
index 0000000..e051c21
--- /dev/null
+++ b/debugger/src/main/java/flash/tools/debugger/concrete/DSuspendInfo.java
@@ -0,0 +1,57 @@
+/*
+ * 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 flash.tools.debugger.SuspendReason;
+
+/**
+ * The suspend information object returns information about the
+ * current halted state of the Player.
+ */
+public class DSuspendInfo
+{
+	int m_reason;
+	int m_actionIndex;  // which script caused the halt
+	int m_offset;		// offset into the actions that the player has halted
+	int m_previousOffset;  // previous offset, if any, which lies on the same source line (-1 means unknown)
+	int m_nextOffset;  // next offset, if any, which lies on the same source line (-1 means unknown)
+
+	public DSuspendInfo()
+	{
+		m_reason = SuspendReason.Unknown;
+		m_actionIndex =	-1;
+		m_offset = -1;	
+		m_previousOffset = -1;
+		m_nextOffset = -1;
+	}
+
+	public DSuspendInfo(int reason, int actionIndex, int offset, int previousOffset, int nextOffset)
+	{
+		m_reason = reason;
+		m_actionIndex =	actionIndex;
+		m_offset = offset;	
+		m_previousOffset = previousOffset;
+		m_nextOffset = nextOffset;
+	}
+
+    public int getReason()			{ return m_reason; }
+	public int getActionIndex()		{ return m_actionIndex; }
+    public int getOffset()			{ return m_offset; }
+	public int getPreviousOffset()	{ return m_previousOffset; }
+	public int getNextOffset()		{ return m_nextOffset; }
+}

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/07f5a7de/debugger/src/main/java/flash/tools/debugger/concrete/DSwfInfo.java
----------------------------------------------------------------------
diff --git a/debugger/src/main/java/flash/tools/debugger/concrete/DSwfInfo.java b/debugger/src/main/java/flash/tools/debugger/concrete/DSwfInfo.java
new file mode 100644
index 0000000..226dd72
--- /dev/null
+++ b/debugger/src/main/java/flash/tools/debugger/concrete/DSwfInfo.java
@@ -0,0 +1,323 @@
+/*
+ * 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.util.Map;
+
+import flash.swf.debug.DebugModule;
+import flash.swf.debug.LineRecord;
+import flash.tools.ActionLocation;
+import flash.tools.debugger.InProgressException;
+import flash.tools.debugger.Isolate;
+import flash.tools.debugger.NoResponseException;
+import flash.tools.debugger.Session;
+import flash.tools.debugger.SourceFile;
+import flash.tools.debugger.SwfInfo;
+import flash.tools.debugger.events.FunctionMetaDataAvailableEvent;
+import flash.util.IntMap;
+
+public class DSwfInfo implements SwfInfo
+{
+	private int			m_index;
+	private long		m_id;
+	private IntMap		m_source;
+	private String		m_path;
+	private String		m_url;
+	private String		m_host;
+	private int			m_port;
+	private boolean		m_swdLoading;
+	private int			m_swfSize;
+	private int			m_swdSize;
+	private int			m_bpCount;
+	private int			m_offsetCount;
+	private int			m_scriptsExpected;
+	private int			m_minId;		// first script id in the swf
+	private int			m_maxId;		// last script id in this swf
+	private byte[]		m_swf;			// actual swf contents
+	private byte[]		m_swd;			// actual swd contents
+	private boolean		m_unloaded;		// set if the player has unloaded this swf
+	private Map<Long,Integer> m_local2Global; // local script id to global script id mapping table
+	private int			m_numRefreshes; // number of refreshes we have taken
+	private int         m_vmVersion;    // version of the vm
+
+	private boolean						m_populated;	// set if we have already tried to load swf/swd for this info
+	private LineFunctionContainer		m_container;	// used for pulling out detailed info about the swf
+
+	private final static String UNKNOWN = PlayerSessionManager.getLocalizationManager().getLocalizedTextString("unknown"); //$NON-NLS-1$
+
+	public DSwfInfo(int index, int isolateId)	
+	{	
+		// defaults values of zero
+		m_id = 0;
+		m_index = index;
+		m_source = new IntMap();
+		m_path = UNKNOWN;
+		m_url = UNKNOWN;
+		m_host = UNKNOWN;
+		m_port = 0;
+		m_swdLoading = true;
+		m_scriptsExpected = -1;  // means not yet set by anyone!
+		m_isolateId = isolateId;
+		// rest default to null, 0 or false
+	}
+
+	/** SwfInfo interface */
+	public String		getPath()												{ return m_path; }
+	public String		getUrl()												{ return m_url; }
+	public int			getSwfSize()											{ return m_swfSize; }
+	public int			getSwdSize(Session s) throws InProgressException		{ swdLoaded(s); return m_swdSize; } 
+	public boolean		isUnloaded()											{ return m_unloaded; }
+	public boolean		isProcessingComplete()									{ return isPopulated(); } 
+	public boolean		containsSource(SourceFile f)							{ return m_source.contains(f.getId()); }
+
+	/* getters */
+	public long			getId()					{ return m_id; }
+	public String		getHost()				{ return m_host; }
+	public int			getPort()				{ return m_port; }
+	public int			getSwdSize() 			{ return m_swdSize; }
+	public int			getRefreshCount()		{ return m_numRefreshes; }
+	public boolean		isSwdLoading()			{ return m_swdLoading; }
+	public boolean		isPopulated()			{ return m_populated; }
+	public byte[]		getSwf()				{ return m_swf; }
+	public byte[]		getSwd()				{ return m_swd; }
+	public int			getSourceExpectedCount()	{ return m_scriptsExpected; }
+    public int          getVmVersion()          { return m_vmVersion;  }
+
+//	public int			getBreakpointCount() throws InProgressException	{ swdLoading(); return m_bpCount; }
+//	public int			getOffsetCount() 		{ swdLoading(); return m_offsetCount; }
+	public int			getSourceCount() 	{ return m_source.size(); }
+	public int			getFirstSourceId() 	{ return m_minId; }
+	public int			getLastSourceId() 	{ return m_maxId; }
+
+    public void         setVmVersion(int vmVersion) { m_vmVersion = vmVersion;  }
+	public void			setUnloaded()			{ m_unloaded = true; }
+	public void			setSwf(byte[] swf)		{ m_swf = swf; }
+	public void			setSwd(byte[] swd)		{ m_swd = swd; }
+	public void			setPopulated()			{ m_swdLoading = false; m_populated = true; }  // no more waiting for swd, we're done
+	public void			setSourceExpectedCount(int c) { m_scriptsExpected = c; }
+
+	public void			addSource(int i, DModule m) { m_source.put(i, m); }
+
+	/**
+	 * Return the number of sources that we have
+	 */
+	public int getSourceCount(Session s) throws InProgressException	
+	{ 
+		// only if we don't have it all yet
+		// then try to force a load
+		if (!hasAllSource())
+			swdLoaded(s); 
+
+		return getSourceCount(); 
+	}
+
+	/**
+	 * Return a list of our sources
+	 */
+	public SourceFile[] getSourceList(Session s) throws InProgressException		
+	{
+		// only if we don't have it all yet
+		// then try to force a load
+		if (!hasAllSource())
+			swdLoaded(s); 
+
+		return (SourceFile[])m_source.valuesToArray( new SourceFile[m_source.size()] ); 
+	}
+
+	/**
+	 * Make sure that the player has loaded our swd.  If not
+	 * we continue InProgressException to query the player for when its complete.
+	 * At some point we give up and finally admit that
+	 * we don't have a swd associated with this swf.
+	 */
+	void swdLoaded(Session s) throws InProgressException
+	{
+		if (isSwdLoading() && !isUnloaded())
+		{
+			// make the request 
+//			System.out.println("Swdloaded " + m_isolateId);
+			try { ((PlayerSession)s).requestSwfInfo(m_index, m_isolateId); } catch(NoResponseException nre) {}
+
+			// I should now be complete
+			if (!m_swdLoading)
+				;  // done!
+			else if (getSourceExpectedCount() > -1 && m_numRefreshes > 10)
+				setPopulated();  // tried too many times, so bail big time, no swd available (only if we already have our expected count)
+			else
+				throw new InProgressException(); // still loading!!!
+		}
+	}
+
+	/**
+	 * This method returns true once we have all the scripts
+	 * that we expect to ever have.  We can get the information about
+	 * how many scripts we should get from two sources, 1) we may
+	 * get an InSwfInfo message from the player which contains
+	 * this value and 2) we may get a InNumScript message which
+	 * contains a script count.  A small caveat of course, is that
+	 * in case 1. we may also not get the a value if the swd has
+	 * not been fully processed by the player yet. 
+	 */
+	public boolean hasAllSource()
+	{
+		boolean yes = false;
+		int expect = getSourceExpectedCount();
+		int have = getSourceCount();
+
+		// if they are equal we are done, unless
+		// our expectation has not been set and have not yet loaded our swd
+		if (expect == -1 && isSwdLoading())
+			yes = false;
+		else if (expect == have)
+			yes = true;
+		else
+			yes = false;
+
+		return yes;
+	}
+
+	public void freshen(long id, String path, String url, String host, long port, boolean swdLoading, long swfSize, long swdSize, long bpCount, long offsetCount, long scriptCount, Map<Long,Integer> map, int minId, int maxId)
+	{
+		m_id = (int)id;
+		m_path = path;
+		m_url = url;
+		m_host = host;
+		m_port = (int)port;
+		m_swfSize = (int)swfSize;
+		m_swdSize = (int)swdSize;
+		m_bpCount = (int)bpCount;
+		m_offsetCount = (int)offsetCount;
+		m_local2Global = map;
+		m_minId = (swdSize > 0) ? minId : 0;
+		m_maxId = (swdSize > 0) ? maxId : 0;
+		m_swdLoading = swdLoading;
+		m_numRefreshes++;
+
+		// only touch expected count if swd already loaded
+		if (!swdLoading)
+			m_scriptsExpected = (int)scriptCount;
+	}
+
+	/**
+	 * Locate the given offset within the swf
+	 */
+	public ActionLocation locate(int offset)
+	{
+		return m_container.locationLessOrEqualTo(offset);
+	}
+
+	/**
+	 * Ask the container to locate the next line
+	 * record following the location specified in the 
+	 * location, without spilling over into the next
+	 * action list
+	 */
+	public ActionLocation locateSourceLineEnd(ActionLocation l)
+	{
+		return locateSourceLineEnd(l, -1);
+	}
+
+	public ActionLocation locateSourceLineEnd(ActionLocation l, int stopAt)
+	{
+		ActionLocation end = m_container.endOfSourceLine(l);
+		if (stopAt > -1 && end.at > stopAt)
+			end.at = stopAt;
+		return end;
+	}
+
+	/**
+	 * Use the local2global script id map that was provided by the
+	 * Player, so that we can take the local id contained in the swd
+	 * and convert it to a global one that the player has annointed
+	 * to this script.
+	 */
+	int local2Global(long id)
+	{
+		Integer g = m_local2Global.get(id);
+		if (g != null)
+			id = g.intValue();
+
+		return (int) id;
+	}
+
+	/**
+	 * Freshen the contents of this object with the given swf info
+	 * The items that we touch are all swd related, as everything else
+	 * has arrriave
+	 */
+
+	// temporary while we parse
+	DManager m_manager;
+	private int m_isolateId = Isolate.DEFAULT_ID;
+
+	/**
+	 * Extracts information out of the SWF/SWD in order to populate
+	 * function line number tables in SourceFile variabels.
+	 */
+	public void parseSwfSwd(DManager manager)
+	{
+		m_manager = manager;
+
+		// suck in the swf/swd into action lists and then walk the lists
+		// looking for LineRecords
+		m_container = new LineFunctionContainer(m_swf, m_swd);
+		m_container.combForLineRecords(this);
+
+		// we are done, sucess or no
+		setPopulated();
+
+		// log event that we have complete done
+		manager.addEvent(new FunctionMetaDataAvailableEvent());
+		m_manager = null;
+	}
+
+	/**
+	 * This is a callback function from LineFunctionContainer.combForLineRecords()
+	 * We extract what we want and then update the associated module
+	 */
+	public void processLineRecord(ActionLocation where, LineRecord r)
+	{
+		int line = r.lineno;
+		String func = (where.function == null) ? null : where.function.name;
+		DebugModule dm = r.module;
+
+		// locate the source file
+		int id = -1;
+		DModule module;
+
+		if (dm == null || where.at == -1)
+			;
+		else if ( (id = local2Global(dm.id)) < 0 )
+			;
+		else if ( (module = m_manager.getSource(id, Isolate.DEFAULT_ID)) == null )
+			;
+		else
+			module.addLineFunctionInfo(where.actions.getOffset(where.at), line, func);
+	}
+
+	/* for debugging */
+	@Override
+	public String toString() {
+		return m_path;
+	}
+
+	@Override
+	public int getIsolateId() {
+		return m_isolateId;
+	}
+}

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/07f5a7de/debugger/src/main/java/flash/tools/debugger/concrete/DValue.java
----------------------------------------------------------------------
diff --git a/debugger/src/main/java/flash/tools/debugger/concrete/DValue.java b/debugger/src/main/java/flash/tools/debugger/concrete/DValue.java
new file mode 100644
index 0000000..2652ba1
--- /dev/null
+++ b/debugger/src/main/java/flash/tools/debugger/concrete/DValue.java
@@ -0,0 +1,534 @@
+/*
+ * 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.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import flash.tools.debugger.Isolate;
+import flash.tools.debugger.NoResponseException;
+import flash.tools.debugger.NotConnectedException;
+import flash.tools.debugger.NotSuspendedException;
+import flash.tools.debugger.Session;
+import flash.tools.debugger.Value;
+import flash.tools.debugger.ValueAttribute;
+import flash.tools.debugger.Variable;
+import flash.tools.debugger.VariableType;
+import flash.tools.debugger.expression.Context;
+
+/**
+ * Implementation of an ActionScript value.
+ */
+public class DValue implements Value
+{
+	/** @see VariableType */
+	private int			m_type;
+
+	/** @see Variable#getTypeName() */
+	private String		m_typeName;
+
+	/** @see Variable#getClassName() */
+	private String		m_className;
+
+	/** @see ValueAttribute */
+	private int			m_attribs;
+
+	/** Maps "varname" (without its namespace) to a Variable */
+	private Map<String, DVariable> m_members;
+
+	/**
+	 * Either my own ID, or else my parent's ID if I am <code>__proto__</code>.
+	 */
+	long				m_nonProtoId;
+
+	/**
+	 * <code>m_value</code> can have one of several possible meanings:
+	 *
+	 * <ul>
+	 * <li> If this variable's value is an <code>Object</code> or a <code>MovieClip</code>,
+	 *      then <code>m_value</code> contains the ID of the <code>Object</code> or
+	 *      <code>MovieClip</code>, stored as a <code>Long</code>. </li>
+	 * <li> If this variable refers to a Getter which has not yet been invoked, then
+	 *      <code>m_value</code> contains the ID of the Getter, stored as a
+	 *      <code>Long</code>. </li>
+	 * <li> If this variable's value is <code>undefined</code>, then <code>m_value</code>
+	 *      will be equal to <code>Value.UNDEFINED</code>.
+	 * <li> Otherwise, this variable's value is a simple type such as <code>int</code> or
+	 *      <code>String</code>, in which case <code>m_value</code> holds the actual value.
+	 * </ul>
+	 */
+	private Object		m_value;
+
+	/**
+	 * The list of classes that contributed members to this object, from
+	 * the class itself all the way down to Object.
+	 */
+	private String[] m_classHierarchy;
+
+	/**
+	 * How many members of <code>m_classHierarchy</code> actually contributed
+	 * members to this object.
+	 */
+	private int m_levelsWithMembers;
+
+	private Session m_session;
+	
+	/** Maps duplicate private "varname" to a list of Variable objects */
+	private Map<String, List<DVariable>> m_inheritedPrivates;
+	
+	private int m_isolateId;
+
+
+	/**
+	 * Create a top-level variable which has no parent.  This may be used for
+	 * _global, _root, stack frames, etc.
+	 *
+	 * @param id the ID of the variable
+	 */
+	public DValue(long id, int isolateId)
+	{
+		init(VariableType.UNKNOWN, null, null, 0, new Long(id));
+		setIsolateId(isolateId);
+	}
+
+	/**
+	 * Create a value.
+	 *
+	 * @param type see <code>VariableType</code>
+	 * @param typeName
+	 * @param className
+	 * @param attribs
+	 *            the attributes of this value; see <code>ValueAttribute</code>
+	 * @param value
+	 *            for an Object or MovieClip, this should be a Long which contains the
+	 *            ID of this variable.  For a variable of any other type, such as integer
+	 *            or string, this should be the value of the variable.
+	 * @param isolateId
+	 * 			  the worker to which this value belongs
+	 */
+	public DValue(int type, String typeName, String className, int attribs, Object value, int isolateId)
+	{
+		init(type, typeName, className, attribs, value);
+		setIsolateId(isolateId);
+	}
+
+	/**
+	 * Constructs a DValue for a primitive value (null, undefined, Boolean, Number, String).
+	 * 
+	 * There is nothing special about these objects -- it would be just as legitimate for
+	 * anyone who wants a Value for a primitive to make their own subclass of Value.
+	 */
+	public static DValue forPrimitive(Object primitiveValue, int isolateId)
+	{
+		if (primitiveValue == null)
+			return new DValue(VariableType.NULL, "null", "", 0, primitiveValue, isolateId); //$NON-NLS-1$ //$NON-NLS-2$
+		else if (primitiveValue == Value.UNDEFINED)
+			return new DValue(VariableType.UNDEFINED, "undefined", "", 0, primitiveValue, isolateId); //$NON-NLS-1$ //$NON-NLS-2$
+		else if (primitiveValue instanceof Boolean)
+			return new DValue(VariableType.BOOLEAN, "Boolean", "", 0, primitiveValue, isolateId); //$NON-NLS-1$ //$NON-NLS-2$
+		else if (primitiveValue instanceof Double)
+			return new DValue(VariableType.NUMBER, "Number", "", 0, primitiveValue, isolateId); //$NON-NLS-1$ //$NON-NLS-2$
+		else if (primitiveValue instanceof String)
+			return new DValue(VariableType.STRING, "String", "", 0, primitiveValue, isolateId); //$NON-NLS-1$ //$NON-NLS-2$
+		assert false;
+		return null;
+	}
+
+	/**
+	 * Initialize a variable.
+	 *
+	 * For the meanings of the arguments, see the DVariable constructor.
+	 */
+	private void init(int type, String typeName, String className, int attribs, Object value)
+	{
+		if (value == null && type == VariableType.UNDEFINED)
+			value = Value.UNDEFINED;
+
+		m_type = type;
+		m_typeName = typeName;
+		m_className = className;
+		m_attribs = attribs;
+		m_value = value;
+		m_members = null;
+		m_inheritedPrivates = null;
+		m_nonProtoId = getId();
+		m_isolateId = Isolate.DEFAULT_ID;
+	}
+	
+	public int getIsolateId() {
+		return m_isolateId;
+	}
+	
+	public void setIsolateId(int isolateid) {
+		m_isolateId = isolateid;
+	}
+
+	/*
+	 * @see flash.tools.debugger.Value#getAttributes()
+	 */
+	public int getAttributes()
+	{
+		return m_attribs;
+	}
+
+	/*
+	 * @see flash.tools.debugger.Value#getClassName()
+	 */
+	public String getClassName()
+	{
+		return m_className;
+	}
+
+	/*
+	 * @see flash.tools.debugger.Value#getId()
+	 */
+	public long getId()
+	{
+		// see if we support an id concept
+		if (m_value instanceof Long)
+			return ((Long)m_value).longValue();
+		else
+			return Value.UNKNOWN_ID;
+	}
+
+	/*
+	 * @see flash.tools.debugger.Value#getMemberCount(flash.tools.debugger.Session)
+	 */
+	public int getMemberCount(Session s) throws NotSuspendedException,
+			NoResponseException, NotConnectedException
+	{
+		obtainMembers(s);
+		return (m_members == null) ? 0 : m_members.size();
+	}
+
+	/*
+	 * @see flash.tools.debugger.Value#getMemberNamed(flash.tools.debugger.Session, java.lang.String)
+	 */
+	public Variable getMemberNamed(Session s, String name)
+			throws NotSuspendedException, NoResponseException,
+			NotConnectedException
+	{
+		obtainMembers(s);
+		return findMember(name);
+	}
+
+	/*
+	 * @see flash.tools.debugger.Value#getClassHierarchy(boolean)
+	 */
+	public String[] getClassHierarchy(boolean allLevels) {
+		if (allLevels) {
+			return m_classHierarchy;
+		} else {
+			String[] partialClassHierarchy;
+
+			if (m_classHierarchy != null)
+			{
+				partialClassHierarchy = new String[m_levelsWithMembers];
+				System.arraycopy(m_classHierarchy, 0, partialClassHierarchy, 0, m_levelsWithMembers);
+			}
+			else
+			{
+				partialClassHierarchy = new String[0];
+			}
+			return partialClassHierarchy;
+		}
+	}
+
+	/* TODO should this really be public? */
+	public DVariable findMember(String named)
+	{
+		if (m_members == null)
+			return null;
+		else
+			return m_members.get(named);
+	}
+
+	/*
+	 * @see flash.tools.debugger.Value#getMembers(flash.tools.debugger.Session)
+	 */
+	public Variable[] getMembers(Session s) throws NotSuspendedException,
+			NoResponseException, NotConnectedException
+	{
+		obtainMembers(s);
+
+		/* find out the size of the array */
+		int count = getMemberCount(s);
+		DVariable[] ar = new DVariable[count];
+
+		if (count > 0)
+		{
+			count = 0;
+			Iterator<DVariable> itr = m_members.values().iterator();
+			while(itr.hasNext())
+			{
+				DVariable  sf = itr.next();
+				ar[count++] = sf;
+			}
+
+			// sort the member list by name
+			Arrays.sort(ar);
+		}
+
+		return ar;
+	}
+
+	/**
+	 * WARNING: this call will initiate a call to the session to obtain the members
+	 * the first time around.
+	 * @throws NotConnectedException
+	 * @throws NoResponseException
+	 * @throws NotSuspendedException
+	 */
+	private void obtainMembers(Session s) throws NotSuspendedException, NoResponseException, NotConnectedException
+	{
+		if (s == null)
+			s = m_session;
+		else
+			m_session = s;
+
+		if (m_members == null && s != null)
+		{
+			// performing a get on this variable obtains all its members
+			long id = getId();
+			if (id != Value.UNKNOWN_ID)
+			{
+				if (((PlayerSession)s).getRawValue(id, m_isolateId) == this)
+					((PlayerSession)s).obtainMembers(id, m_isolateId);
+				if (m_members != null)
+				{
+					Iterator<DVariable> iter = m_members.values().iterator();
+					while (iter.hasNext())
+					{
+						Object next = iter.next();
+						if (next instanceof DVariable)
+						{
+							((DVariable)next).setSession(s);
+						}
+					}
+				}
+			}
+		}
+	}
+
+	public boolean membersObtained()
+	{
+		return (getId() == UNKNOWN_ID || m_members != null);
+	}
+
+	public void setMembersObtained(boolean obtained)
+	{
+		if (obtained)
+		{
+			if (m_members == null)
+				m_members = Collections.emptyMap();
+			if (m_inheritedPrivates == null)
+				m_inheritedPrivates = Collections.emptyMap();
+		}
+		else
+		{
+			m_members = null;
+			m_inheritedPrivates = null;
+		}
+	}
+
+	public void addMember(DVariable v)
+	{
+		if (m_members == null)
+			m_members = new HashMap<String, DVariable>();
+
+		// if we are a proto member house away our original parent id
+		String name = v.getName();
+		DValue val = (DValue) v.getValue();
+		val.m_nonProtoId = (name != null && name.equals("__proto__")) ? m_nonProtoId : val.getId(); //$NON-NLS-1$ // TODO is this right?
+		v.m_nonProtoParentId = m_nonProtoId;
+
+		m_members.put(name, v);
+	}
+	
+	public void addInheritedPrivateMember(DVariable v)
+	{
+		if (m_inheritedPrivates == null)
+			m_inheritedPrivates = new HashMap<String, List<DVariable>>();
+
+		// if we are a proto member house away our original parent id
+		String name = v.getName();
+		DValue val = (DValue) v.getValue();
+		val.m_nonProtoId = (name != null && name.equals("__proto__")) ? m_nonProtoId : val.getId(); //$NON-NLS-1$ // TODO is this right?
+		v.m_nonProtoParentId = m_nonProtoId;
+		List<DVariable> resultList = m_inheritedPrivates.get(name);
+		if (resultList == null) {
+			resultList = new ArrayList<DVariable>();
+			resultList.add(v);
+			m_inheritedPrivates.put(name, resultList);
+		}
+		else
+			resultList.add(v);
+		//m_inheritedPrivates.put(name, v);
+	}
+
+	public void removeAllMembers()
+	{
+		m_members = null;
+		m_inheritedPrivates = null;
+	}
+
+	/*
+	 * @see flash.tools.debugger.Value#getType()
+	 */
+	public int getType()
+	{
+		return m_type;
+	}
+
+	/*
+	 * @see flash.tools.debugger.Value#getTypeName()
+	 */
+	public String getTypeName()
+	{
+		return m_typeName;
+	}
+
+	/*
+	 * @see flash.tools.debugger.Value#getValueAsObject()
+	 */
+	public Object getValueAsObject()
+	{
+		return m_value;
+	}
+
+	/*
+	 * @see flash.tools.debugger.Value#getValueAsString()
+	 */
+	public String getValueAsString()
+	{
+		return getValueAsString(m_value);
+	}
+
+	/**
+	 * @param value an object which might be one of these types:
+	 * Boolean, Integer, Long, Double, String, Value.UNDEFINED (representing
+	 * the value 'undefined'); or null.
+	 */
+	public static String getValueAsString(Object value)
+	{
+		if (value == null)
+			return "null"; //$NON-NLS-1$
+
+		if (value instanceof Double)
+		{
+			// Java often formats whole numbers in ugly ways.  For example,
+			// the number 3 might be formatted as "3.0" and, even worse,
+			// the number 12345678 might be formatted as "1.2345678E7" !
+			// So, if the number has no fractional part, then we override
+			// the default display behavior.
+			double doubleValue = ((Double)value).doubleValue();
+			long longValue = (long) doubleValue;
+			if (doubleValue == longValue)
+				return Long.toString(longValue);
+		}
+
+		return value.toString();
+	}
+
+	/*
+	 * @see flash.tools.debugger.Value#isAttributeSet(int)
+	 */
+	public boolean isAttributeSet(int variableAttribute)
+	{
+		return (m_attribs & variableAttribute) != 0;
+	}
+
+	public void	setTypeName(String s)	{ m_typeName = s; }
+	public void	setClassName(String s)	{ m_className = s; }
+	public void setType(int t)			{ m_type = t; }
+	public void setValue(Object o)		{ m_value = o; }
+	public void setAttributes(int f)	{ m_attribs = f; }
+
+	public void setClassHierarchy(String[] classHierarchy, int levelsWithMembers)
+	{
+		m_classHierarchy = classHierarchy;
+		m_levelsWithMembers = levelsWithMembers;
+	}
+
+	public String membersToString()
+	{
+		StringBuilder sb = new StringBuilder();
+
+		/* find out the size of the array */
+		if (m_members == null)
+			sb.append(PlayerSessionManager.getLocalizationManager().getLocalizedTextString("empty")); //$NON-NLS-1$
+		else
+		{
+			Iterator<DVariable> itr = m_members.values().iterator();
+			while(itr.hasNext())
+			{
+				DVariable  sf = itr.next();
+				sb.append(sf);
+				sb.append(",\n"); //$NON-NLS-1$
+			}
+		}
+		return sb.toString();
+	}
+
+	public void setSession(Session s)
+	{
+		m_session = s;
+	}
+
+	/**
+	 * Necessary for expression evaluation.
+	 * @see Context#lookup(Object)
+	 */
+	@Override
+	public String toString() { return getValueAsString(); }
+
+	public Variable[] getPrivateInheritedMembers() {
+		if (m_inheritedPrivates == null)
+			return new DVariable[0];
+		
+		ArrayList<DVariable> finalList = new ArrayList<DVariable>();
+		
+		Iterator<List<DVariable>> itr = m_inheritedPrivates.values().iterator();
+		while(itr.hasNext())
+		{
+			List<DVariable>  varList = itr.next();
+			finalList.addAll(varList);
+		}
+		
+		DVariable[] ar = finalList.toArray(new DVariable[0]);
+		// sort the member list by name
+		Arrays.sort(ar);
+
+		return ar;
+	}
+	
+	public Variable[] getPrivateInheritedMemberNamed(String name) {
+		if (m_inheritedPrivates == null)
+			return new DVariable[0];
+		List<DVariable> list = m_inheritedPrivates.get(name);
+		if (list != null) {
+			return list.toArray(new Variable[0]);
+		}
+		return new DVariable[0];
+	}
+}

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/07f5a7de/debugger/src/main/java/flash/tools/debugger/concrete/DVariable.java
----------------------------------------------------------------------
diff --git a/debugger/src/main/java/flash/tools/debugger/concrete/DVariable.java b/debugger/src/main/java/flash/tools/debugger/concrete/DVariable.java
new file mode 100644
index 0000000..16d6799
--- /dev/null
+++ b/debugger/src/main/java/flash/tools/debugger/concrete/DVariable.java
@@ -0,0 +1,517 @@
+/*
+ * 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 flash.tools.debugger.NoResponseException;
+import flash.tools.debugger.NotConnectedException;
+import flash.tools.debugger.NotSuspendedException;
+import flash.tools.debugger.PlayerDebugException;
+import flash.tools.debugger.Session;
+import flash.tools.debugger.SessionManager;
+import flash.tools.debugger.Value;
+import flash.tools.debugger.Variable;
+import flash.tools.debugger.VariableAttribute;
+import flash.tools.debugger.VariableType;
+import flash.tools.debugger.events.FaultEvent;
+import flash.tools.debugger.expression.Context;
+
+public class DVariable implements Variable, Comparable
+{
+	/**
+	 * The raw name, exactly as it came back from the Player.  For example, this
+	 * might be <code>mynamespace@12345678::myvar</code>, which indicates that
+	 * the variable is in namespace "mynamespace", which has atom 12345678.
+	 */
+	private String		m_rawName;
+
+	/** Just name, without namespace */
+	private String		m_name;
+
+	/** @see Variable#getNamespace() */
+	private String		m_namespace = ""; //$NON-NLS-1$
+
+	/** @see VariableAttribute */
+	private int			m_attribs;
+
+	/**
+	 * The variable's value.
+	 */
+	protected Value		m_value;
+
+	/**
+	 * Whether we have fired the getter for this value.  Only applicable if
+	 * the VariableAttribute.HAS_GETTER attribute is set.
+	 */
+	private boolean		m_firedGetter;
+
+	/**
+	 * The class in which this member was actually defined.  For example, if class
+	 * B extends class A, and class A has member variable V, then for variable
+	 * V, the defining class is always "A", even though the parent variable might
+	 * be an instance of class B.
+	 */
+	private String		m_definingClass;
+
+	/**
+	 * The variable's "level" -- see <code>Variable.getLevel()</code>
+	 * @see Variable#getLevel()
+	 */
+	private byte		m_level;
+
+	/**
+	 * The session object that was used when creating this variable, if known.
+	 */
+	private Session		m_session;
+
+	/**
+	 * My parent's <code>m_nonProtoId</code>.  In other words, either my
+	 * parent's ID, or else my parent's parent's ID if my parent is <code>__proto__</code>.
+	 */
+	long				m_nonProtoParentId;
+	
+	/**
+	 * The worker to which this variable belongs.
+	 */
+	private int m_isolateId;
+
+	/**
+	 * Create a variable and its value.
+	 *
+	 * @param name
+	 *            the name of the variable within the context of its parent.  For example,
+	 *            when resolving member "bar" of object "foo", the name will be "bar".
+	 * @param value
+	 *            the variable's value.
+	 */
+	public DVariable(String name, DValue value, int isolateId)
+	{
+		m_rawName = name;
+		m_attribs = value.getAttributes();
+		
+		// If the name contains "::", then the name is of the form "namespace::name"
+		if (name != null)
+		{
+			/**
+			 * anirudhs - Compute namespace only for non-public variables.
+			 * This check helps us avoid cases where public variables have
+			 * dynamic keys with :: in them. See FB-26126.
+			 */
+			if (!isAttributeSet(VariableAttribute.PUBLIC_SCOPE)) 
+			{
+				int doubleColon = name.lastIndexOf("::"); //$NON-NLS-1$
+				if (doubleColon >= 0)
+				{
+					m_namespace = name.substring(0, doubleColon);
+					int at = m_namespace.indexOf('@');
+					if (at != -1)
+						m_namespace = m_namespace.substring(0, at);
+					
+					name = name.substring(doubleColon+2);
+				}
+			}
+		}
+
+		m_name = name;
+		m_nonProtoParentId = Value.UNKNOWN_ID;
+		m_value = value;
+		value.setSession(m_session);
+		m_isolateId = isolateId;
+	}
+
+	/* getters/setters */
+	public String		getName()				{ return m_name; }
+	public int			getAttributes()			{ return m_attribs; }
+	public String		getNamespace()			{ return m_namespace; }
+	public int			getScope()				{ return m_attribs & VariableAttribute.SCOPE_MASK; }
+	public int			getLevel()				{ return m_level; }
+	public String		getDefiningClass()		{ return m_definingClass; }
+	
+	public int getIsolateId() {
+		return m_isolateId;
+	}
+	
+	public void makePublic()
+	{
+		int attributes = getAttributes();
+		attributes &= ~VariableAttribute.SCOPE_MASK;
+		attributes |= VariableAttribute.PUBLIC_SCOPE;
+		setAttributes(attributes);
+		
+		m_namespace = ""; //$NON-NLS-1$
+	}
+
+	/*
+	 * @see flash.tools.debugger.Variable#getValue()
+	 */
+	public Value getValue()
+	{
+		if (m_session != null && m_session.getPreference(SessionManager.PREF_INVOKE_GETTERS) != 0) {
+			try {
+				invokeGetter(m_session);
+			} catch (NotSuspendedException e) {
+				// fall through -- return raw value without invoking getter
+			} catch (NoResponseException e) {
+				// fall through -- return raw value without invoking getter
+			} catch (NotConnectedException e) {
+				// fall through -- return raw value without invoking getter
+			}
+		}
+
+		return m_value;
+	}
+
+	/*
+	 * @see flash.tools.debugger.Variable#hasValueChanged(flash.tools.debugger.Session)
+	 */
+	public boolean hasValueChanged(Session s)
+	{
+		boolean hasValueChanged = false;
+		if (s instanceof PlayerSession)
+		{
+			Value previousParent = ((PlayerSession)s).getPreviousValue(m_nonProtoParentId, m_isolateId);
+			if (previousParent != null)
+			{
+				try {
+					Variable previousMember = previousParent.getMemberNamed(null, getName());
+					// If the old variable had a getter but never invoked that getter,
+					// then it's too late, we don't know the old value. 
+					if (previousMember instanceof DVariable && !previousMember.needsToInvokeGetter())
+					{
+						Value previousValue = ((DVariable)previousMember).m_value;
+						if (previousValue != null)
+						{
+							String previousValueAsString = previousValue.getValueAsString();
+							if (previousValueAsString != null)
+							{
+								if (!previousValueAsString.equals(getValue().getValueAsString()))
+								{
+									hasValueChanged = true;
+								}
+							}
+						}
+					}
+				} catch (PlayerDebugException e) {
+					// ignore
+				}
+			}
+		}
+		return hasValueChanged;
+	}
+
+	/*
+	 * @see flash.tools.debugger.Session#setScalarMember(int, java.lang.String, int, java.lang.String)
+	 */
+	public FaultEvent setValue(Session s, int type, String value) throws NotSuspendedException, NoResponseException, NotConnectedException
+	{
+		return ((PlayerSession)s).setScalarMember(m_nonProtoParentId, m_rawName, type, value, m_isolateId);
+	}
+
+	/*
+	 * @see flash.tools.debugger.Variable#isAttributeSet(int)
+	 */
+	public boolean isAttributeSet(int att)
+	{
+		if ((att & VariableAttribute.SCOPE_MASK) == att)
+			return (getScope() == att);
+		else
+			return ( ( (getAttributes() & att) == att) ? true : false );
+	}
+
+	public void clearAttribute(int att)
+	{
+		if ((att & VariableAttribute.SCOPE_MASK) == att)
+			m_attribs = (m_attribs & ~VariableAttribute.SCOPE_MASK) | VariableAttribute.PUBLIC_SCOPE;
+		else
+			m_attribs &= ~att;
+	}
+
+	public void setAttribute(int att)
+	{
+		if ((att & VariableAttribute.SCOPE_MASK) == att)
+			m_attribs = (m_attribs & ~VariableAttribute.SCOPE_MASK) | att;
+		else
+			m_attribs |= att;
+	}
+
+	public String getRawName()
+	{
+		return m_rawName;
+	}
+
+	/*
+	 * @see flash.tools.debugger.Variable#getQualifiedName()
+	 */
+	public String getQualifiedName()
+	{
+		if (m_namespace.length() > 0)
+			return m_namespace + "::" + m_name; //$NON-NLS-1$
+		else
+			return m_name;
+	}
+
+	/**
+	 * Comparator interface for sorting Variables
+	 */
+	public int compareTo(Object o2)
+	{
+		Variable v2 = (Variable)o2;
+
+		String n1 = getName();
+		String n2 = v2.getName();
+		
+		return String.CASE_INSENSITIVE_ORDER.compare(n1, n2);
+	}
+
+	/*
+	 * @see flash.tools.debugger.Variable#needsToFireGetter()
+	 */
+	public boolean needsToInvokeGetter()
+	{
+		// If this variable has a getter, and the getter has not yet been invoked
+		return (isAttributeSet(VariableAttribute.HAS_GETTER) && m_value.getId() != Value.UNKNOWN_ID && !m_firedGetter);
+	}
+
+	/*
+	 * @see flash.tools.debugger.Value#invokeGetter(flash.tools.debugger.Session)
+	 */
+	public void invokeGetter(Session s) throws NotSuspendedException,
+			NoResponseException, NotConnectedException {
+		if (needsToInvokeGetter())
+		{
+			PlayerSession playerSession = (PlayerSession) s;
+
+			// If this Variable is stale (that is, the program has run since this Variable
+			// was created), then we can't invoke the getter.
+			if (playerSession.getRawValue(m_value.getId(), m_isolateId) == m_value)
+			{
+				// temporarily turn on "invoke getters" preference
+				int oldInvokeGetters = playerSession.getPreference(SessionManager.PREF_INVOKE_GETTERS);
+				playerSession.setPreference(SessionManager.PREF_INVOKE_GETTERS, 1);
+
+				try {
+					// fire the getter using the original object id. make sure we get something reasonable back
+					Value v = playerSession.getValue(m_nonProtoParentId, getRawName(), m_isolateId);
+					if (v != null)
+					{
+						m_value = v;
+						m_firedGetter = true;
+						if (m_value instanceof DValue)
+							((DValue)m_value).setSession(s);
+					}
+				} finally {
+					playerSession.setPreference(SessionManager.PREF_INVOKE_GETTERS, oldInvokeGetters);
+				}
+			}
+		}
+	}
+
+	public void	setName(String s)		{ m_name = s; }
+	public void setAttributes(int f)	{ m_attribs = f; ((DValue)getValue()).setAttributes(f); }
+
+	public void setSession(Session s)
+	{
+		m_session = s;
+		if (m_value instanceof DValue)
+			((DValue)m_value).setSession(s);
+	}
+
+	public void setDefiningClass(int level, String definingClass)
+	{
+		m_level = (byte) Math.min(level, 255);
+		m_definingClass = definingClass;
+	}
+
+	/**
+	 * Added so that expressions such as <code>a.b.c = e.f</code> work in the command-line interface.
+	 * @see Context#lookup(Object)
+	 */
+	@Override
+	public String toString() { return getValue().getValueAsString(); }
+
+	/**
+	 * Return the internal player string type representation for this variable.
+	 * Currently used for passing in the type to the Player when doing
+	 * a set variable command
+	 */
+	public static String typeNameFor(int type)
+	{
+		String s = "string"; //$NON-NLS-1$
+		switch(type)
+		{
+			case VariableType.NUMBER:
+				s = "number"; //$NON-NLS-1$
+				break;
+
+			case VariableType.BOOLEAN:
+				s = "boolean"; //$NON-NLS-1$
+				break;
+
+			case VariableType.STRING:
+				s = "string"; //$NON-NLS-1$
+				break;
+
+			case VariableType.OBJECT:
+				s = "object"; //$NON-NLS-1$
+				break;
+
+			case VariableType.FUNCTION:
+				s = "function"; //$NON-NLS-1$
+				break;
+
+			case VariableType.MOVIECLIP:
+				s = "movieclip"; //$NON-NLS-1$
+				break;
+
+			case VariableType.NULL:
+				s = "null"; //$NON-NLS-1$
+				break;
+
+			case VariableType.UNDEFINED:
+			case VariableType.UNKNOWN:
+			default:
+				s = "undefined"; //$NON-NLS-1$
+				break;
+		}
+		return s;
+	}
+
+	/**
+	 * These values are obtained directly from the Player.
+	 * See ScriptObject in splay.h.
+	 */
+	public static final int kNormalObjectType			= 0;
+	public static final int kXMLSocketObjectType		= 1;
+	public static final int kTextFieldObjectType		= 2;
+	public static final int kButtonObjectType			= 3;
+	public static final int kNumberObjectType			= 4;
+	public static final int kBooleanObjectType			= 5;
+	public static final int kNativeStringObject			= 6;
+	public static final int kNativeArrayObject			= 7;
+	public static final int kDateObjectType				= 8;
+	public static final int kSoundObjectType			= 9;
+	public static final int kNativeXMLDoc				= 10;
+	public static final int kNativeXMLNode				= 11;
+	public static final int kNativeCameraObject			= 12;
+	public static final int kNativeMicrophoneObject		= 13;
+	public static final int kNativeCommunicationObject	= 14;
+	public static final int kNetConnectionObjectType  	= 15;
+	public static final int kNetStreamObjectType		= 16;
+	public static final int kVideoObjectType			= 17;
+	public static final int kTextFormatObjectType		= 18;
+	public static final int kSharedObjectType			= 19;
+	public static final int kSharedObjectDataType		= 20;
+	public static final int kPrintJobObjectType			= 21;
+	public static final int kMovieClipLoaderObjectType	= 22;
+	public static final int kStyleSheetObjectType		= 23;
+	public static final int kFapPacketDummyObject		= 24;
+	public static final int kLoadVarsObject				= 25;
+	public static final int kTextSnapshotType			= 26;
+
+	public static String classNameFor(long clsType, boolean isMc)
+	{
+		String clsName;
+		switch ((int)clsType)
+		{
+			case kNormalObjectType:
+				clsName = (isMc) ? "MovieClip" : "Object"; //$NON-NLS-1$ //$NON-NLS-2$
+				break;
+			case kXMLSocketObjectType:
+				clsName = "XMLSocket"; //$NON-NLS-1$
+				break;
+			case kTextFieldObjectType:
+				clsName = "TextField"; //$NON-NLS-1$
+				break;
+			case kButtonObjectType:
+				clsName = "Button"; //$NON-NLS-1$
+				break;
+			case kNumberObjectType:
+				clsName = "Number"; //$NON-NLS-1$
+				break;
+			case kBooleanObjectType:
+				clsName = "Boolean"; //$NON-NLS-1$
+				break;
+			case kNativeStringObject:
+				clsName = "String"; //$NON-NLS-1$
+				break;
+			case kNativeArrayObject:
+				clsName = "Array"; //$NON-NLS-1$
+				break;
+			case kDateObjectType:
+				clsName = "Date"; //$NON-NLS-1$
+				break;
+			case kSoundObjectType:
+				clsName = "Sound"; //$NON-NLS-1$
+				break;
+			case kNativeXMLDoc:
+				clsName = "XML"; //$NON-NLS-1$
+				break;
+			case kNativeXMLNode:
+				clsName = "XMLNode"; //$NON-NLS-1$
+				break;
+			case kNativeCameraObject:
+				clsName = "Camera"; //$NON-NLS-1$
+				break;
+			case kNativeMicrophoneObject:
+				clsName = "Microphone"; //$NON-NLS-1$
+				break;
+			case kNativeCommunicationObject:
+				clsName = "Communication"; //$NON-NLS-1$
+				break;
+			case kNetConnectionObjectType:
+				clsName = "Connection"; //$NON-NLS-1$
+				break;
+			case kNetStreamObjectType:
+				clsName = "Stream"; //$NON-NLS-1$
+				break;
+			case kVideoObjectType:
+				clsName = "Video"; //$NON-NLS-1$
+				break;
+			case kTextFormatObjectType:
+				clsName = "TextFormat"; //$NON-NLS-1$
+				break;
+			case kSharedObjectType:
+				clsName = "SharedObject"; //$NON-NLS-1$
+				break;
+			case kSharedObjectDataType:
+				clsName = "SharedObjectData"; //$NON-NLS-1$
+				break;
+			case kPrintJobObjectType:
+				clsName = "PrintJob"; //$NON-NLS-1$
+				break;
+			case kMovieClipLoaderObjectType:
+				clsName = "MovieClipLoader"; //$NON-NLS-1$
+				break;
+			case kStyleSheetObjectType:
+				clsName = "StyleSheet"; //$NON-NLS-1$
+				break;
+			case kFapPacketDummyObject:
+				clsName = "FapPacket"; //$NON-NLS-1$
+				break;
+			case kLoadVarsObject:
+				clsName = "LoadVars"; //$NON-NLS-1$
+				break;
+			case kTextSnapshotType:
+				clsName = "TextSnapshot"; //$NON-NLS-1$
+				break;
+			default:
+				clsName = PlayerSessionManager.getLocalizationManager().getLocalizedTextString("unknown") + "<" + clsType + ">"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+				break;
+		}
+		return clsName;
+	}
+}

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/07f5a7de/debugger/src/main/java/flash/tools/debugger/concrete/DWatch.java
----------------------------------------------------------------------
diff --git a/debugger/src/main/java/flash/tools/debugger/concrete/DWatch.java b/debugger/src/main/java/flash/tools/debugger/concrete/DWatch.java
new file mode 100644
index 0000000..35b2c41
--- /dev/null
+++ b/debugger/src/main/java/flash/tools/debugger/concrete/DWatch.java
@@ -0,0 +1,50 @@
+/*
+ * 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 flash.tools.debugger.Watch;
+
+/**
+ * Holder of Watchpoint information
+ */
+public class DWatch implements Watch
+{
+	long		m_parentValueId;
+	String		m_rawMemberName; // corresponds to Variable.getRawName()
+	int			m_kind;
+	int			m_tag;
+	int m_isolateId;
+
+	public DWatch(long id, String name, int kind, int tag, int isolateId)
+	{
+		m_parentValueId = id;
+		m_rawMemberName = name;
+		m_kind = kind;
+		m_tag = tag;
+		m_isolateId = isolateId;
+	}
+
+    public long			getValueId()	{ return m_parentValueId; }
+	public String		getMemberName()	{ return m_rawMemberName; }
+    public int			getKind()		{ return m_kind; }
+    public int			getTag()		{ return m_tag; }
+    
+    public int getIsolateId() {
+    	return m_isolateId;
+    }
+}

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/07f5a7de/debugger/src/main/java/flash/tools/debugger/concrete/GetVariableFlag.java
----------------------------------------------------------------------
diff --git a/debugger/src/main/java/flash/tools/debugger/concrete/GetVariableFlag.java b/debugger/src/main/java/flash/tools/debugger/concrete/GetVariableFlag.java
new file mode 100644
index 0000000..f7604ec
--- /dev/null
+++ b/debugger/src/main/java/flash/tools/debugger/concrete/GetVariableFlag.java
@@ -0,0 +1,63 @@
+/*
+ * 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;
+
+/**
+ * Flags to the OutGetVariable and OutGetVariableWhichInvokesGetter commands
+ * which are sent from the debugger to the player.
+ * 
+ * These values must be kept in sync with 'enum OutGetVariableFlags' in
+ * the player's playerdebugger.h file.
+ *
+ * @author mmorearty
+ */
+public interface GetVariableFlag
+{
+	/**
+	 * Indicates that if the variable which is being retrieved is a
+	 * getter, then the player should invoke the getter and return
+	 * the result.  If this flag is *not* set, then the player will
+	 * simply return the address of the getter itself.
+	 */
+	public static final int INVOKE_GETTER			= 0x00000001;
+
+	/**
+	 * Indicates that if the variable which is being retrieved is a
+	 * compound object (e.g. an instance of a class, as opposed to
+	 * a string or int or something like that), then the player
+	 * should also return all of the child members of the object.
+	 */
+	public static final int ALSO_GET_CHILDREN		= 0x00000002;
+	
+	/**
+	 * Indicates that when retrieving children, we only want fields
+	 * and getters -- we are not interested in regular functions.
+	 * This is an optimization to decrease the amount of network
+	 * traffic.
+	 */
+	public static final int DONT_GET_FUNCTIONS		= 0x00000004;
+
+	/**
+	 * Indicates that when retrieving children, we also want to
+	 * know exactly which class each child was defined in.  For
+	 * example, if the variable is of class Foo which extends
+	 * class Bar, we want to know which member fields came from
+	 * Foo and which ones came from Bar.
+	 */
+	public static final int GET_CLASS_HIERARCHY		= 0x00000008;
+}

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/07f5a7de/debugger/src/main/java/flash/tools/debugger/concrete/IsolatePlayerSession.java
----------------------------------------------------------------------
diff --git a/debugger/src/main/java/flash/tools/debugger/concrete/IsolatePlayerSession.java b/debugger/src/main/java/flash/tools/debugger/concrete/IsolatePlayerSession.java
new file mode 100644
index 0000000..887b9c0
--- /dev/null
+++ b/debugger/src/main/java/flash/tools/debugger/concrete/IsolatePlayerSession.java
@@ -0,0 +1,221 @@
+/*
+ * 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 flash.tools.debugger.Frame;
+import flash.tools.debugger.IsolateController;
+import flash.tools.debugger.IsolateSession;
+import flash.tools.debugger.Location;
+import flash.tools.debugger.NoResponseException;
+import flash.tools.debugger.NotConnectedException;
+import flash.tools.debugger.NotSupportedException;
+import flash.tools.debugger.NotSuspendedException;
+import flash.tools.debugger.PlayerDebugException;
+import flash.tools.debugger.SuspendedException;
+import flash.tools.debugger.SwfInfo;
+import flash.tools.debugger.Value;
+import flash.tools.debugger.Variable;
+import flash.tools.debugger.VersionException;
+import flash.tools.debugger.Watch;
+import flash.tools.debugger.expression.PlayerFaultException;
+
+/**
+ * Concrete implementation of IsolateSession. Re-routes
+ * calls to the *worker() method equivalents.
+ * @author anirudhs
+ *
+ */
+public class IsolatePlayerSession implements IsolateSession {
+
+	private IsolateController fSession;
+	private int fIsolateId;
+	
+	public IsolatePlayerSession(int isolateId, IsolateController mainSession) {
+		fIsolateId = isolateId;
+		fSession = mainSession;
+	}
+	
+	@Override
+	public void resume() throws NotSuspendedException, NotConnectedException,
+			NoResponseException {
+		fSession.resumeWorker(fIsolateId);
+	}
+
+	@Override
+	public void suspend() throws SuspendedException, NotConnectedException,
+			NoResponseException {
+		fSession.suspendWorker(fIsolateId);
+	}
+
+	@Override
+	public boolean isSuspended() throws NotConnectedException {
+		return fSession.isWorkerSuspended(fIsolateId);
+	}
+
+	@Override
+	public int suspendReason() throws NotConnectedException {
+		return fSession.suspendReasonWorker(fIsolateId);
+	}
+
+	@Override
+	public Frame[] getFrames() throws NotConnectedException {
+		return fSession.getFramesWorker(fIsolateId);
+	}
+
+	@Override
+	public void stepInto() throws NotSuspendedException, NoResponseException,
+			NotConnectedException {
+		fSession.stepIntoWorker(fIsolateId);
+	}
+
+	@Override
+	public void stepOut() throws NotSuspendedException, NoResponseException,
+			NotConnectedException {
+		fSession.stepOutWorker(fIsolateId);
+	}
+
+	@Override
+	public void stepOver() throws NotSuspendedException, NoResponseException,
+			NotConnectedException {
+		fSession.stepOverWorker(fIsolateId);
+	}
+
+	@Override
+	public void stepContinue() throws NotSuspendedException,
+			NoResponseException, NotConnectedException {
+		fSession.stepContinueWorker(fIsolateId);
+	}
+
+	@Override
+	public SwfInfo[] getSwfs() throws NoResponseException {
+		return fSession.getSwfsWorker(fIsolateId);
+	}
+
+	@Override
+	public Location setBreakpoint(int fileId, int lineNum)
+			throws NoResponseException, NotConnectedException {
+		return fSession.setBreakpointWorker(fileId, lineNum, fIsolateId);
+	}
+
+	@Override
+	public Watch[] getWatchList() throws NoResponseException,
+			NotConnectedException {
+		return fSession.getWatchListWorker(fIsolateId);
+	}
+
+	@Override
+	public Variable[] getVariableList() throws NotSuspendedException,
+			NoResponseException, NotConnectedException, VersionException {
+		return fSession.getVariableListWorker(fIsolateId);
+	}
+
+	@Override
+	public Value getValue(long valueId) throws NotSuspendedException,
+			NoResponseException, NotConnectedException {
+		return fSession.getValueWorker(valueId, fIsolateId);
+	}
+
+	@Override
+	public Value getGlobal(String name) throws NotSuspendedException,
+			NoResponseException, NotConnectedException {
+		return fSession.getGlobalWorker(name, fIsolateId);
+	}
+
+	@Override
+	public boolean evalIs(Value value, Value type) throws PlayerDebugException,
+			PlayerFaultException {
+		return fSession.evalIsWorker(value, type, fIsolateId);
+	}
+
+	@Override
+	public boolean evalIs(Value value, String type)
+			throws PlayerDebugException, PlayerFaultException {
+		return fSession.evalIsWorker(value, type, fIsolateId);
+	}
+
+	@Override
+	public boolean evalInstanceof(Value value, Value type)
+			throws PlayerDebugException, PlayerFaultException {
+		return fSession.evalInstanceofWorker(value, type, fIsolateId);
+	}
+
+	@Override
+	public boolean evalInstanceof(Value value, String type)
+			throws PlayerDebugException, PlayerFaultException {
+		return fSession.evalInstanceofWorker(value, type, fIsolateId);
+	}
+
+	@Override
+	public boolean evalIn(Value property, Value object)
+			throws PlayerDebugException, PlayerFaultException {
+		return fSession.evalInWorker(property, object, fIsolateId);
+	}
+
+	@Override
+	public Value evalAs(Value value, Value type) throws PlayerDebugException,
+			PlayerFaultException {
+		return fSession.evalAsWorker(value, type, fIsolateId);
+	}
+
+	@Override
+	public Value callFunction(Value thisObject, String functionName,
+			Value[] args) throws PlayerDebugException {
+		return fSession.callFunctionWorker(thisObject, functionName, args, fIsolateId);
+	}
+
+	@Override
+	public Value callConstructor(String classname, Value[] args)
+			throws PlayerDebugException {
+		return fSession.callConstructorWorker(classname, args, fIsolateId);
+	}
+	
+	@Override
+	public boolean setExceptionBreakpoint(String exceptionClass) throws NoResponseException, NotConnectedException {
+		return fSession.setExceptionBreakpointWorker(exceptionClass, fIsolateId);
+	}
+
+	@Override
+	public boolean clearExceptionBreakpoint(String exceptionClass) throws NoResponseException, NotConnectedException {
+		return fSession.clearExceptionBreakpointWorker(exceptionClass, fIsolateId);
+	}
+
+	@Override
+	public void breakOnCaughtExceptions(boolean b) throws NotSupportedException, NoResponseException {
+		fSession.breakOnCaughtExceptions(b, fIsolateId);
+	}
+
+	@Override
+	public boolean supportsWatchpoints() {
+		return fSession.supportsWatchpoints(fIsolateId);
+	}
+
+	@Override
+	public boolean playerCanBreakOnAllExceptions() {
+		return fSession.playerCanBreakOnAllExceptions(fIsolateId);
+	}
+
+	@Override
+	public boolean supportsWideLineNumbers() {
+		return fSession.supportsWideLineNumbers(fIsolateId);
+	}
+
+	@Override
+	public boolean playerCanCallFunctions() {
+		return fSession.playerCanCallFunctions(fIsolateId);
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/07f5a7de/debugger/src/main/java/flash/tools/debugger/concrete/LineFunctionContainer.java
----------------------------------------------------------------------
diff --git a/debugger/src/main/java/flash/tools/debugger/concrete/LineFunctionContainer.java b/debugger/src/main/java/flash/tools/debugger/concrete/LineFunctionContainer.java
new file mode 100644
index 0000000..57d1d31
--- /dev/null
+++ b/debugger/src/main/java/flash/tools/debugger/concrete/LineFunctionContainer.java
@@ -0,0 +1,162 @@
+/*
+ * 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 flash.swf.Action;
+import flash.swf.ActionConstants;
+import flash.swf.types.ActionList;
+import flash.swf.actions.DefineFunction;
+import flash.swf.debug.LineRecord;
+import flash.tools.ActionLocation;
+import flash.swf.MovieMetaData;
+import flash.tools.SwfActionContainer;
+import flash.util.Trace;
+
+/**
+ * This class extends the SwfActionContainer.
+ * It performs a number of passes on the master
+ * action list in order to extract line/function
+ * mapping information.
+ */
+public class LineFunctionContainer extends SwfActionContainer
+{
+    public LineFunctionContainer(byte[] swf, byte[] swd)
+	{
+		super(swf, swd);
+
+		// now that we've got all the action lists
+		// nicely extracted and lined up we perform a 
+		// bit of magic which modifies the DefineFunction 
+		// records augmenting them with function names 
+		// if they have have none.
+		buildFunctionNames(getMasterList(), getHeader().version);
+	}
+
+	/**
+	 * Use the action list located in the given location
+	 * and return a new action location that corresponds
+	 * to the next line record that is encountered
+	 * after this location.  This routine does not 
+	 * span into another action list.
+	 */
+	public ActionLocation endOfSourceLine(ActionLocation l)
+	{
+		ActionLocation current = new ActionLocation(l);
+		int size = l.actions.size();
+		for(int i= l.at+1; i<size; i++)
+		{
+			// hit a line record => we done
+			Action a = l.actions.getAction(i);
+			if (a.code == ActionList.sactionLineRecord)
+				break;
+
+			// hit a function => we are done
+			if ( (a.code == ActionConstants.sactionDefineFunction) ||
+				 (a.code == ActionConstants.sactionDefineFunction2) )
+				break;
+
+			current.at = i;
+		}
+		return current;
+	}
+
+	/**
+	 * This routine is called from the DSwfInfo object
+	 * and is used to obtain LineRecord information 
+	 * from the ActionLists
+	 */
+	public void combForLineRecords(DSwfInfo info)
+	{
+		probeForLineRecords(getMasterList(), new ActionLocation(), info);
+	}
+
+	/**
+	 * This routine is called from the DSwfInfo object
+	 * and is used to obtain LineRecord information 
+	 * from the ActionLists
+	 * 
+	 * The ActionLocation record is used as a holding
+	 * container for state as we traverse the lists
+	 */
+	void probeForLineRecords(ActionList list, ActionLocation where, DSwfInfo info)
+	{
+		int size = list.size();
+		for(int i=0; i<size; i++)
+		{
+			try
+			{
+				// set our context
+				where.at = i;
+				where.actions = list;
+
+				// pull the action
+				Action a = list.getAction(i);
+
+				// then see if we need to traverse
+				if ( (a.code == ActionConstants.sactionDefineFunction) ||
+					 (a.code == ActionConstants.sactionDefineFunction2) )
+				{
+					where.function = (DefineFunction)a;
+					probeForLineRecords(((DefineFunction)a).actionList, where, info);
+					where.function = null;
+				}
+				else if (a.code == ActionList.sactionLineRecord)
+				{
+					// hit a line record, so let's do our callback
+					info.processLineRecord(where, (LineRecord)a);
+				}
+				else if (a instanceof DummyAction)
+				{
+					// our dummy container, then we drop in
+					where.className = ((DummyAction)a).getClassName();
+					probeForLineRecords(((DummyAction)a).getActionList(), where, info);
+					where.className = null;
+				}
+			}		
+			catch(Exception e)
+			{
+				// this is fairly bad and probably means that we have corrupt line
+				// records in the swd, the exception being an ArrayIndexOutOfBoundsException. 
+				// I've seen this in cases where a bad swc is built by authoring wherein a
+				// script id collision occurs and thus the offset table will contain references
+				// to line numbers that are non existent in one of the scripts.
+				// If its another type of exception...well, hopefully the trace message will
+				// help you track it down :)
+				if (Trace.error)
+				{
+					Trace.trace("Error processing ActionList at "+where.at+" at offset "+where.actions.getOffset(where.at)+" in swf "+info.getUrl()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+					e.printStackTrace();
+				}
+			}
+		}
+	}
+
+	/**
+	 * Go off and fill our DefineFunction records with function names.
+	 * @see MovieMetaData#walkActions for a discussion on how this is done.
+	 */
+	void buildFunctionNames(ActionList list, int version)
+	{
+		int size = list.size();
+		for(int i=0; i<size; i++)
+		{
+			DummyAction a = (DummyAction)list.getAction(i);
+			MovieMetaData.walkActions( a.getActionList(), version, null, a.getClassName(), null );
+		}		
+	}
+}

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/07f5a7de/debugger/src/main/java/flash/tools/debugger/concrete/NetscapePluginPlayer.java
----------------------------------------------------------------------
diff --git a/debugger/src/main/java/flash/tools/debugger/concrete/NetscapePluginPlayer.java b/debugger/src/main/java/flash/tools/debugger/concrete/NetscapePluginPlayer.java
new file mode 100644
index 0000000..757c84d
--- /dev/null
+++ b/debugger/src/main/java/flash/tools/debugger/concrete/NetscapePluginPlayer.java
@@ -0,0 +1,42 @@
+/*
+ * 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.File;
+
+/**
+ * @author mmorearty
+ */
+public class NetscapePluginPlayer extends AbstractPlayer
+{
+	/**
+	 * @param path
+	 */
+	public NetscapePluginPlayer(File browserExe, File path)
+	{
+		super(browserExe, path);
+	}
+
+	/*
+	 * @see flash.tools.debugger.Player#getType()
+	 */
+	public int getType()
+	{
+		return NETSCAPE_PLUGIN;
+	}
+}