Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
                }
            }
        }