static bool FromColdCode() { int yield = -1; bool result1 = false; bool result2 = false; try { // This pinvoke should not be inline (cold) yield = PInvokeExampleNative.GetConstant(); throw new Exception("expected"); } catch (Exception) { // These two pinvokes should not be inline (catch) // // For the first call the jit won't inline the // wrapper, so it just calls GetConstant(). // // For the second call, the force inline works, and // the subsequent inline of GetConstant() exposes // a call to the pinvoke GetConstantInternal(). This // pinvoke will not be inline. result1 = (yield == PInvokeExampleNative.GetConstant()); result2 = (yield == AsForceInline()); } return(result1 && result2); }
static bool FromNoInline() { // The only pinvoke should be inline bool result = (PInvokeExampleNative.GetConstant() == AsNoInline()); return(result); }
static bool FromInline() { // These two pinvokes should be inline bool result = (PInvokeExampleNative.GetConstant() == AsForceInline()); return(result); }
static bool FromTryFinally3() { bool result = false; bool result1 = false; bool result2 = false; try { // These two pinvokes should be inline, except on x64 result1 = (PInvokeExampleNative.GetConstant() == AsNormalInline()); } finally { try { // These two pinvokes should *not* be inline (finally) result2 = (PInvokeExampleNative.GetConstant() == AsNormalInline()); } catch (Exception) { result2 = false; } result = result1 && result2; } return(result); }
static bool FromNoInline2() { // Three pinvokes should be inline bool result1 = (PInvokeExampleNative.GetConstant() == AsNormalInline()); bool result2 = (PInvokeExampleNative.GetConstant() == AsNoInline()); return(result1 && result2); }
static bool FromTryCatch() { bool result = false; try { // All pinvokes should be inline, except on x64 result = (PInvokeExampleNative.GetConstant() == AsNormalInline()); } catch (Exception) { result = false; } return(result); }
static bool FromTryFinally() { bool result = false; bool result1 = false; bool result2 = false; try { // All pinvokes should be inline, except on x64 result1 = (PInvokeExampleNative.GetConstant() == AsNormalInline()); result2 = (PInvokeExampleNative.GetConstant() == AsNormalInline()); } finally { result = result1 && result2; } return(result); }
static bool FromFilter() { bool result = false; try { throw new Exception("expected"); } // These two pinvokes should *not* be inline (filter) // // For the first call the jit won't inline the wrapper, so // it just calls GetConstant(). // // For the second call, the force inline works, and the // subsequent inline of GetConstant() exposes a call // to the pinvoke GetConstantInternal(). This pinvoke will // not be inline. catch (Exception) when(PInvokeExampleNative.GetConstant() == AsForceInline()) { result = true; } return(result); }
static int AsNoInline() { return(PInvokeExampleNative.GetConstant()); }