private bool TryGetStructurePiece(ASMultiname multiname, ASClass @class, out char piece) { ASMultiname returnValueType = multiname; if (@class != null) { returnValueType = GetTraitType(@class, multiname) ?? GetTraitType(@class.Instance, multiname); } switch (returnValueType.Name.ToLower()) { case "int": case "readint": case "gettimer": piece = 'i'; break; case "byte": case "readbyte": piece = 'b'; break; case "double": case "readdouble": piece = 'd'; break; case "string": case "readstring": piece = 's'; break; case "boolean": case "readboolean": piece = 'B'; break; case "array": piece = char.MinValue; break; default: { if (!IsOutgoing && !HGame.IsValidIdentifier(returnValueType.Name, true)) { piece = 'i'; // This reference call is most likely towards 'readInt' } else { piece = char.MinValue; } break; } } return(piece != char.MinValue); }
public string GenerateHash() { if (!string.IsNullOrWhiteSpace(Hash)) { return(Hash); } using (var output = new HashWriter(false)) { output.Write(IsOutgoing); if (!HGame.IsValidIdentifier(Class.QName.Name, true)) { output.Write(Class.Instance, true); output.Write(Class.Instance.Constructor); output.Write(References.Count); foreach (HReference reference in References) { output.Write(reference.IsStatic); output.Write(reference.IsAnonymous); output.Write(reference.MethodRank); output.Write(reference.InstructionRank); output.Write(reference.FromMethod); output.Write(reference.FromClass.Constructor); output.Write(reference.FromClass.Instance.Constructor); } if (!IsOutgoing && Parser != null) { output.Write(Parser.Instance, true); } } else { output.Write(Class.QName.Name); } return(Hash = output.GenerateHash()); } }