Esempio n. 1
0
        // Creates call the the executed event
        private void EmitOnMethodExecuted(ILGenerator emitIl, StackIndex index, CustomAttributeContainer[] attributes, CustomParameterInfo[] parameters)
        {
            var len = attributes.Length;

            var paramCount = parameters.Length;

            for (var i = 0; i < len; i++)
            {
                emitIl.Emit(OpCodes.Ldloc, i);
                emitIl.Emit(OpCodes.Ldloc, index.Context);
                emitIl.Emit(OpCodes.Ldc_I4, paramCount);
                emitIl.Emit(OpCodes.Newarr, typeof(object));
                emitIl.Emit(OpCodes.Stloc, index.Store);

                for (var j = 0; j < paramCount; j++)
                {
                    emitIl.Emit(OpCodes.Ldloc, index.Store);
                    emitIl.Emit(OpCodes.Ldc_I4, j);
                    emitIl.Emit(OpCodes.Ldarg, j + 1);

                    var parameterType = parameters[j].ParameterType;
                    if (parameterType.GetTypeInfo().IsValueType) //not reference
                    {
                        emitIl.Emit(OpCodes.Box, parameterType);
                    }

                    emitIl.Emit(OpCodes.Stelem_Ref);
                }

                emitIl.Emit(OpCodes.Ldloc, index.Store);
                emitIl.EmitCall(OpCodes.Callvirt, typeof(BaseAspect).GetMethod("OnMethodExecuted"), new Type[] { typeof(object[]) });
            }
        }
Esempio n. 2
0
        // Creates call the the returning event
        private void EmitOnMethodReturning(AspectAction action, ILGenerator emitIl, StackIndex index, Type returnType, CustomAttributeContainer[] attributes)
        {
            var len        = attributes.Length;
            var returnInfo = returnType.GetTypeInfo();

            for (var i = 0; i < len; i++)
            {
                emitIl.Emit(OpCodes.Ldloc_S, i);
                emitIl.Emit(OpCodes.Ldloc_S, index.Context);
                emitIl.Emit(OpCodes.Ldloc_S, index.Output);

                if (returnInfo.IsValueType)
                {
                    emitIl.Emit(OpCodes.Box, returnType);
                }

                emitIl.EmitCall(OpCodes.Callvirt, typeof(BaseAspect).GetMethod(action.ToString()), new Type[] { typeof(AspectEventContext), returnType });

                if (returnInfo.IsValueType)
                {
                    emitIl.Emit(OpCodes.Unbox_Any, returnType);
                }

                emitIl.Emit(OpCodes.Stloc_S, index.Output);
                emitIl.Emit(OpCodes.Nop);
            }
        }
Esempio n. 3
0
        // Creates block wrapping the setter execution
        private void EmitOnPropertySetting(ILGenerator emitIl, Type baseType, Type propertyType, string propertyName, CustomAttributeContainer[] attributes, CustomParameterInfo[] parameters)
        {
            var index = new StackIndex();

            EmitAspectObjects(emitIl, attributes);
            EmitAspectSetterInterception(emitIl, index, baseType.GetMethod(propertyName), propertyName, new Type[] { propertyType }, attributes, parameters);

            emitIl.Emit(OpCodes.Ret);
        }
Esempio n. 4
0
        // Creates block wrapping the execution and return events
        private void EmitOnMethodExecution(ILGenerator emitIl, Type baseType, MethodInfo method, CustomAttributeContainer[] attributes, CustomParameterInfo[] parameters)
        {
            var index = new StackIndex();

            EmitAspectObjects(emitIl, attributes);
            EmitAspectMethodInterception(emitIl, index, method, new Type[] { method.ReturnType }, attributes, parameters);

            if (method.ReturnType != typeof(void))
            {
                EmitOnMethodReturning(AspectAction.OnMethodReturning, emitIl, index, method.ReturnType, attributes);
                EmitOnMethodReturned(emitIl, index, method.ReturnType, attributes);
                emitIl.Emit(OpCodes.Ldloc_S, index.Output);
            }

            emitIl.Emit(OpCodes.Ret);
        }
