Esempio n. 1
0
 public override void Prepare(Generator generator, TypeReference inferredType)
 {
     base.Prepare(generator, inferredType);
     if (float_)
     {
         typeReference = floatType;
     }
     else
     {
         if ((inferredType != null) && byteType.Supports(inferredType) && (value >= byte.MinValue) && (value <= byte.MaxValue))
         {
             typeReference = byteType;
         }
         else if ((inferredType != null) && floatType.Supports(inferredType))
         {
             float_        = true;
             typeReference = floatType;
             floatVal      = value;
         }
         else
         {
             typeReference = intType;
         }
     }
 }
Esempio n. 2
0
 public override void Resolve(Generator generator)
 {
     base.Resolve(generator);
     intType   = generator.Resolver.ResolveDefinitionType(this, new TypeName(new Identifier(this, "pluk.base.Int")));
     floatType = generator.Resolver.ResolveDefinitionType(this, new TypeName(new Identifier(this, "pluk.base.Float")));
     byteType  = generator.Resolver.ResolveDefinitionType(this, new TypeName(new Identifier(this, "pluk.base.Byte")));
 }
Esempio n. 3
0
 public override void Resolve(Generator generator)
 {
     base.Resolve(generator);
     parent.Resolve(generator);
     argument.Resolve(generator);
     boolType = generator.Resolver.ResolveDefinitionType(this, new TypeName(new Identifier(this, "pluk.base.Bool")));
 }
Esempio n. 4
0
 public override void Resolve(Generator generator)
 {
     base.Resolve(generator);
     if (!inferred)
     {
         Require.Unassigned(type);
         type = generator.Resolver.ResolveDefinitionType(typeName, typeName);
     }
 }
Esempio n. 5
0
        public override bool Equals(object obj)
        {
            DefinitionTypeReference dtr = obj as DefinitionTypeReference;

            if (dtr == null)
            {
                return(false);
            }
            return(dtr.TypeName.Equals(TypeName));
        }
Esempio n. 6
0
        public override void Prepare(Generator generator, TypeReference inferredType)
        {
            base.Prepare(generator, inferredType);
            TypeReference suggestion = inferredType;

            if ((suggestion != null) && (suggestion.IsFunction))
            {
                suggestion = ((FunctionTypeReference)suggestion).ReturnType;
            }
            if ((suggestion != null) && (suggestion.IsNullable))
            {
                suggestion = ((NullableTypeReference)suggestion).Parent;
            }
            if (inferred)
            {
                type = suggestion as DefinitionTypeReference;
            }
            if (type == null)
            {
                if (suggestion == null)
                {
                    throw new CompilerException(this, Resource.TypeOfExpressionUnclear);
                }
                else
                {
                    throw new CompilerException(this, string.Format(Resource.Culture,
                                                                    Resource.CanOnlyCreateNewInstanceOfClass, suggestion.TypeName.Data));
                }
            }
            else
            if (type.Definition.Modifiers.Abstract)
            {
                throw new CompilerException(this, string.Format(Resource.Culture,
                                                                Resource.CannotCreateInstanceOfAbstractClass, type.Definition.Name.Data));
            }
            constructor = type.Definition.FindConstructor(this, inferredType, generator.Resolver.CurrentDefinition);
        }
Esempio n. 7
0
 public override void Resolve(Generator generator)
 {
     base.Resolve(generator);
     literalStringType = generator.Resolver.ResolveDefinitionType(this, new TypeName(new Identifier(this, "pluk.base.StaticString")));
     stringType        = generator.Resolver.ResolveDefinitionType(this, new TypeName(new Identifier(this, "pluk.base.String")));
 }
Esempio n. 8
0
 public void Resolve(Generator generator)
 {
     intType  = generator.Resolver.ResolveDefinitionType(this, new TypeName(new Identifier(this, "pluk.base.Int")));
     voidType = generator.Resolver.ResolveType(this, new TypeName(new Identifier(this, "void")));
 }
