示例#1
0
        public void Run(ICommandInteraction writer, [Values(TraceEnableCommand)] LiteralToken enable, LiteralToken cpuToken, StringToken functionName, BooleanToken traceReturn, params LiteralToken[] types)
        {
            var cpu       = (Arm)monitor.ConvertValueOrThrowRecoverable(cpuToken.Value, typeof(Arm));
            var cpuTracer = EnsureTracer(cpu);
            var handler   = new DefaultFunctionHandler(cpu);
            var paramList = new List <FunctionCallParameter>();

            foreach (var parameter in types)
            {
                FunctionCallParameterType paramType;
                if (!Enum.TryParse(parameter.Value, out paramType))
                {
                    throw new RecoverableException("{0} is not a proper parameter type.".FormatWith(parameter.Value));
                }
                paramList.Add(new FunctionCallParameter {
                    Type = paramType
                });
            }
            handler.CallParameters  = paramList.Take(paramList.Count - (traceReturn.Value ? 1 : 0));
            handler.ReturnParameter = traceReturn.Value ? paramList.Last() : (FunctionCallParameter?)null;
            if (traceReturn.Value)
            {
                cpuTracer.TraceFunction(functionName.Value, handler.CallParameters, handler.CallHandler, handler.ReturnParameter, handler.ReturnHandler);
            }
            else
            {
                cpuTracer.TraceFunction(functionName.Value, handler.CallParameters, handler.CallHandler);
            }
        }
示例#2
0
        private void Execute(ICommandInteraction writer, LiteralToken cpuToken, String functionName, bool traceReturn, int?numberOfParameters)
        {
            var cpu = (Arm)monitor.ConvertValueOrThrowRecoverable(cpuToken.Value, typeof(Arm));

            var              cpuTracer = EnsureTracer(cpu);
            Type             handlerType;
            IFunctionHandler handler;

            if (!handlers.TryGetValue(functionName, out handlerType))
            {
                if (numberOfParameters.HasValue)
                {
                    var paramList = new List <FunctionCallParameter>();
                    for (var i = 0; i < numberOfParameters; ++i)
                    {
                        paramList.Add(new FunctionCallParameter {
                            Type = FunctionCallParameterType.UInt32
                        });
                    }
                    FunctionCallParameter?returnParameter = null;
                    if (traceReturn)
                    {
                        returnParameter = new FunctionCallParameter {
                            Type = FunctionCallParameterType.UInt32
                        };
                    }
                    var defHandler = new DefaultFunctionHandler(cpu);
                    defHandler.CallParameters  = paramList;
                    defHandler.ReturnParameter = returnParameter;
                    handler = defHandler;
                }
                else
                {
                    throw new RecoverableException("Handler for {0} not register. You must provide numberOfParameters to use default handler.".FormatWith(functionName));
                }
            }
            else
            {
                handler = Dynamic.InvokeConstructor(handlerType, cpu);
            }
            if (traceReturn)
            {
                cpuTracer.TraceFunction(functionName, handler.CallParameters, handler.CallHandler, handler.ReturnParameter, handler.ReturnHandler);
            }
            else
            {
                cpuTracer.TraceFunction(functionName, handler.CallParameters, handler.CallHandler);
            }
        }
示例#3
0
 /// <summary>
 /// 初始化一个<see cref="DataHandlerInitializer"/>类型的新实例
 /// </summary>
 public DataHandlerInitializer()
 {
     FunctionHandler   = new DefaultFunctionHandler();
     EntityInfoHandler = new DefaultEntityInfoHandler();
 }
示例#4
0
 /// <summary>
 /// 初始化一个<see cref="DataHandlerInitializer"/>类型的新实例
 /// </summary>
 public DataHandlerInitializer()
 {
     FunctionHandler = new DefaultFunctionHandler();
     EntityInfoHandler = new DefaultEntityInfoHandler();
 }