Esempio n. 1
0
        public override bool TryOptimize(CompilerTarget target, out AstExpr expr)
        {
            expr = null;

            var isConstant = true;
            var buffer = new StringBuilder(TypeId);
            buffer.Append("(");

            //Optimize arguments
            AstExpr oArg;
            foreach (var arg in Arguments.ToArray())
            {
                oArg = _GetOptimizedNode(target, arg);
                if (!ReferenceEquals(oArg, arg))
                {
                    Arguments.Remove(arg);
                    Arguments.Add(oArg);
                }

                var constValue = oArg as AstConstant;
                var constType = oArg as AstConstantTypeExpression;

                if (constValue == null && constType == null)
                {
                    isConstant = false;
                }
                else if (isConstant)
                {
                    if (constValue != null)
                    {
                        buffer.Append('"');
                        buffer.Append(
                            StringPType.Escape(
                                constValue.ToPValue(target).CallToString(target.Loader)));
                        buffer.Append('"');
                    }
                    else //if(constType != null)
                        buffer.Append(constType.TypeExpression);
                    buffer.Append(",");
                }
            }
            if (!isConstant)
                return false;

            buffer.Remove(buffer.Length - 1, 1); //remove , or (
            if (Arguments.Count != 0)
                buffer.Append(")"); //Add ) if necessary

            expr = new AstConstantTypeExpression(File, Line, Column, buffer.ToString());
            return true;
        }
Esempio n. 2
0
 private static void _extractReturnVariant(MacroContext context, string resultV,
     string retVarV)
 {
     var inv = context.Invocation;
     var intT = new AstConstantTypeExpression(inv.File, inv.Line, inv.Column,
         IntPType.Literal);
     var getRetVar =
         context.CreateGetSetMember(context.CreateCall(EntityRef.Variable.Local.Create(resultV)), PCall.Get,
                                    "Key");
     var asInt = new AstTypecast(inv.File, inv.Line, inv.Column, getRetVar, intT);
     var setRetVar = context.CreateCall(EntityRef.Variable.Local.Create(retVarV), PCall.Set, asInt);
     context.Block.Add(setRetVar);
 }
Esempio n. 3
0
 private bool _tryOptimizeConstCast(CompilerTarget target, AstConstant constSubject,
     AstConstantTypeExpression constType, out AstExpr expr)
 {
     expr = null;
     PType type;
     try
     {
         type = target.Loader.ConstructPType(constType.TypeExpression);
     }
     catch (PrexoniteException)
     {
         //ignore, cast failed. cannot be optimized
         return false;
     }
     PValue result;
     if (constSubject.ToPValue(target).TryConvertTo(target.Loader, type, out result))
         return AstConstant.TryCreateConstant(target, Position, result, out expr);
     else
         return false;
 }