Esempio n. 1
0
 public VariableData(
     string name,
     string finalName,
     string content,
     HlTypeDefinition tdef,
     VariableDataEmitFlags emFlags)
 {
     UseCount       = 0;
     DataType       = ExternalDataType.Variable;
     m_Name         = name;
     m_FinalName    = finalName;
     Size           = ( uint )(content?.Length ?? 1);
     InitContent    = content;
     TypeDefinition = tdef;
     m_EmitFlags    = emFlags;
 }
Esempio n. 2
0
 public VariableData(
     string name,
     string finalName,
     uint dataSize,
     HlTypeDefinition tdef,
     VariableDataEmitFlags emFlags,
     ExternalDataType dt = ExternalDataType.Variable)
 {
     UseCount       = 0;
     DataType       = dt;
     InitContent    = null;
     Size           = dataSize;
     m_Name         = name;
     m_FinalName    = finalName;
     TypeDefinition = tdef;
     m_EmitFlags    = emFlags;
 }
        public override ExpressionTarget ParseExpression(HlCompilation compilation, HlVarDefOperand expr)
        {
            if (expr.VariableDefinition.Modifiers.All(x => x.Type != HlTokenType.OpConstMod))
            {
                string asmVarName = expr.VariableDefinition.Name.ToString();

                if (compilation.ContainsLocalVariable(asmVarName))
                {
                    EventManager <ErrorEvent> .SendEvent(new DuplicateVarDefinitionEvent( asmVarName ));
                }

                HlTypeDefinition vdef = m_TypeSystem.GetType(
                    compilation.Root,
                    expr.VariableDefinition.TypeName.ToString()
                    );

                uint arrSize = expr.VariableDefinition.Size?.ToString().ParseUInt() ?? 1;

                if (arrSize != 1)
                {
                    vdef = new ArrayTypeDefintion(compilation.Root, vdef, arrSize);
                }

                HlExpression init = expr.Initializer.FirstOrDefault();

                if (vdef.GetSize() > 1)
                {
                    if (init is HlVarOperand vo)
                    {
                    }
                }

                compilation.CreateVariable(
                    asmVarName,
                    arrSize,
                    vdef,
                    expr.VariableDefinition.Modifiers.Any(
                        x => x.Type == HlTokenType.OpPublicMod
                        )
                                               ? VariableDataEmitFlags.Visible
                                               : VariableDataEmitFlags.None
                    );


                if (init != null)
                {
                    if (init is HlValueOperand vOp &&
                        vOp.Value.Type == HlTokenType.OpStringLiteral)
                    {
                        ExpressionTarget svar = new ExpressionTarget(
                            compilation.GetFinalName(asmVarName),
                            true,
                            vdef
                            );

                        string content = vOp.Value.ToString();

                        VariableDataEmitFlags emFlags = vdef is CStringTypeDefinition
                                                            ? VariableDataEmitFlags.CStyle
                                                            : VariableDataEmitFlags.None;

                        if (expr.VariableDefinition.Modifiers.Any(x => x.Type == HlTokenType.OpPackedMod))
                        {
                            emFlags |= VariableDataEmitFlags.Packed;
                        }

                        compilation.CreateVariable(asmVarName, content, vdef, emFlags);

                        return(new ExpressionTarget(
                                   svar.ResultAddress,
                                   true,
                                   vdef
                                   ));
                    }
                }

                ExpressionTarget dvar = new ExpressionTarget(
                    compilation.GetFinalName(asmVarName),
                    true,
                    vdef
                    );

                if (init != null)
                {
                    ExpressionTarget initVal = compilation.Parse(init, dvar);

                    ExpressionTarget initRet = initVal.CopyIfNotNull(compilation, dvar);
                    compilation.ReleaseTempVar(initVal.ResultAddress);

                    return(initRet);
                }

                return(dvar);
            }
            else
            {
                string asmVarName = expr.VariableDefinition.Name.ToString();

                if (compilation.ConstValTypes.Contains(asmVarName))
                {
                    EventManager <ErrorEvent> .SendEvent(new DuplicateConstVarDefinitionEvent( asmVarName ));
                }

                compilation.ConstValTypes.Set(
                    asmVarName,
                    new ConstantValueItem()
                {
                    Value = expr.VariableDefinition.InitializerExpression.
                            FirstOrDefault()?.
                            ToString(),
                    IsPublic = expr.VariableDefinition.Modifiers.Any(
                        x => x.Type == HlTokenType.OpPublicMod
                        ),
                    IsInternal = expr.VariableDefinition.Modifiers.Any(
                        x => x.Type == HlTokenType.OpInternalMod
                        )
                }
                    );

                return(new ExpressionTarget(
                           asmVarName,
                           true,
                           compilation.TypeSystem.GetType(
                               compilation.Root,
                               expr.VariableDefinition.TypeName.ToString()
                               )
                           ));
            }

            EventManager <ErrorEvent> .SendEvent(new DynamicVariablesNotSupportedEvent());

            return(new ExpressionTarget());
        }