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); }
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); }