示例#1
0
        private protected void FindParameters(InstructionMetadata meta)
        {
            if (meta.Parameters == null)
            {
                meta.Parameters = new List <MemoryAddressAttributeBase>();
            }

            ParameterInfo[] parameters = meta.Method.GetParameters();
            foreach (ParameterInfo parameter in parameters)
            {
                MemoryAddressAttributeBase attribute = (MemoryAddressAttributeBase)parameter.GetCustomAttribute(typeof(MemoryAddressAttributeBase), false);
                if (attribute != null)
                {
                    if (parameter.ParameterType != typeof(int))
                    {
                        ThrowInvalidParameterType(parameter.Name, "int", meta);
                    }

                    // add parameter to meta
                    MemoryAddressAttributeBase param = attribute;
                    meta.Parameters.Add(param);
                }
                else
                {
                    if (parameter.ParameterType != typeof(byte))
                    {
                        ThrowInvalidParameterType(parameter.Name, "byte", meta);
                    }

                    // add parameter to meta
                    MemoryAddressAttributeBase param = null;
                    meta.Parameters.Add(param);
                }
            }

            RegisterInstructionMetadata(meta);
        }
示例#2
0
        private protected Action GenerateDelegate(InstructionMetadata meta)
        {
            Action del = () =>
            {
                object[] instParams = new object[meta.Parameters.Count];

                for (int i = 0; i < instParams.Length; i++)
                {
                    MemoryAddressAttributeBase attr = meta.Parameters[i];
                    if (attr == null)
                    {
                        instParams[i] = FetchNext();
                    }
                    else
                    {
                        byte[] rawAddr = FetchMultiple(attr.RequiredBytes);
                        instParams[i] = attr.Resolve(this, ref rawAddr);
                    }
                }
                meta.Method.Invoke(meta.ClassInstance, instParams);
            };

            return(del);
        }