int which = info.getActionIndex();
int until = info.getNextOffset();
if (info.getReason() == SuspendReason.Unknown)
throw new SuspendedException();
SwfInfo swf = fileInfo.getSwfs()[which];
outputAssembly(cli, (DSwfInfo)swf, at, until);
throw new AmbiguousException(getLocalizationManager().getLocalizedTextString("key27")); //$NON-NLS-1$
}
}
/**
* Check for a few error conditions, otherwise we'll write a listing!
*/
if (cli.hasMoreTokens())
{
cli.err(getLocalizationManager().getLocalizedTextString("key28")); //$NON-NLS-1$
}
else
{
SourceFile file = fileInfo.getFile(module1);
numLines = file.getLineCount();
// pressing return is ok, otherwise throw the exception
if (line1 > numLines && arg1 != null)
throw new IndexOutOfBoundsException();
/* if no arg2 then user list a single line */
if (arg2 == null)
line2 = line1;
/* adjust our range of lines to ensure we conform */
if (line1 < 1)
{
/* shrink line 1, grow line2 */
line2 += -(line1 - 1);
line1 = 1;
}
if (line2 > numLines)
line2 = numLines;
// System.out.println("1="+module1+":"+line1+",2="+module2+":"+line2+",num="+numLines+",half="+half);
/* nothing to display */
if (line1 > line2)
throw new IndexOutOfBoundsException();
/* now dump the mixed source / assembly */
// now lets find which swf this in
DSwfInfo swf = (DSwfInfo)fileInfo.swfForFile(file);
ActionLocation lStart = null;
ActionLocation lEnd = null;
if (swf == null)
{
Map<String, String> args = new HashMap<String, String>();
args.put("arg3", file.getName()); //$NON-NLS-1$
cli.err(getLocalizationManager().getLocalizedTextString("key29", args)); //$NON-NLS-1$
}
else if (functionNamed)
{
// if we name a function just dump the whole thing without source.
int offset = file.getOffsetForLine(line1);
lStart = swf.locate(offset);
if (lStart.function == null)
cli.err(getLocalizationManager().getLocalizedTextString("key30")); //$NON-NLS-1$
else
{
// create a psudeo action list from which to disasemble the function
ActionList al = new ActionList(true);
al.setActionOffset(0, lStart.function);
lStart.actions = al;
lStart.at = 0;
lEnd = new ActionLocation();
lEnd.actions = al;
lEnd.at = 0;
outputAssembly(cli, swf, lStart, lEnd);
}
}
else
{
ActionLocation lastEnd = null;
for(int i=line1; i<=line2; i++)
{
int offset = file.getOffsetForLine(i);
// locate the action list associated with this of the swf
if (offset != 0)
{
// get the starting point and try to locate a nice ending
lStart = swf.locate(offset);
lEnd = swf.locateSourceLineEnd(lStart);
// now see if we skipped some assembly between source lines
if (lastEnd != null)
{
lastEnd.at++; // point our pseudo start to the next action
// new actions list so attempt to find the end of source in the old actions list
if (lastEnd.actions != lStart.actions && lastEnd.actions.size() != lastEnd.at)
{
String atString = Integer.toHexString(lastEnd.actions.getOffset(lastEnd.at));
Map<String, String> args = new HashMap<String, String>();
args.put("arg4", atString); //$NON-NLS-1$
cli.out(getLocalizationManager().getLocalizedTextString("key31", args)); //$NON-NLS-1$
// we are missing some of the dissassembly, so back up a bit and dump it out
ActionLocation gapEnd = swf.locateSourceLineEnd(lastEnd);
outputAssembly(cli, swf, lastEnd, gapEnd);
}
else if (lastEnd.at < lStart.at)
{
// same action list but we skipped some instructions