Esempio n. 1
0
        public override void VisitDereferenceField(DereferenceField n)
        {
            _shouldLoadAddress = true;
            n.Object.Visit(this);
            _shouldLoadAddress = false;
            if (!Enum.GetNames(typeof(InternalTrancheTypes)).Contains(_lastWalkedType.Name))
            {
                // this isn't a tranche type, have to handle it separately
                if (!n.IsLeftHandSide)
                {
                    _gen.Emit(OpCodes.Call, _lastWalkedType.GetMethod("get_" + n.Field));
                }
                else
                {
                    _assignmentCallback = gen => gen.Emit(OpCodes.Stfld, _lastWalkedType.GetMethod("set_" + n.Field));
                }

                _lastWalkedType = _lastWalkedType.GetProperty(n.Field).PropertyType;
            }
            else
            {
                var info  = _typeManager.GetBuilderInfo(_lastWalkedType.Name);
                var field = info.FieldMap[n.Field];

                _lastWalkedType = field.FieldType;

                var shouldbeStatic = Enum.GetNames(typeof(InternalTrancheTypes)).Contains(field.Name) ||
                                     (field.DeclaringType != null && field.DeclaringType.Name == "Simulation");

                //either have to load the field if getting, or store it if setting
                // depends on why we're dereferencing, to read or write
                if (!n.IsLeftHandSide)
                {
                    _gen.Emit(shouldbeStatic ? OpCodes.Ldsfld : OpCodes.Ldfld, field);
                }
                else
                {
                    _assignmentCallback = gen => gen.Emit(shouldbeStatic ? OpCodes.Stsfld : OpCodes.Stfld, field);
                }
            }
        }
Esempio n. 2
0
        public override void VisitDereferenceField(DereferenceField n)
        {
            //lvalue.identifier
            var lhs = CheckSubTree(n.Object);

            if (!(lhs is TypeClass))
            {
                var members      = lhs.CilType.GetMembers();
                var thisProperty = members.FirstOrDefault(p => p.Name.Equals(n.Field, StringComparison.OrdinalIgnoreCase));

                if (thisProperty == null)
                {
                    throw new Exception(string.Format("Attribute {0} not available on type {1} (object {2})", n.Field,
                                                      lhs.CilType, n.Object));
                }

                switch (lhs.CilType.GetProperty("Days").PropertyType.Name)
                {
                case "Int32":
                    n.InternalType = _lastSeenType = new TypeInteger();
                    break;

                case "DateTime":
                    n.InternalType = _lastSeenType = new TypeDate();
                    break;

                case "String":
                    n.InternalType = _lastSeenType = new TypeString();
                    break;

                case "Double":
                    n.InternalType = _lastSeenType = new TypeReal();
                    break;

                case "Boolean":
                    n.InternalType = _lastSeenType = new TypeBoolean();
                    break;
                }
            }
        }
Esempio n. 3
0
 public virtual void VisitDereferenceField(DereferenceField n)
 {
 }
Esempio n. 4
0
 public virtual void VisitDereferenceField(DereferenceField n)
 {
 }