private ABCFile.TraitsInfo readTrait() { var r = new ABCFile.TraitsInfo(); r.name = readU30(); r.kindAttr = readU8(); switch (r.kind) { case TraitKind.Slot: case TraitKind.Const: r.Slot.slotId = readU30(); r.Slot.typeName = readU30(); r.Slot.vindex = readU30(); if (r.Slot.vindex != 0) { r.Slot.vkind = (ASType)readU8(); } else { r.Slot.vkind = ASType.Void; } break; case TraitKind.Class: r.Class.slotId = readU30(); r.Class.classi = readU30(); break; case TraitKind.Function: r.Function.slotId = readU30(); r.Function.functioni = readU30(); break; case TraitKind.Method: case TraitKind.Getter: case TraitKind.Setter: r.Method.dispId = readU30(); r.Method.method = readU30(); break; default: throw new Exception("Unknown trait kind"); } if ((r.attr & TraitAttributes.Metadata) != 0) { r.metadata = new uint[readU30()]; for (int i = 0; i < r.metadata.Length; i++) { r.metadata[i] = readU30(); } } return(r); }
private void writeTrait(ABCFile.TraitsInfo v) { writeU30(v.name); writeU8(v.kindAttr); switch (v.kind) { case TraitKind.Slot: case TraitKind.Const: writeU30(v.Slot.slotId); writeU30(v.Slot.typeName); writeU30(v.Slot.vindex); if (v.Slot.vindex != 0) { writeU8((byte)v.Slot.vkind); } break; case TraitKind.Class: writeU30(v.Class.slotId); writeU30(v.Class.classi); break; case TraitKind.Function: writeU30(v.Function.slotId); writeU30(v.Function.functioni); break; case TraitKind.Method: case TraitKind.Getter: case TraitKind.Setter: writeU30(v.Method.dispId); writeU30(v.Method.method); break; default: throw new Exception("Unknown trait kind"); } if ((v.attr & TraitAttributes.Metadata) != 0) { writeU30((uint)v.metadata.Length); foreach (var value in v.metadata) { writeU30(value); } } }