private CorInfoInitClassResult initClass(IntPtr _this, CORINFO_FIELD_STRUCT_* field, CORINFO_METHOD_STRUCT_* method, CORINFO_CONTEXT_STRUCT* context, [MarshalAs(UnmanagedType.Bool)]bool speculative) { FieldDesc fd = field == null ? null : HandleToObject(field); Debug.Assert(fd == null || fd.IsStatic); MethodDesc md = HandleToObject(method); TypeDesc type = fd != null ? fd.OwningType : typeFromContext(context); if (!type.HasStaticConstructor) { return CorInfoInitClassResult.CORINFO_INITCLASS_NOT_REQUIRED; } MetadataType typeToInit = (MetadataType)type; if (typeToInit.IsModuleType) { // For both jitted and ngen code the global class is always considered initialized return CorInfoInitClassResult.CORINFO_INITCLASS_NOT_REQUIRED; } if (fd == null) { if (typeToInit.IsBeforeFieldInit) { // We can wait for field accesses to run .cctor return CorInfoInitClassResult.CORINFO_INITCLASS_NOT_REQUIRED; } // Run .cctor on statics & constructors if (md.Signature.IsStatic) { // Except don't class construct on .cctor - it would be circular if (md.IsStaticConstructor) { return CorInfoInitClassResult.CORINFO_INITCLASS_NOT_REQUIRED; } } else if (!md.IsConstructor && !typeToInit.IsValueType) { // According to the spec, we should be able to do this optimization for both reference and valuetypes. // To maintain backward compatibility, we are doing it for reference types only. // For instance methods of types with precise-initialization // semantics, we can assume that the .ctor triggerred the // type initialization. // This does not hold for NULL "this" object. However, the spec does // not require that case to work. return CorInfoInitClassResult.CORINFO_INITCLASS_NOT_REQUIRED; } } // TODO: before giving up and asking to generate a helper call, check to see if this is some pattern we can // prove doesn't need initclass anymore because we initialized it earlier. return CorInfoInitClassResult.CORINFO_INITCLASS_USE_HELPER; }
private void findSig(IntPtr _this, CORINFO_MODULE_STRUCT_* module, uint sigTOK, CORINFO_CONTEXT_STRUCT* context, CORINFO_SIG_INFO* sig) { var methodIL = (MethodIL)HandleToObject((IntPtr)module); Get_CORINFO_SIG_INFO((MethodSignature)methodIL.GetObject((int)sigTOK), out *sig); }
private void findCallSiteSig(IntPtr _this, CORINFO_MODULE_STRUCT_* module, uint methTOK, CORINFO_CONTEXT_STRUCT* context, CORINFO_SIG_INFO* sig) { // TODO: dynamic scopes // TODO: verification var methodIL = (MethodIL)HandleToObject((IntPtr)module); Get_CORINFO_SIG_INFO(((MethodDesc)methodIL.GetObject((int)methTOK)).Signature, out *sig); }
private MethodDesc methodFromContext(CORINFO_CONTEXT_STRUCT* contextStruct) { if (((ulong)contextStruct & (ulong)CorInfoContextFlags.CORINFO_CONTEXTFLAGS_MASK) == (ulong)CorInfoContextFlags.CORINFO_CONTEXTFLAGS_CLASS) { return null; } else { return HandleToObject((CORINFO_METHOD_STRUCT_*)((ulong)contextStruct & ~(ulong)CorInfoContextFlags.CORINFO_CONTEXTFLAGS_MASK)); } }
private TypeDesc typeFromContext(CORINFO_CONTEXT_STRUCT* contextStruct) { if (((ulong)contextStruct & (ulong)CorInfoContextFlags.CORINFO_CONTEXTFLAGS_MASK) == (ulong)CorInfoContextFlags.CORINFO_CONTEXTFLAGS_CLASS) { return HandleToObject((CORINFO_CLASS_STRUCT_*)((ulong)contextStruct & ~(ulong)CorInfoContextFlags.CORINFO_CONTEXTFLAGS_MASK)); } else { return methodFromContext(contextStruct).OwningType; } }
private void findCallSiteSig(CORINFO_MODULE_STRUCT_* module, uint methTOK, CORINFO_CONTEXT_STRUCT* context, CORINFO_SIG_INFO* sig) { var methodIL = (MethodIL)HandleToObject((IntPtr)module); Get_CORINFO_SIG_INFO(((MethodDesc)methodIL.GetObject((int)methTOK)), out *sig); }
public virtual void findCallSiteSig_wrapper(IntPtr _this, out IntPtr exception, CORINFO_MODULE_STRUCT_* module, uint methTOK, CORINFO_CONTEXT_STRUCT* context, CORINFO_SIG_INFO* sig) { exception = IntPtr.Zero; try { findCallSiteSig(module, methTOK, context, sig); return; } catch (Exception ex) { exception = AllocException(ex); } }
public virtual CorInfoInitClassResult initClass_wrapper(IntPtr _this, out IntPtr exception, CORINFO_FIELD_STRUCT_* field, CORINFO_METHOD_STRUCT_* method, CORINFO_CONTEXT_STRUCT* context, [MarshalAs(UnmanagedType.Bool)]bool speculative) { exception = IntPtr.Zero; try { return initClass(field, method, context, speculative); } catch (Exception ex) { exception = AllocException(ex); } return (CorInfoInitClassResult)0; }
static void _findCallSiteSig(IntPtr thisHandle, IntPtr* ppException, CORINFO_MODULE_STRUCT_* module, uint methTOK, CORINFO_CONTEXT_STRUCT* context, CORINFO_SIG_INFO* sig) { var _this = GetThis(thisHandle); try { _this.findCallSiteSig(module, methTOK, context, sig); } catch (Exception ex) { *ppException = _this.AllocException(ex); } }
static CorInfoInitClassResult _initClass(IntPtr thisHandle, IntPtr* ppException, CORINFO_FIELD_STRUCT_* field, CORINFO_METHOD_STRUCT_* method, CORINFO_CONTEXT_STRUCT* context, [MarshalAs(UnmanagedType.Bool)]bool speculative) { var _this = GetThis(thisHandle); try { return _this.initClass(field, method, context, speculative); } catch (Exception ex) { *ppException = _this.AllocException(ex); return default(CorInfoInitClassResult); } }