Esempio n. 1
0
        protected override ICode VisitJsTypeVarName(ExprJsTypeVarName e)
        {
            var name = this.resolver.TypeNames[e.TypeRef];

            this.js.Append(name);
            return(e);
        }
 protected override ICode VisitJsResolvedProperty(ExprJsResolvedProperty e) {
     if (e.Call.CallMethod != null) {
         var ctx = e.Ctx;
         var mDef = e.Call.CallMethod.Resolve();
         if (mDef.IsSetter) {
             var tRef = e.Call.CallMethod.Parameters.Last().ParameterType;
             var tDef = tRef.Resolve();
             var attr = tDef.GetCustomAttribute<JsStringEnumAttribute>();
             if (attr != null) {
                 var prop = new ExprJsResolvedProperty(ctx, new FakeCall(e.Call), e.PropertyName).Named("prop");
                 var type = new ExprJsTypeVarName(ctx, tRef).Named("type");
                 var enumStringMap = new ExprJsTypeData(ctx, TypeData.EnumStringMap).Named("enumStringMap");
                 var value = e.Call.Args.Last().Named("value");
                 var js =  "prop = type.enumStringMap[value]";
                 var expr = new ExprJsExplicit(ctx, js, e.Type, type, enumStringMap, value, prop);
                 return expr;
             }
         } else {
             var tDef = e.Type.Resolve();
             var attr = tDef.GetCustomAttribute<JsStringEnumAttribute>();
             if (attr != null) {
                 var prop = new ExprJsResolvedProperty(ctx, new FakeCall(e.Call), e.PropertyName).Named("prop");
                 var type = new ExprJsTypeVarName(ctx, e.Type).Named("type");
                 var enumStringMap = new ExprJsTypeData(ctx, TypeData.EnumStringMap).Named("enumStringMap");
                 var js = "type.enumStringMap[prop]";
                 var expr = new ExprJsExplicit(ctx, js, e.Type, prop, type, enumStringMap);
                 return expr;
             }
         }
     }
     return base.VisitJsResolvedProperty(e);
 }
        protected override ICode VisitBox(ExprBox e)
        {
            var ctx  = e.Ctx;
            var expr = (Expr)this.Visit(e.Expr);

            if (e.Type.IsUnsignedInteger() && expr.Type.IsSignedInteger())
            {
                expr = new ExprConv(ctx, expr, e.Type, false);
            }
            if (!e.Type.IsValueType)
            {
                // For ref-types 'box' does nothing
                return(this.Visit(e.Expr));
            }
            var eType = new ExprJsTypeVarName(ctx, e.Type);

            if (e.Type.IsNullable())
            {
                var exprIsVar    = expr.IsVar();
                var innerType    = e.Type.GetNullableInnerType();
                var temp         = exprIsVar ? null : new ExprVarLocal(ctx, e.Type);
                var box          = new ExprBox(ctx, temp ?? expr, innerType).Named("box");
                var nullableJs   = exprIsVar ? "(expr !== null ? box : null)" : "((temp = expr) !== null ? box : null)";
                var nullableExpr = new ExprJsExplicit(ctx, nullableJs, innerType, temp.Named("temp"), expr.Named("expr"), box);
                return(nullableExpr);
            }
            else
            {
                var deepCopyExpr = InternalFunctions.ValueTypeDeepCopyIfRequired(e.Type, () => (Expr)this.Visit(expr));
                var int2bool     = e.Type.IsBoolean() && expr.Type.IsInteger() ? "!!" : "";
                var js           = "{v:" + int2bool + "expr,_:type}";
                var ret          = new ExprJsExplicit(ctx, js, e.Type, (deepCopyExpr ?? expr).Named("expr"), eType.Named("type"));
                return(ret);
            }
        }
        protected override ICode VisitIsInst(ExprIsInst e)
        {
            var ctx     = e.Ctx;
            var mIsInst = ctx.Module.Import(((Func <object, Type, object>)InternalFunctions.IsInst).Method);
            var eType   = new ExprJsTypeVarName(ctx, e.Type);
            var expr    = new ExprCall(ctx, e.Type, mIsInst, null, e.Expr, eType);

            return(expr);
        }
