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; }
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); }
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; }