// Raw direct call to Player public static void doShowVariable(DebugCLI cli) { cli.waitTilHalted(); try { // an integer followed by a variable name Session session = cli.Session; int id = cli.nextIntToken(); String name = (cli.hasMoreTokens())?cli.nextToken():null; System.Text.StringBuilder sb = new System.Text.StringBuilder(); sb.Append(name); sb.Append(" = "); //$NON-NLS-1$ Value v = ((PlayerSession)session).getValue(id, name); ExpressionCache.appendVariableValue(sb, v); cli.output(sb.ToString()); } catch (NullReferenceException) { cli.err(LocalizationManager.getLocalizedTextString("key26")); //$NON-NLS-1$ } }
public static void doShowFuncs(DebugCLI cli) { System.Text.StringBuilder sb = new System.Text.StringBuilder(); String arg = null; FileInfoCache fileInfo = cli.FileCache; // we take an optional single arg which specifies a module try { // let's wait a bit for the background load to complete cli.waitForMetaData(); if (cli.hasMoreTokens()) { arg = cli.nextToken(); int id = arg.Equals(".")?cli.propertyGet(DebugCLI.LIST_MODULE):cli.parseFileArg(-1, arg); //$NON-NLS-1$ DModule m = (DModule)fileInfo.getFile(id); m.lineMapping(sb); } else { SourceFile[] ar = fileInfo.FileList; if (ar == null) { cli.err(LocalizationManager.getLocalizedTextString("key18")); } //$NON-NLS-1$ else { for (int i = 0; ar != null && i < ar.Length; i++) { DModule m = (DModule)ar[i]; m.lineMapping(sb); } } } cli.output(sb.ToString()); } catch (NullReferenceException) { cli.err(LocalizationManager.getLocalizedTextString("key19")); //$NON-NLS-1$ } catch (FormatException pe) { cli.err(pe.Message); } catch (AmbiguousException ae) { cli.err(ae.Message); } catch (NoMatchException nme) { cli.err(nme.Message); } catch (InProgressException) { cli.err(LocalizationManager.getLocalizedTextString("key20")); //$NON-NLS-1$ } }
public static void doDisassemble(DebugCLI cli) { /* currentXXX may NOT be invalid! */ int currentModule = cli.propertyGet(DebugCLI.LIST_MODULE); int currentLine = cli.propertyGet(DebugCLI.LIST_LINE); String arg1 = null; int module1 = currentModule; int line1 = currentLine; String arg2 = null; int line2 = currentLine; bool functionNamed = false; int numLines = 0; try { FileInfoCache fileInfo = cli.FileCache; Session session = cli.Session; if (cli.hasMoreTokens()) { arg1 = cli.nextToken(); if (arg1.Equals("-")) //$NON-NLS-1$ { // move back one line line1 = line2 = line1 - 1; } else { int[] result = cli.parseLocationArg(currentModule, currentLine, arg1); module1 = result[0]; line2 = line1 = result[1]; functionNamed = (result[2] == 0)?false:true; if (cli.hasMoreTokens()) { arg2 = cli.nextToken(); line2 = cli.parseLineArg(module1, arg2); } } } else { // since no parms test for valid location if none use players concept of where we stopped if (fileInfo.getFile(currentModule) == null) { //here we simply use the players concept of suspsend DSuspendInfo info = ((PlayerSession)session).SuspendInfo; int at = info.Offset; int which = info.ActionIndex; int until = info.NextOffset; if (info.Reason == SuspendReason.Unknown) { throw new SuspendedException(); } SwfInfo swf = fileInfo.Swfs[which]; outputAssembly(cli, (DSwfInfo)swf, at, until); throw new AmbiguousException(LocalizationManager.getLocalizedTextString("key27")); //$NON-NLS-1$ } } /* * Check for a few error conditions, otherwise we'll write a listing! */ if (cli.hasMoreTokens()) { cli.err(LocalizationManager.getLocalizedTextString("key28")); //$NON-NLS-1$ } else { SourceFile file = fileInfo.getFile(module1); numLines = file.LineCount; // pressing return is ok, otherwise throw the exception if (line1 > numLines && arg1 != null) { throw new IndexOutOfRangeException(); } /* 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 IndexOutOfRangeException(); } /* 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) { System.Collections.IDictionary args = new System.Collections.Hashtable(); args["arg3"] = file.Name; //$NON-NLS-1$ cli.err(LocalizationManager.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(LocalizationManager.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 = lastEnd.actions.getOffset(lastEnd.at).ToString("X"); System.Collections.IDictionary args = new System.Collections.Hashtable(); args["arg4"] = atString; //$NON-NLS-1$ cli.output(LocalizationManager.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 ActionLocation gapEnd = new ActionLocation(lStart); gapEnd.at--; outputAssembly(cli, swf, lastEnd, gapEnd); } } lastEnd = lEnd; } // dump source cli.outputSource(module1, i, file.getLine(i)); // obtain the offset, locate it in the swf if (offset != 0) { outputAssembly(cli, swf, lStart, lEnd); } } /* save away valid context */ cli.propertyPut(DebugCLI.LIST_MODULE, module1); cli.propertyPut(DebugCLI.LIST_LINE, line2 + 1); // add one cli.m_repeatLine = "disassemble"; /* allow repeated listing by typing CR */ //$NON-NLS-1$ } } } catch (IndexOutOfRangeException) { String name = "#" + module1; //$NON-NLS-1$ System.Collections.IDictionary args = new System.Collections.Hashtable(); args["arg5"] = Convert.ToString(line1); //$NON-NLS-1$ args["arg6"] = name; //$NON-NLS-1$ args["arg7"] = Convert.ToString(numLines); //$NON-NLS-1$ cli.err(LocalizationManager.getLocalizedTextString("key32", args)); //$NON-NLS-1$ } catch (AmbiguousException ae) { cli.err(ae.Message); } catch (NullReferenceException) { cli.err(LocalizationManager.getLocalizedTextString("key33")); //$NON-NLS-1$ } catch (FormatException pe) { cli.err(pe.Message); } catch (NoMatchException nme) { cli.err(nme.Message); } catch (SuspendedException) { cli.err(LocalizationManager.getLocalizedTextString("key34")); //$NON-NLS-1$ } }