Esempio n. 5
0
 protected override ICode VisitJsResolvedProperty(ExprJsResolvedProperty e)
 {
     if (e.Call.CallMethod != null)
     {
         var ctx  = e.Ctx;
         var mDef = e.Call.CallMethod.Resolve();
         if (mDef.IsSetter)
         {
             var tRef = e.Call.CallMethod.Parameters.Last().ParameterType;
             var tDef = tRef.Resolve();
             var attr = tDef.GetCustomAttribute <JsStringEnumAttribute>();
             if (attr != null)
             {
                 var prop          = new ExprJsResolvedProperty(ctx, new FakeCall(e.Call), e.PropertyName).Named("prop");
                 var type          = new ExprJsTypeVarName(ctx, tRef).Named("type");
                 var enumStringMap = new ExprJsTypeData(ctx, TypeData.EnumStringMap).Named("enumStringMap");
                 var value         = e.Call.Args.Last().Named("value");
                 var js            = "prop = type.enumStringMap[value]";
                 var expr          = new ExprJsExplicit(ctx, js, e.Type, type, enumStringMap, value, prop);
                 return(expr);
             }
         }
         else
         {
             var tDef = e.Type.Resolve();
             var attr = tDef.GetCustomAttribute <JsStringEnumAttribute>();
             if (attr != null)
             {
                 var prop          = new ExprJsResolvedProperty(ctx, new FakeCall(e.Call), e.PropertyName).Named("prop");
                 var type          = new ExprJsTypeVarName(ctx, e.Type).Named("type");
                 var enumStringMap = new ExprJsTypeData(ctx, TypeData.EnumStringMap).Named("enumStringMap");
                 var js            = "type.enumStringMap[prop]";
                 var expr          = new ExprJsExplicit(ctx, js, e.Type, prop, type, enumStringMap);
                 return(expr);
             }
         }
     }
     return(base.VisitJsResolvedProperty(e));
 }
 protected virtual ICode VisitJsTypeVarName(ExprJsTypeVarName e) {
     this.ThrowOnNoOverride();
     return e;
 }
 protected override ICode VisitIsInst(ExprIsInst e) {
     var ctx = e.Ctx;
     var mIsInst = ctx.Module.Import(((Func<object, Type, object>)InternalFunctions.IsInst).Method);
     var eType = new ExprJsTypeVarName(ctx, e.Type);
     var expr = new ExprCall(ctx, e.Type, mIsInst, null, e.Expr, eType);
     return expr;
 }
 protected override ICode VisitBox(ExprBox e) {
     var ctx = e.Ctx;
     var expr = (Expr)this.Visit(e.Expr);
     if (e.Type.IsUnsignedInteger() && expr.Type.IsSignedInteger()) {
         expr = new ExprConv(ctx, expr, e.Type, false);
     }
     if (!e.Type.IsValueType) {
         // For ref-types 'box' does nothing
         return this.Visit(e.Expr);
     }
     var eType = new ExprJsTypeVarName(ctx, e.Type);
     if (e.Type.IsNullable()) {
         var exprIsVar = expr.IsVar();
         var innerType = e.Type.GetNullableInnerType();
         var temp = exprIsVar ? null : new ExprVarLocal(ctx, e.Type);
         var box = new ExprBox(ctx, temp ?? expr, innerType).Named("box");
         var nullableJs = exprIsVar ? "(expr !== null ? box : null)" : "((temp = expr) !== null ? box : null)";
         var nullableExpr = new ExprJsExplicit(ctx, nullableJs, innerType, temp.Named("temp"), expr.Named("expr"), box);
         return nullableExpr;
     } else {
         var deepCopyExpr = InternalFunctions.ValueTypeDeepCopyIfRequired(e.Type, () => (Expr)this.Visit(expr));
         var int2bool = e.Type.IsBoolean() && expr.Type.IsInteger() ? "!!" : "";
         var js = "{v:" + int2bool + "expr,_:type}";
         var ret = new ExprJsExplicit(ctx, js, e.Type, (deepCopyExpr ?? expr).Named("expr"), eType.Named("type"));
         return ret;
     }
 }
Esempio n. 9
0
 public static Stmt Equals(Ctx ctx) {
     var other = ctx.MethodParameter(0).Named("other");
     var type = new ExprJsTypeVarName(ctx, ctx.Single).Named("type");
     return new StmtJsExplicit(ctx, "return other._ === type && this === other.v;", ctx.ThisNamed, other, type);
 }
