Ejemplo n.º 1
0
        public static Expr ctor(ICall call)
        {
            // Value-type ctors can be called as ctors or as methods. Handle both types
            if (call.Obj == null)
            {
                // Called as ctor
                return(call.Arg(0));
            }
            else
            {
                // Called as method
                ExprVar var;
                // Pointers need de-referencing
                switch (call.Obj.ExprType)
                {
                case Expr.NodeType.VariableAddress:
                    var = (ExprVar)((ExprVariableAddress)call.Obj).Variable;
                    break;

                case Expr.NodeType.ArgAddress:
                    var = (ExprVar)((ExprArgAddress)call.Obj).Arg;
                    break;

                default:
                    var = (ExprVar)call.Obj;
                    break;
                }
                return(new ExprAssignment(call.Ctx, var, call.Arg(0)));
            }
        }
Ejemplo n.º 2
0
        public static Expr Insert(ICall call)
        {
            var ctx   = call.Ctx;
            var array = GetNamedArrayField(call);
            var index = call.Arg(0, "index");
            var value = call.Arg(1, "value");

            return(new ExprJsExplicit(ctx, "array.splice(index, 0, value)", ctx.Void, array, index, value));
        }
Ejemplo n.º 3
0
        public static Expr set_Item(ICall call)
        {
            var ctx     = call.Ctx;
            var genType = call.CallMethod.DeclaringType.GetGenericArgument(0);
            var array   = GetNamedArrayField(call);
            var index   = call.Arg(0, "index");
            var value   = call.Arg(1, "value");

            return(new ExprJsExplicit(ctx, "array[index] = value", genType, array, index, value));
        }
Ejemplo n.º 4
0
        public static Expr Join(ICall call)
        {
            var ctx       = call.Ctx;
            var separator = call.Arg(0, "separator");
            var values    = call.Arg(1);
            var sepExpr   = new ExprJsExplicit(ctx, "separator || \"\"", ctx.String, separator);
            var expr      = new ExprJsResolvedMethod(ctx, ctx.String, values, "join", sepExpr);

            return(expr);
        }
Ejemplo n.º 5
0
        public static Expr InternalReplaceString(ICall call)
        {
            var ctx  = call.Ctx;
            var args = new[] {
                call.Arg(1),
                new ExprJsResolvedMethod(ctx, ctx.String, call.Arg(2), "replace", ctx.Literal("$"), ctx.Literal("$$$$"))
            };

            return(new ExprJsResolvedMethod(ctx, ctx.String, call.Arg(0), "replace", args));
        }
Ejemplo n.º 6
0
        public static Expr SortArrayComparer(ICall call)
        {
            var ctx          = call.Ctx;
            var genType      = call.CallMethod.GetGenericArgument(0);
            var array        = call.Arg(0, "array");
            var comparer     = call.Arg(1);
            var comparerType = call.CallMethod.Parameters.ElementAt(1).ParameterType.FullResolve(call.CallMethod);
            var mCompare     = comparerType.EnumResolvedMethods().First(x => x.Name == "Compare");
            var a            = ctx.Local(genType, "a");
            var b            = ctx.Local(genType, "b");
            var comparerCall = new ExprCall(ctx, mCompare, comparer, new[] { a.Expr, b.Expr }, true).Named("comparerCall");
            var js           = "array.sort(function(a, b) { return comparerCall; })";

            return(new ExprJsExplicit(ctx, js, ctx.Void, array, comparerCall, a, b));
        }
Ejemplo n.º 7
0
        public static Expr Abs(ICall call)
        {
            var ctx = call.Ctx;
            var arg = call.Arg(0);

            return(new ExprJsResolvedMethod(ctx, arg.Type, null, "Math.abs", arg));
        }
Ejemplo n.º 8
0
        public static Expr ParseInt32(ICall call)
        {
            var ctx    = call.Ctx;
            var number = call.Arg(0, "number");

            return(new ExprJsExplicit(ctx, "(+number)", ctx.Int32, number));
        }
Ejemplo n.º 9
0
        public static Expr Add(ICall call)
        {
            var ctx   = call.Ctx;
            var array = GetNamedArrayField(call);
            var value = call.Arg(0, "value");

            return(new ExprJsExplicit(ctx, "array.push(value)", ctx.Void, array, value));
        }
Ejemplo n.º 10
0
        public static Expr RemoveAt(ICall call)
        {
            var ctx   = call.Ctx;
            var array = GetNamedArrayField(call);
            var index = call.Arg(0, "index");

            return(new ExprJsExplicit(ctx, "array.splice(index, 1)", ctx.Void, array, index));
        }
Ejemplo n.º 11
0
        public static Expr Min(ICall call)
        {
            var ctx  = call.Ctx;
            var arg0 = call.Arg(0);
            var arg1 = call.Arg(1);

            if (arg0.Type.IsInt64())
            {
                return(new ExprCall(ctx, (Func <Int64, Int64, Int64>)_Int64.Min, null, arg0, arg1));
            }
            else if (arg0.Type.IsUInt64())
            {
                return(new ExprCall(ctx, (Func <UInt64, UInt64, UInt64>)_UInt64.Min, null, arg0, arg1));
            }
            else
            {
                return(new ExprJsResolvedMethod(ctx, arg0.Type, null, "Math.min", arg0, arg1));
            }
        }
