コード例 #1
0
ファイル: Injectable.cs プロジェクト: dotnet-toolset/Netfuser
        public override StringMangleStackTop?Emit(IStringMangleContext context)
        {
            var emitter = context.Emitter;
            var fr      = new FeatureRequest(Context, emitter);

            using (var r = fr.Enter(context.SourceMethod))
                if (r != null)
                {
                    ValueDemangler cdm;
                    do
                    {
                        cdm = _demanglers.RandomElementOrDefault(Mangler.Rng);
                    } while (fr.IsOnStack(cdm.Method.Method));

                    var part = context.Pieces.Dequeue();
                    using (emitter.UseTempLocal(cdm.Method.Type.TypeMapping.Target.ToTypeSig(), out var instance))
                    {
                        cdm.EmitNew(emitter, Mangler.Rng, instance);
                        var mangledPart = cdm.Codec.Mangle(part.Value);
                        Debug.Assert(Equals(cdm.Codec.Demangle(mangledPart), part.Value));
                        cdm.EmitCall(emitter, Mangler.Rng, instance, mangledPart);
                    }

                    return(StringMangleStackTop.String);
                }

            return(null);
        }
コード例 #2
0
ファイル: AsIs.cs プロジェクト: dotnet-toolset/Netfuser
        public override StringMangleStackTop?Emit(IStringMangleContext context)
        {
            var emitter = context.Emitter;
            var part    = context.Pieces.Dequeue();

            emitter.Const(part.Value);
            return(StringMangleStackTop.String);
        }
コード例 #3
0
        public static StringMangleStackTop Int2String(IStringMangleContext context, int len, int bits, bool be)
        {
            Debug.Assert(len * bits <= 32);
            var emitter = context.Emitter;

            using (emitter.UseTempLocal <int>(out var encVar))
            {
                var uni   = bits > 8;
                var step  = uni ? 16 : 8;
                var shift = be ? 32 : 0;
                var mask  = uni ? 0xffff : 0xff;
                emitter.Stloc(encVar);
                context.EnsureStringBuilderOnStackTop();
                for (var i = 0; i < len; i++)
                {
                    emitter.Ldloc(encVar);
                    if (be)
                    {
                        shift -= step;
                        if (shift > 0)
                        {
                            emitter.Const(shift).Emit(OpCodes.Shr_Un);
                        }
                    }
                    else
                    {
                        if (shift > 0)
                        {
                            emitter.Const(shift).Emit(OpCodes.Shr_Un);
                        }
                        shift += step;
                    }

                    emitter.Const(mask).Emit(OpCodes.And).Emit(OpCodes.Conv_U2);
                    emitter.Callvirt(Method_StringBuilder_Append_Char);
                }
            }
            return(StringMangleStackTop.StringBuilder);
        }
コード例 #4
0
        public override StringMangleStackTop?Emit(IStringMangleContext context)
        {
            var part = context.Pieces.Peek();

            if (part.Bits * part.Value.Length > 32)
            {
                return(null);
            }
            var emitter = context.Emitter;
            var fr      = new FeatureRequest(Context, emitter);

            using (var r = fr.Enter(context.SourceMethod))
                if (r != null)
                {
                    part = context.Pieces.Dequeue();
                    var be = context.Mangler.Rng.NextBoolean();
                    var i  = SmUtils.String2Int(part.Value, part.Bits, be);
                    Context.IntMangler().Emit(fr, i);
                    return(SmUtils.Int2String(context, part.Value.Length, part.Bits,
                                              be));
                }
            return(null);
        }
コード例 #5
0
 public abstract StringMangleStackTop?Emit(IStringMangleContext context);