Esempio n. 10
0
 protected override ICode VisitJsTypeVarName(ExprJsTypeVarName e) {
     var name = this.resolver.TypeNames[e.TypeRef];
     this.js.Append(name);
     return e;
 }
        public static Expr InitializeArray(ICall call) {
            var ctx = call.Ctx;
            var array = (ExprVar)call.Args.ElementAt(0);
            var initExpr = (ExprRuntimeHandle)call.Args.ElementAt(1);
            var initData = ((FieldDefinition)initExpr.Member).InitialValue;
            var arrayElType = ((ArrayType)array.Type).ElementType;

            int inc;
            Func<int, object> getValue;
            switch (arrayElType.MetadataType) {
            case MetadataType.Boolean:
                inc = 1;
                getValue = i => initData[i] != 0;
                break;
            case MetadataType.Byte:
                inc = 1;
                getValue = i => initData[i];
                break;
            case MetadataType.SByte:
                inc = 1;
                getValue = i => (sbyte)initData[i];
                break;
            case MetadataType.Int16:
                inc = 2;
                getValue = i => BitConverter.ToInt16(initData, i);
                break;
            case MetadataType.Int32:
                inc = 4;
                getValue = i => BitConverter.ToInt32(initData, i);
                break;
            case MetadataType.Int64:
                inc = 8;
                getValue = i => BitConverter.ToInt64(initData, i);
                break;
            case MetadataType.UInt16:
                inc = 2;
                getValue = i => BitConverter.ToUInt16(initData, i);
                break;
            case MetadataType.UInt32:
                inc = 4;
                getValue = i => BitConverter.ToUInt32(initData, i);
                break;
            case MetadataType.UInt64:
                inc = 8;
                getValue = i => BitConverter.ToUInt64(initData, i);
                break;
            case MetadataType.Single:
                inc = 4;
                getValue = i => BitConverter.ToSingle(initData, i);
                break;
            case MetadataType.Double:
                inc = 8;
                getValue = i => BitConverter.ToDouble(initData, i);
                break;
            case MetadataType.Char:
                inc = 2;
                getValue = i => (char)BitConverter.ToUInt16(initData, i);
                break;
            default:
                throw new NotImplementedException("Cannot handle: " + arrayElType.MetadataType);
            }
            var values = new List<NamedExpr>();
            for (int i = 0; i < initData.Length; i += inc) {
                var value = new ExprLiteral(ctx, getValue(i), arrayElType);
                values.Add(value.Named("v" + i));
            }
            var vStr = string.Join(",", values.Select(x => x.Name));
            var arrayTypeName = new ExprJsTypeVarName(call.Ctx, array.Type).Named("typeName");
            var js = "a = [" + vStr + "]; a._ = typeName";
            return new ExprJsExplicit(call.Ctx, js, array.Type, values.Concat(array.Named("a")).Concat(arrayTypeName));
        }
 protected override ICode VisitJsTypeVarName(ExprJsTypeVarName e) {
     this.types.Add(e.TypeRef);
     return base.VisitJsTypeVarName(e);
 }
Esempio n. 13
0
 public static Stmt GetType(Ctx ctx) {
     var js = "return typeof(this) == \"string\" ? stringType : this._ || __[this.tagName] || __[this.constructor.name];";
     var stringType = new ExprJsTypeVarName(ctx, ctx.String).Named("stringType");
     var stmt = new StmtJsExplicit(ctx, js, ctx.ThisNamed, stringType);
     return stmt;
 }
Esempio n. 14
0
 protected override ICode VisitJsTypeVarName(ExprJsTypeVarName e)
 {
     this.types.Add(e.TypeRef);
     return(base.VisitJsTypeVarName(e));
 }
Esempio n. 15
0
 protected override ICode VisitJsTypeVarName(ExprJsTypeVarName e) {
     this.code.AppendFormat("typeof({0})", e.TypeRef.Name);
     return e;
 }
Esempio n. 16
0
 protected virtual ICode VisitJsTypeVarName(ExprJsTypeVarName e)
 {
     this.ThrowOnNoOverride();
     return(e);
 }