static public void For(Accelerator_View view, Tiled_Extent extent, _Kernel_tiled_type _kernel) { // Compile and link any "to do" work before any DLL loading. builder.Make(); Structure structure = Analysis.Singleton().FindAllTargets(_kernel); // Get corresponding Campy code for C# kernel. Type thunk = GetThunk(_kernel, extent, structure); // Create thunk object. object obj = Activator.CreateInstance(thunk); // Set fields of thunk based on lambda. CopyFieldsFromHostToStaging(_kernel, structure, ref obj); // Set extent. CopyExtentToStaging(extent, ref obj); // Set extent. CopyViewToStaging(view, ref obj); // Get address of thunk method. SR.MethodInfo mi2 = thunk.GetMethod(Campy.Utils.Utility.NormalizeSystemReflectionName(_kernel.Method.Name)); // Call thunk method. mi2.Invoke(obj, new object[] { }); }
private static void CopyExtentToStaging(Tiled_Extent extent, ref object staging_object) { Type s = staging_object.GetType(); SR.FieldInfo[] sfi = s.GetFields(); bool found = false; foreach (SR.FieldInfo field in sfi) { if (field.Name.Equals("extent")) { if (found) { throw new Exception("CopyExtentToStaging encountered an internal error--found duplicate extent field in managed object."); } found = true; field.SetValue(staging_object, extent); } } if (!found) { throw new Exception("CopyExtentToStaging encountered an internal error--did not find extent field in managed object."); } }
static public void For(Tiled_Extent extent, _Kernel_tiled_type _kernel) { Accelerator_View view = new Accelerator_View(); For(view, extent, _kernel); }