private static void WriteObjectValue(string type, int argument) { if (argument == 0) { Console.ForegroundColor = classNameColor; Console.Write(type); Console.ForegroundColor = separatorColor; Console.Write('/'); Console.ForegroundColor = nullColor; Console.Write("Null"); } else { ClassFile argCFile = Heap.GetObject(argument).ClassFile; if (argCFile.Name == "java/lang/String") { Console.ForegroundColor = stringColor; FieldReferenceValue charArr = (FieldReferenceValue)Heap.GetObject(argument).GetField("value", "[C"); if (charArr.Address == 0) { Console.ForegroundColor = classNameColor; Console.Write(Heap.GetObject(argument).ClassFile.Name); } else { Console.Write('"' + JavaHelper.ReadJavaString(argument) + '"'); } } else if (argCFile.Name == "java/lang/Class") { Console.ForegroundColor = classObjColor; Console.Write(JavaHelper.ClassObjectName(argument)); } else { Console.ForegroundColor = classNameColor; Console.Write(Heap.GetObject(argument).ClassFile.Name); } Console.ForegroundColor = separatorColor; Console.Write('/'); Console.ForegroundColor = objAddrColor; Console.Write(argument); } }
private static void WriteArgs(string descriptor, bool isStatic, int[] args) { if (WriteDebugMessages) { ConsoleColor originalColor = Console.ForegroundColor; int argIndex = 0; int i; Console.Write("("); if (!isStatic) { int callerAddr = args[0]; if (Heap.GetObject(callerAddr) is HeapArray heapArr) { WriteArrayValue(JavaHelper.ClassObjectName(heapArr.ItemTypeClassObjAddr), callerAddr); } else { ClassFile argCFile = Heap.GetObject(callerAddr).ClassFile; WriteObjectValue(argCFile.Name, callerAddr); } argIndex++; } for (i = 1; descriptor[i] != ')';) { if (!isStatic || i != 1) { Console.Write(", "); } string argumentType = JavaHelper.ReadDescriptorArg(descriptor, ref i); if (argumentType[0] == 'J' || argumentType[0] == 'D') { long argument = (args[argIndex], args[argIndex + 1]).ToLong(); WriteWideValue(argumentType[0], argument); argIndex += 2; } else { int argument = args[argIndex]; WriteValue(argumentType, argument); argIndex++; } } Console.ForegroundColor = originalColor; Console.Write(')'); } }
private static void WriteArrayValue(string itemType, int argument) { if (argument != 0) { HeapArray heapArr = Heap.GetArray(argument); string itemTypeFromArg = JavaHelper.ClassObjectName(heapArr.ItemTypeClassObjAddr); if (!JavaHelper.IsPrimitiveType(itemTypeFromArg)) { itemType = JavaHelper.ClassObjectName(heapArr.ItemTypeClassObjAddr).Replace('.', '/'); } } Console.ForegroundColor = arrayBracketColor; int i = -1; do { Console.Write('['); i++; } while (itemType[i] == '['); Console.ForegroundColor = classNameColor; if (itemType[i] == 'L') { Console.Write(itemType.Substring(i + 1, itemType.Length - i - 2)); } else { Console.Write(itemType.Substring(i)); } Console.ForegroundColor = separatorColor; Console.Write("/"); if (argument == 0) { Console.ForegroundColor = nullColor; Console.Write("Null"); } else { Console.ForegroundColor = objAddrColor; Console.Write(argument); } }