Example #1
0
        private bool AddInitValues(OpModule codes, Define st)
        {
            if (values.Count == 0) return false;

            var members = st.GetMemberDecls();
            if (members.Length != values.Count)
                throw Abort("initializers mismatched: " + st.Name);

            var ad = Addr32.New(Reg32.ESP);
            codes.Add(I386.PushA(ad));
            for (int i = 0; i < values.Count; i++)
            {
                VarDeclare mem = members[i];
                object obj = values[i];
                if (obj is Declare)
                {
                    Define memst = Types.GetStruct(mem.Type);
                    if (!(mem is Declare) || memst == null)
                        throw Abort("struct required: " + mem.Name);
                    (obj as Declare).AddInitValues(codes, memst);
                }
                else if (obj is NodeBase)
                {
                    if (!(mem is VarDeclare))
                        throw Abort("value required: " + mem.Name);
                    (obj as NodeBase).AddCodesV(codes, "mov", null);
                    codes.Add(I386.MovRA(Var.DestRegister, ad));
                    mem.Type.AddSetCodes(codes, Addr32.New(Var.DestRegister));
                }
                else
                    throw Abort("invalid parameter: " + mem.Name);
                codes.Add(I386.AddA(ad, Val32.NewI(mem.Type.Size)));
            }
            codes.Add(I386.AddR(Reg32.ESP, Val32.New(4)));
            return true;
        }