A trait which is a slot on an object
Наследование: Trait, IHasSlotID
Пример #1
0
        /// <summary>
        /// Read in a trait, which are like object properties.
        /// </summary>
        /// <returns>A trait.</returns>
        private Trait ReadTrait()
        {
            Trait t = null;
            Multiname traitName = this.code.GetMultiname((int)this.abcdtr.ReadU30());
            int traitCode = this.abcdtr.ReadUI8();
            TraitKind kind = (TraitKind)(traitCode & 0xF);

            switch (kind)
            {
                case TraitKind.Slot:
                case TraitKind.Const:
                    SlotTrait st = new SlotTrait();
                    st.Name = traitName;
                    st.Kind = kind;

                    st.SlotID = this.abcdtr.ReadU30();
                    st.TypeName = this.code.GetMultiname((int)this.abcdtr.ReadU30());

                    uint vindex = this.abcdtr.ReadU30();

                    if (vindex != 0)
                    {
                        st.ValKind = (ConstantKind)this.abcdtr.ReadUI8();
                        switch (st.ValKind)
                        {
                            case ConstantKind.ConInt:
                                st.Val = this.code.IntConsts[vindex];
                                break;

                            case ConstantKind.ConUInt:
                                st.Val = this.code.UIntConsts[vindex];
                                break;

                            case ConstantKind.ConDouble:
                                st.Val = this.code.DoubleConsts[vindex];
                                break;

                            case ConstantKind.ConUtf8:
                                st.Val = this.code.StringConsts[vindex];
                                break;

                            case ConstantKind.ConTrue:
                            case ConstantKind.ConFalse:
                            case ConstantKind.ConNull:
                            case ConstantKind.ConUndefined:
                                break;

                            case ConstantKind.ConNamespace:
                            case ConstantKind.ConPackageNamespace:
                            case ConstantKind.ConPackageInternalNs:
                            case ConstantKind.ConProtectedNamespace:
                            case ConstantKind.ConExplicitNamespace:
                            case ConstantKind.ConStaticProtectedNs:
                            case ConstantKind.ConPrivateNs:
                                st.Val = this.code.GetNamespace((int)vindex);
                                break;

                            default:
                                throw new SWFModellerException(
                                        SWFModellerError.Internal,
                                        "Unsupported constant kind: " + st.ValKind.ToString());
                        }
                    }

                    t = st;
                    break;

                case TraitKind.Class:
                    ClassTrait ct = new ClassTrait();
                    ct.Name = traitName;
                    ct.Kind = kind;

                    ct.SlotID = this.abcdtr.ReadU30();
                    this.LateResolutions.Add(ct, (int)this.abcdtr.ReadU30()); /* We'll resolve the class ref later. */

                    t = ct;
                    break;

                case TraitKind.Function:
                    FunctionTrait ft = new FunctionTrait();
                    ft.Name = traitName;
                    ft.Kind = kind;

                    ft.SlotID = this.abcdtr.ReadU30();
                    ft.Fn = this.code.GetMethod((int)this.abcdtr.ReadU30());

                    t = ft;
                    break;

                case TraitKind.Method:
                case TraitKind.Getter:
                case TraitKind.Setter:
                default:
                    MethodTrait mt = new MethodTrait();
                    mt.Name = traitName;
                    mt.Kind = kind;

                    uint dispID = this.abcdtr.ReadU30();
                    if (dispID != 0)
                    {
                        mt.OverriddenMethod = this.code.GetMethod((int)dispID);
                    }

                    mt.Fn = this.code.GetMethod((int)this.abcdtr.ReadU30());

                    t = mt;
                    break;
            }

            return t;
        }
Пример #2
0
        private void ProcessSlot(SlotTrait slotTrait)
        {
            switch (slotTrait.ValKind)
            {
                case ConstantKind.ConInt:
                    this.intMarshal.Register((int)slotTrait.Val);
                    break;

                case ConstantKind.ConUInt:
                    this.uintMarshal.Register((uint)slotTrait.Val);
                    break;

                case ConstantKind.ConDouble:
                    this.doubleMarshal.Register((ulong)slotTrait.Val);
                    break;

                case ConstantKind.ConUtf8:
                    this.stringMarshal.Register((string)slotTrait.Val);
                    break;

                case ConstantKind.ConTrue:
                case ConstantKind.ConFalse:
                case ConstantKind.ConNull:
                case ConstantKind.ConUndefined:
                    /* We need not do anything with these universal constants. */
                    break;

                case ConstantKind.ConNamespace:
                case ConstantKind.ConPackageNamespace:
                case ConstantKind.ConPackageInternalNs:
                case ConstantKind.ConProtectedNamespace:
                case ConstantKind.ConExplicitNamespace:
                case ConstantKind.ConStaticProtectedNs:
                case ConstantKind.ConPrivateNs:
                    /*(void)*/this.NamespaceID((Namespace)slotTrait.Val);
                    break;

                default:
                    /* ISSUE 73 */
                    throw new SWFModellerException(
                            SWFModellerError.UnimplementedFeature,
                            "Unsupported slot value kind " + slotTrait.ValKind.ToString());
            }
        }