Esempio n. 5
0
        // Creates block wrapping the getter execution
        private void EmitOnPropertyGetting(ILGenerator emitIl, Type baseType, Type propertyType, string propertyName, CustomAttributeContainer[] attributes)
        {
            var index = new StackIndex();

            EmitAspectObjects(emitIl, attributes);

            index.Store   = index.Output = emitIl.DeclareLocal(propertyType);
            index.Context = emitIl.DeclareLocal(typeof(AspectEventContext));

            EmitEventParameters(emitIl, propertyName, index.Context);

            emitIl.Emit(OpCodes.Ldarg_0);
            emitIl.EmitCall(OpCodes.Call, baseType.GetMethod(propertyName), null);
            emitIl.Emit(OpCodes.Stloc_S, index.Store);

            EmitOnMethodReturning(AspectAction.OnPropertyGetting, emitIl, index, propertyType, attributes);

            emitIl.Emit(OpCodes.Ldloc_S, index.Output);
            emitIl.Emit(OpCodes.Ret);
        }
Esempio n. 6
0
        // Creates call the the returned event
        private void EmitOnMethodReturned(ILGenerator emitIl, StackIndex index, Type returnType, CustomAttributeContainer[] attributes)
        {
            var len        = attributes.Length;
            var returnInfo = returnType.GetTypeInfo();

            for (var i = 0; i < len; i++)
            {
                emitIl.Emit(OpCodes.Ldloc_S, i);
                emitIl.Emit(OpCodes.Ldloc_S, index.Context);
                emitIl.Emit(OpCodes.Ldloc_S, index.Output);

                if (returnInfo.IsValueType) //not reference
                {
                    emitIl.Emit(OpCodes.Box, returnType);
                }

                emitIl.EmitCall(OpCodes.Callvirt, typeof(BaseAspect).GetMethod("OnMethodReturned"), new Type[] { returnType });
                emitIl.Emit(OpCodes.Nop);
            }
        }
Esempio n. 7
0
        [TestMethod] public void Test()
        {
            using (var l = new Lua())
            {
                var L = luanet.getstate(l);

                GC.KeepAlive(L[1].DebuggerValue);
                Assert.AreEqual(0, L.Length);
                Assert.AreEqual(2, L.Count);
                Assert.AreEqual(2, L.Sum(si => si.Type == LUA.T.NONE ? 0 : 1));

                lua.createtable(L, 1, 0);
                Assert.AreEqual(1, L.Length);
                foreach (var x in L)
                {
                }
                StackIndex i1 = L[1];
                Assert.AreEqual(1, i1.Index);
                Assert.AreEqual(0UL, i1.Length);
                Assert.AreEqual(LUA.T.TABLE, i1.Type);
                GC.KeepAlive(i1.Value);

                lua.pushnumber(L, 12);
                lua.rawseti(L, -2, 1);
                StackIndexChild i11 = i1[1];
                Assert.AreEqual(i1, i11.Parent);
                Assert.AreEqual(LUA.T.NUMBER, i11.Type);
                Assert.AreEqual(0UL, i11.Length);
                GC.KeepAlive(i11.Value);

                lua.settop(L, 0);
                Assert.AreEqual(0, L.Length);

                try { GC.KeepAlive(i11.Type); Assert.Fail(); } catch (LuaScriptException) {}

                GC.KeepAlive(L[LUA.REGISTRYINDEX].Value);

                Assert.AreEqual(0, L.Length);
            }
        }
Esempio n. 8
0
    public ExceptionlessElasticConfiguration(
        AppOptions appOptions,
        IQueue <WorkItemData> workItemQueue,
        JsonSerializerSettings serializerSettings,
        ICacheClient cacheClient,
        IMessageBus messageBus,
        IServiceProvider serviceProvider,
        ILoggerFactory loggerFactory
        ) : base(workItemQueue, cacheClient, messageBus, loggerFactory)
    {
        _appOptions         = appOptions;
        _serializerSettings = serializerSettings;

        _logger.LogInformation("All new indexes will be created with {ElasticsearchNumberOfShards} Shards and {ElasticsearchNumberOfReplicas} Replicas", _appOptions.ElasticsearchOptions.NumberOfShards, _appOptions.ElasticsearchOptions.NumberOfReplicas);
        AddIndex(Stacks        = new StackIndex(this));
        AddIndex(Events        = new EventIndex(this, serviceProvider, appOptions));
        AddIndex(Migrations    = new MigrationIndex(this, _appOptions.ElasticsearchOptions.ScopePrefix + "migrations", appOptions.ElasticsearchOptions.NumberOfReplicas));
        AddIndex(Organizations = new OrganizationIndex(this));
        AddIndex(Projects      = new ProjectIndex(this));
        AddIndex(Tokens        = new TokenIndex(this));
        AddIndex(Users         = new UserIndex(this));
        AddIndex(WebHooks      = new WebHookIndex(this));
    }
