/// <summary> /// Is this a primivite value? /// If not it is an object reference. /// </summary> public static bool IsPrimitive(this Jdwp.Tag tag) { switch (tag) { case Jdwp.Tag.Array: case Jdwp.Tag.Object: case Jdwp.Tag.String: case Jdwp.Tag.Thread: case Jdwp.Tag.ThreadGroup: case Jdwp.Tag.ClassLoader: case Jdwp.Tag.ClassObject: return(false); case Jdwp.Tag.Byte: case Jdwp.Tag.Char: case Jdwp.Tag.Float: case Jdwp.Tag.Double: case Jdwp.Tag.Int: case Jdwp.Tag.Long: case Jdwp.Tag.Short: case Jdwp.Tag.Void: case Jdwp.Tag.Boolean: return(true); default: throw new ArgumentException("Unknown tag " + (int)tag); } }
/// <summary> /// Read an untagged value. /// </summary> private static void WriteValue(JdwpPacket.DataReaderWriter data, Jdwp.Tag tag, object obj) { switch (tag) { //case Jdwp.Tag.Array: //case Jdwp.Tag.Object: //case Jdwp.Tag.String: //case Jdwp.Tag.Thread: //case Jdwp.Tag.ThreadGroup: //case Jdwp.Tag.ClassLoader: //case Jdwp.Tag.ClassObject: // return new ObjectId(readerWriter); case Jdwp.Tag.Byte: data.SetByte((byte)obj); break; case Jdwp.Tag.Short: case Jdwp.Tag.Char: data.SetInt16((int)obj); break; //case Jdwp.Tag.Float: // readerWriter.GetFloat(); //? // break; //case Jdwp.Tag.Double: // return readerWriter.SetDouble(); //? case Jdwp.Tag.Int: data.SetInt((int)obj); break; case Jdwp.Tag.Long: data.SetLong((long)obj); break; case Jdwp.Tag.Boolean: data.SetBoolean((bool)obj); break; default: throw new ArgumentException("unsupported tag " + tag); } }
/// <summary> /// Read an value. /// </summary> public TaggedObjectId(JdwpPacket.DataReaderWriter readerWriter) { Tag = (Jdwp.Tag)readerWriter.GetByte(); Object = new ObjectId(readerWriter); }
/// <summary> /// Read an untagged value. /// </summary> private static object ReadUntaggedValue(JdwpPacket.DataReaderWriter readerWriter, Jdwp.Tag tag) { switch (tag) { case Jdwp.Tag.Array: case Jdwp.Tag.Object: case Jdwp.Tag.String: case Jdwp.Tag.Thread: case Jdwp.Tag.ThreadGroup: case Jdwp.Tag.ClassLoader: case Jdwp.Tag.ClassObject: return(new ObjectId(readerWriter)); case Jdwp.Tag.Byte: return(readerWriter.GetByte()); case Jdwp.Tag.Char: return((char)readerWriter.GetInt16()); case Jdwp.Tag.Float: return(readerWriter.GetFloat()); case Jdwp.Tag.Double: return(readerWriter.GetDouble()); case Jdwp.Tag.Int: return(readerWriter.GetInt()); case Jdwp.Tag.Long: return(readerWriter.GetLong()); case Jdwp.Tag.Short: return(readerWriter.GetInt16()); case Jdwp.Tag.Void: return(null); case Jdwp.Tag.Boolean: return(readerWriter.GetBoolean()); default: throw new ArgumentException("Unknown tag " + (int)tag); } }
/// <summary> /// Create from given source. /// </summary> public Value(TaggedObjectId source) { Tag = source.Tag; ValueObject = source.Object; }
/// <summary> /// Read an untagged value. /// </summary> public Value(JdwpPacket.DataReaderWriter readerWriter, Jdwp.Tag tag) { Tag = tag; ValueObject = ReadUntaggedValue(readerWriter, tag); }
/// <summary> /// Read a tagged value. /// </summary> public Value(JdwpPacket.DataReaderWriter readerWriter) { Tag = (Jdwp.Tag)readerWriter.GetByte(); ValueObject = ReadUntaggedValue(readerWriter, Tag); }
/// <summary> /// Read a tagged value. /// </summary> public Value(JdwpPacket.DataReaderWriter readerWriter) { Tag = (Jdwp.Tag) readerWriter.GetByte(); ValueObject = ReadUntaggedValue(readerWriter, Tag); }
public SlotRequest(int slot, Jdwp.Tag tag) { Slot = slot; Tag = tag; }
/// <summary> /// Default ctor /// </summary> protected DalvikValue(Value value, DalvikProcess process) { tag = value.Tag; this.value = value.IsPrimitive ? value.ValueObject : new DalvikObjectReference((ObjectId)value.ValueObject, process); }
public SlotValue(int slot, Jdwp.Tag tag, object value) { Slot = slot; Value = value; Tag = tag; }
/// <summary> /// Get all local registers for this frame. /// </summary> /// <returns></returns> public Task <List <DalvikStackFrameValue> > GetRegistersAsync(bool parametersOnly = false, Jdwp.Tag type = Jdwp.Tag.Int, params int[] indizes) { if (parametersOnly && parameters != null) { return(parameters.AsTask()); } if (!parametersOnly && registers != null && indizes.Length == 0) { return(registers.AsTask()); } return(Task.Factory.StartNew(() => { var ret = new List <DalvikStackFrameValue>(); var loc = GetDocumentLocationAsync().Await(DalvikProcess.VmTimeout); List <Register> regDefs; MethodDisassembly methodDiss = thread.Manager.Process.DisassemblyProvider.GetFromLocation(loc); registerNames = registerNames ?? new RegisterNames(methodDiss == null ? null : methodDiss.Method.Body, HasMethodParametersInLastRegisters); if (indizes.Length == 0) { if (methodDiss == null) { return ret; } var body = methodDiss.Method.Body; regDefs = (parametersOnly ? body.Registers.Where(r => registerNames.IsParameter(r)) : body.Registers) .Where(p => indizes.Length == 0 || indizes.Contains(p.Index)) .OrderBy(p => p.Index) .ToList(); } else { regDefs = indizes.Select(i => new Register(i)).ToList(); } var requests = regDefs.Select(reg => new SlotRequest(reg.Index, type)).ToList(); var regValues = Debugger.StackFrame.GetValuesAsync(thread.Id, Id, requests.ToArray()) .Await(DalvikProcess.VmTimeout); var process = thread.Manager.Process; for (int i = 0; i < regDefs.Count && i < regValues.Count; ++i) { var reg = regDefs[i]; int numRegs = methodDiss == null ? int.MaxValue : methodDiss.Method.Body.Instructions.Count; bool isParam = registerNames.IsParameter(reg); string regName = registerNames.GetName(reg); var valInfo = new VariableInfo(0, regName, null, null, numRegs, reg.Index); DalvikStackFrameValue val = new DalvikStackFrameValue(regValues[i], valInfo, isParam, process); ret.Add(val); } if (indizes.Length > 0) { return ret; } if (parametersOnly) { parameters = parameters ?? ret; } else { registers = registers ?? ret; } return ret; })); }
protected object ParsePrimitive(string value, Jdwp.Tag tag, int defaultRadix) { string parseVal = value; if (value.StartsWith("0x", StringComparison.InvariantCultureIgnoreCase)) { parseVal = value.Substring(2); defaultRadix = 16; } switch (tag) { case Jdwp.Tag.Byte: { byte val; if (byte.TryParse(parseVal, defaultRadix == 16 ? NumberStyles.HexNumber : NumberStyles.Any, CultureInfo.CurrentCulture, out val)) { return(val); } return(sbyte.Parse(parseVal, defaultRadix == 16 ? NumberStyles.HexNumber : NumberStyles.Any, CultureInfo.CurrentCulture)); } case Jdwp.Tag.Short: { short val; if (short.TryParse(parseVal, defaultRadix == 16 ? NumberStyles.HexNumber : NumberStyles.Any, CultureInfo.CurrentCulture, out val)) { return(val); } return((short)ushort.Parse(parseVal, defaultRadix == 16 ? NumberStyles.HexNumber : NumberStyles.Any, CultureInfo.CurrentCulture)); } case Jdwp.Tag.Int: { int val; if (int.TryParse(parseVal, defaultRadix == 16 ? NumberStyles.HexNumber : NumberStyles.Any, CultureInfo.CurrentCulture, out val)) { return(val); } return((int)uint.Parse(parseVal, defaultRadix == 16 ? NumberStyles.HexNumber : NumberStyles.Any, CultureInfo.CurrentCulture)); } case Jdwp.Tag.Long: { long val; if (long.TryParse(parseVal, defaultRadix == 16 ? NumberStyles.HexNumber : NumberStyles.Any, CultureInfo.CurrentCulture, out val)) { return(val); } return((long)ulong.Parse(parseVal, defaultRadix == 16 ? NumberStyles.HexNumber : NumberStyles.Any, CultureInfo.CurrentCulture)); } case Jdwp.Tag.Char: { if (value.Length == 1) { return(value[0]); } goto case Jdwp.Tag.Short; } case Jdwp.Tag.Double: { return(Convert.ToDouble(value)); } case Jdwp.Tag.Float: { return(Convert.ToSingle(value)); } case Jdwp.Tag.Boolean: { return(Convert.ToBoolean(value)); } default: throw new NotImplementedException("cannot parse to " + tag); } }