/// <summary> Disassemble part of the swf to the output </summary>
        public static ActionLocation outputAssembly(DebugCLI cli, DSwfInfo swf, int start, int end)
        {
            // first we need to locate the action list associated with this
            // portion of the swf
            ActionLocation lStart = swf.locate(start);
            ActionLocation lEnd   = (end > -1)?swf.locate(end):swf.locateSourceLineEnd(lStart);

            return(outputAssembly(cli, swf, lStart, lEnd));
        }
        public static ActionLocation outputAssembly(DebugCLI cli, SwfInfo info, ActionLocation lStart, ActionLocation lEnd)
        {
            // now make sure our actions lists are the same (i.e we haven't spanned past one tag)
            if (lStart.actions != lEnd.actions)
            {
                lEnd.at = lStart.actions.size() - 1;
            }

            Disassembler.disassemble(lStart.actions, lStart.pool, lStart.at, lEnd.at, new StreamWriter(cli.Out.BaseStream, System.Text.Encoding.Default));
            return(lEnd);
        }
Example #3
0
		public static ActionLocation outputAssembly(DebugCLI cli, SwfInfo info, ActionLocation lStart, ActionLocation lEnd)
		{
			// now make sure our actions lists are the same (i.e we haven't spanned past one tag)
			if (lStart.actions != lEnd.actions)
				lEnd.at = lStart.actions.size() - 1;
			
			Disassembler.disassemble(lStart.actions, lStart.pool, lStart.at, lEnd.at, new StreamWriter(cli.Out.BaseStream, System.Text.Encoding.Default));
			return lEnd;
		}
Example #4
0
		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$
			}
		}
        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$
            }
        }