Esempio n. 9
0
 public StackRepository(IElasticClient elasticClient, StackIndex index, IEventRepository eventRepository, IValidator <Stack> validator = null, ICacheClient cacheClient = null, IMessagePublisher messagePublisher = null)
     : base(elasticClient, index, validator, cacheClient, messagePublisher)
 {
     _eventRepository = eventRepository;
     DocumentChanging.AddHandler(OnDocumentChangingAsync);
 }
Esempio n. 10
0
        // Creates the "AND" condition test that all executing aspects must return true from for root property setter execution
        private void EmitAspectSetterInterception(ILGenerator emitIl, StackIndex index, MethodInfo method, string methodName, Type[] types, CustomAttributeContainer[] attributes, CustomParameterInfo[] parameters)
        {
            var len        = attributes.Length;
            var setterType = parameters.First().ParameterType;
            var setterInfo = setterType.GetTypeInfo();

            var trueLabel  = emitIl.DefineLabel();
            var falseLabel = emitIl.DefineLabel();
            var endLabel   = emitIl.DefineLabel();

            index.Context = emitIl.DeclareLocal(typeof(AspectEventContext));
            index.Store   = emitIl.DeclareLocal(typeof(bool));

            EmitEventParameters(emitIl, methodName, index.Context);

            for (var i = 0; i < len; i++)
            {
                emitIl.Emit(OpCodes.Ldloc, i);
                emitIl.Emit(OpCodes.Ldloc, index.Context);
                emitIl.Emit(OpCodes.Ldarg, 1);

                if (setterInfo.IsValueType) //not reference
                {
                    emitIl.Emit(OpCodes.Box, setterType);
                }

                emitIl.EmitCall(OpCodes.Callvirt, typeof(BaseAspect).GetMethod("OnPropertySetting"), new Type[] { typeof(AspectEventContext), typeof(object) });

                if (len > 1)
                {
                    if (i < len - 1)
                    {
                        emitIl.Emit(OpCodes.Brfalse, falseLabel);
                    }
                    else
                    {
                        emitIl.Emit(OpCodes.Ldc_I4_0);
                        emitIl.Emit(OpCodes.Ceq);
                        emitIl.Emit(OpCodes.Br, trueLabel);
                    }
                }
                else
                {
                    emitIl.Emit(OpCodes.Ldc_I4_0);
                    emitIl.Emit(OpCodes.Ceq);
                }
            }

            if (len > 1)
            {
                emitIl.MarkLabel(falseLabel);
                emitIl.Emit(OpCodes.Ldc_I4_1);
                emitIl.MarkLabel(trueLabel);
            }

            emitIl.Emit(OpCodes.Stloc, index.Store);
            emitIl.Emit(OpCodes.Ldloc, index.Store);
            emitIl.Emit(OpCodes.Brtrue, endLabel);
            emitIl.Emit(OpCodes.Nop);

            emitIl.Emit(OpCodes.Ldarg_0);
            emitIl.Emit(OpCodes.Ldarg_1);
            emitIl.EmitCall(OpCodes.Call, method, types);

            emitIl.Emit(OpCodes.Nop);
            emitIl.MarkLabel(endLabel);
        }
