public void Disassemble(MethodBody body)
		{
			// start writing IL code
			var method = body.Method;
			var codesize = body.ComputeCodeSize();
			var maxstacksize = body.ComputeMaxStackSize();
			body.ComputeOffsets();
			
			_o.WriteLine("// Code size {0} (0x{0:x})", codesize);
			_o.WriteLine(".maxstack {0}", maxstacksize);
			if (method.DeclaringType.Module.Assembly != null && method.DeclaringType.Module.Assembly.EntryPoint == method)
				_o.WriteLine(".entrypoint");

			if (method.Body.HasVariables)
			{
				_o.Write(".locals ");
				if (body.InitLocals)
					_o.Write("init ");
				_o.WriteLine("(");
				_o.Indent();
				foreach (var v in body.Variables)
				{
					_o.Write("[" + v.Index + "] ");
					v.VariableType.WriteTo(_o);
					if (!string.IsNullOrEmpty(v.Name))
					{
						_o.Write(' ');
						_o.Write(DisassemblerHelpers.Escape(v.Name));
					}
					if (v.Index + 1 < body.Variables.Count)
						_o.Write(',');
					_o.WriteLine();
				}
				_o.Unindent();
				_o.WriteLine(")");
			}
			_o.WriteLine();

			if (body.Instructions.Count > 0)
			{
				var inst = body.Instructions[0];
				var branchTargets = GetBranchTargets(body.Instructions);
				WriteStructureBody(new IlStructure(body, codesize), branchTargets, ref inst);
			}
			else
			{
				// we ignore method without instructions (but it can have exception handlers)
				_o.WriteLine();
			}
		}