Esempio n. 9
0
 public override void Resolve(Generator generator)
 {
     base.Resolve(generator);
     expression.Resolve(generator);
     exceptionType = generator.Resolver.ResolveDefinitionType(this, new TypeName(new Identifier(this, "pluk.base.Exception")));
 }
Esempio n. 10
0
        public override void Generate(Generator generator)
        {
            base.Generate(generator);
            if (target == null)
            {
                int slot = generator.Resolver.ResolveSlotOffset(name);
                value.Generate(generator);
                type.GenerateConversion(this, generator, value.TypeReference);
                generator.Symbols.Source(generator.Assembler.Region.CurrentLocation, this);
                generator.Resolver.WriteSlot(this, slot);
                generator.Assembler.StoreVariable(slot);
            }
            else
            {
                target.Generate(generator);

                TypeReference thisType = target.TypeReference;

                bool staticRef = thisType is StaticTypeReference;

                Definition thisDefinition;
                if (staticRef)
                {
                    thisDefinition = ((StaticTypeReference)thisType).Parent.Definition;
                }
                else
                {
                    thisDefinition = ((DefinitionTypeReference)thisType).Definition;
                }

                if (thisDefinition.HasField(name, staticRef))
                {
                    Field field = thisDefinition.GetField(name, staticRef);
                    if (!field.GetModifiers.Static)
                    {
                        generator.Assembler.PushValue();
                        int fieldOffset = thisDefinition.GetFieldOffset(this, name, generator.Resolver.CurrentDefinition, true);
                        if (target is IIncompleteSlotAssignment)
                        {
                            if (((IIncompleteSlotAssignment)target).IsIncompleteSlot())
                            {
                                generator.Resolver.AssignField(field);
                            }
                        }
                        value.Generate(generator);
                        type.GenerateConversion(value, generator, value.TypeReference);
                        generator.Symbols.Source(generator.Assembler.Region.CurrentLocation, this);
                        TypeReference slot = field.TypeReference;
                        if (slot.IsNullable)
                        {
                            slot = ((NullableTypeReference)slot).Parent;
                        }
                        DefinitionTypeReference dtr = slot as DefinitionTypeReference;
                        if ((dtr != null) && (!dtr.Definition.GarbageCollectable))
                        {
                            generator.Assembler.StoreInFieldOfSlotNoTouch(fieldOffset);
                        }
                        else
                        {
                            generator.Assembler.StoreInFieldOfSlot(generator.Toucher, fieldOffset);
                        }
                    }
                    else
                    {
                        generator.Assembler.PushValue();
                        if (target is IIncompleteSlotAssignment)
                        {
                            if (((IIncompleteSlotAssignment)target).IsIncompleteSlot())
                            {
                                generator.Resolver.AssignField(field);
                            }
                        }
                        value.Generate(generator);
                        type.GenerateConversion(value, generator, value.TypeReference);
                        generator.Symbols.Source(generator.Assembler.Region.CurrentLocation, this);
                        generator.Assembler.Store(field.StaticSlot);
                    }
                }
                else
                {
                    int propertySlot = thisDefinition.GetSetPropertyOffset(this, name, generator.Resolver.CurrentDefinition);
                    generator.Symbols.Source(generator.Assembler.Region.CurrentLocation, this);
                    generator.Assembler.FetchMethod(propertySlot);
                    generator.Assembler.PushValue();
                    value.Generate(generator);
                    type.GenerateConversion(value, generator, value.TypeReference);
                    generator.Assembler.PushValue();
                    Placeholder retSite = generator.Assembler.CallFromStack(1);
                    generator.AddCallTraceEntry(retSite, this, generator.Resolver.CurrentDefinition.Name.DataModifierLess, generator.Resolver.CurrentFieldName);
                }
            }
        }
Esempio n. 11
0
 public StaticTypeReference(ILocation location, DefinitionTypeReference parent)
     : base(location)
 {
     Require.Assigned(parent);
     this.parent = parent;
 }