Esempio n. 11
0
        // Creates the "AND" condition test that all executing aspects must return true from for root method execution
        private void EmitAspectMethodInterception(ILGenerator emitIl, StackIndex index, MethodInfo method, Type[] types, CustomAttributeContainer[] attributes, CustomParameterInfo[] parameters)
        {
            var paramCount = parameters.Length;
            var len        = attributes.Length;
            var isVoid     = method.ReturnType == typeof(void);

            var trueLabel  = emitIl.DefineLabel();
            var falseLabel = emitIl.DefineLabel();
            var endLabel   = emitIl.DefineLabel();

            index.Context = emitIl.DeclareLocal(typeof(AspectEventContext));
            index.Store   = emitIl.DeclareLocal(typeof(object[]));
            index.Bool    = emitIl.DeclareLocal(typeof(bool));

            if (!isVoid)
            {
                index.Output = emitIl.DeclareLocal(method.ReturnType);
            }

            EmitEventParameters(emitIl, method.Name, index.Context);

            if (!isVoid)
            {
                if (method.ReturnType.GetTypeInfo().IsValueType)
                {
                    emitIl.LoadForValueType(0);
                }
                else
                {
                    emitIl.LoadForValueType(null);
                }
                emitIl.Emit(OpCodes.Stloc, index.Output);
            }

            for (var i = 0; i < len; i++)
            {
                emitIl.Emit(OpCodes.Ldloc, i);
                emitIl.Emit(OpCodes.Ldloc, index.Context);

                emitIl.Emit(OpCodes.Ldc_I4, paramCount);
                emitIl.Emit(OpCodes.Newarr, typeof(object));
                emitIl.Emit(OpCodes.Stloc, index.Store);

                for (var j = 0; j < paramCount; j++)
                {
                    emitIl.Emit(OpCodes.Ldloc, index.Store);
                    emitIl.Emit(OpCodes.Ldc_I4, j);
                    emitIl.Emit(OpCodes.Ldarg, j + 1);

                    var parameterType = parameters[j].ParameterType;
                    if (parameterType.GetTypeInfo().IsValueType) //not reference
                    {
                        emitIl.Emit(OpCodes.Box, parameterType);
                    }

                    emitIl.Emit(OpCodes.Stelem_Ref);
                }

                emitIl.Emit(OpCodes.Ldloc, index.Store);
                emitIl.EmitCall(OpCodes.Callvirt, typeof(BaseAspect).GetMethod("OnMethodExecuting"), new Type[] { typeof(AspectEventContext), typeof(object[]) });

                if (len > 1)
                {
                    if (i < len - 1)
                    {
                        emitIl.Emit(OpCodes.Brfalse, falseLabel);
                    }
                    else
                    {
                        emitIl.Emit(OpCodes.Ldc_I4_0);
                        emitIl.Emit(OpCodes.Ceq);
                        emitIl.Emit(OpCodes.Br, trueLabel);
                    }
                }
                else
                {
                    emitIl.Emit(OpCodes.Ldc_I4_0);
                    emitIl.Emit(OpCodes.Ceq);
                }
            }

            if (len > 1)
            {
                emitIl.MarkLabel(falseLabel);
                emitIl.Emit(OpCodes.Ldc_I4_1);
                emitIl.MarkLabel(trueLabel);
            }

            emitIl.Emit(OpCodes.Stloc, index.Bool);
            emitIl.Emit(OpCodes.Ldloc, index.Bool);
            emitIl.Emit(OpCodes.Brtrue, endLabel);
            emitIl.Emit(OpCodes.Nop);

            emitIl.Emit(OpCodes.Ldarg_0);

            for (var i = 1; i <= parameters.Length; i++)
            {
                emitIl.Emit(OpCodes.Ldarg_S, i);
            }

            emitIl.EmitCall(OpCodes.Call, method, types);

            if (!isVoid)
            {
                emitIl.Emit(OpCodes.Stloc, index.Output);
            }

            EmitOnMethodExecuted(emitIl, index, attributes, parameters);
            emitIl.Emit(OpCodes.Nop);

            emitIl.MarkLabel(endLabel);
        }
 public StackRepository(ElasticRepositoryContext <Stack> context, StackIndex index, IEventRepository eventRepository, ILoggerFactory loggerFactory = null) : base(context, index, loggerFactory)
 {
     _eventRepository = eventRepository;
     DocumentsChanging.AddHandler(OnDocumentChangingAsync);
 }