Ejemplo n.º 12
0
        public static Expr GetValueOrDefaultParam(ICall call)
        {
            var ctx      = call.Ctx;
            var @default = call.Arg(0, "default");
            var objIsVar = call.Obj.IsVar();
            var temp     = objIsVar ? null : ctx.Local(call.Obj.Type);
            var js       = objIsVar ? "obj !== null ? obj : default" : "(temp = obj) !== null ? temp : default";

            return(new ExprJsExplicit(ctx, js, call.Type, temp.Named("temp"), call.Obj.Named("obj"), @default));
        }
Ejemplo n.º 13
0
        public static Expr SortComparer(ICall call)
        {
            var ctx                 = call.Ctx;
            var t                   = call.CallMethod.DeclaringType.GetGenericArgument(0);
            var tComparer           = call.CallMethod.Parameters.First().ParameterType.FullResolve(call.CallMethod);
            var mGenSort            = ((Action <T[], IComparer <T> >)Array.Sort <T>).Method.GetGenericMethodDefinition();
            var mSort               = ctx.Module.Import(mGenSort).MakeGeneric(t);
            var comparer            = call.Arg(0, "comparer");
            var mDefaultComparerNet = typeof(Comparer <T>).GetProperty("Default").GetMethod;
            var mDefaultComparer    = ctx.Module.Import(mDefaultComparerNet);
            var defaultComparerCall = new ExprCall(ctx, mDefaultComparer, null).Named("defaultComparerCall");
            var ensureComparer      = new ExprJsExplicit(ctx, "(comparer || defaultComparerCall)", tComparer, comparer, defaultComparerCall);

            return(new ExprCall(ctx, mSort, null, GetNamedArrayField(call).Expr, ensureComparer));
        }
Ejemplo n.º 14
0
        public static Expr IsPositiveInfinity(ICall call)
        {
            var ctx = call.Ctx;

            return(ctx.ExprGen.Equal(call.Arg(0), ctx.Literal(Single.PositiveInfinity)));
        }
Ejemplo n.º 15
0
 public static Expr IsPositiveInfinity(ICall call) {
     var ctx = call.Ctx;
     return ctx.ExprGen.Equal(call.Arg(0), ctx.Literal(Single.PositiveInfinity));
 }
Ejemplo n.º 16
0
        public static Expr IsNegativeInfinity(ICall call)
        {
            var ctx = call.Ctx;

            return(ctx.ExprGen.Equal(call.Arg(0), ctx.Literal(Double.NegativeInfinity)));
        }
Ejemplo n.º 17
0
 public static Expr ParseInt32(ICall call) {
     var ctx = call.Ctx;
     var number = call.Arg(0, "number");
     return new ExprJsExplicit(ctx, "(+number)", ctx.Int32, number);
 }
Ejemplo n.º 18
0
        public static Expr BinarySearchItemComparer(ICall call)
        {
            var ctx = call.Ctx;
            var t   = call.CallMethod.DeclaringType.GetGenericArgument(0);
            var mGenBinarySearch = ((Func <T[], T, IComparer <T>, int>)Array.BinarySearch <T>).Method.GetGenericMethodDefinition();
            var mBinarySearch    = ctx.Module.Import(mGenBinarySearch).MakeGeneric(t);

            return(new ExprCall(ctx, mBinarySearch, null, GetNamedArrayField(call).Expr, call.Arg(0), call.Arg(1)));
        }
Ejemplo n.º 19
0
 public static Expr Abs(ICall call) {
     var ctx = call.Ctx;
     var arg = call.Arg(0);
     return new ExprJsResolvedMethod(ctx, arg.Type, null, "Math.abs", arg);
 }
Ejemplo n.º 20
0
 public static Expr Min(ICall call) {
     var ctx = call.Ctx;
     var arg0 = call.Arg(0);
     var arg1 = call.Arg(1);
     if (arg0.Type.IsInt64()) {
         return new ExprCall(ctx, (Func<Int64, Int64, Int64>)_Int64.Min, null, arg0, arg1);
     } else if (arg0.Type.IsUInt64()) {
         return new ExprCall(ctx, (Func<UInt64, UInt64, UInt64>)_UInt64.Min, null, arg0, arg1);
     } else {
         return new ExprJsResolvedMethod(ctx, arg0.Type, null, "Math.min", arg0, arg1);
     }
 }
Ejemplo n.º 21
0
 public static NamedExpr Arg(this ICall call, int argIndex, string name)
 {
     return(call.Arg(argIndex).Named(name));
 }
Ejemplo n.º 22
0
 public static Expr IsNegativeInfinity(ICall call) {
     var ctx = call.Ctx;
     return ctx.ExprGen.Equal(call.Arg(0), ctx.Literal(Double.NegativeInfinity));
 }