Fix missing receiver NPE checks for field get/set MH

Bug: 236815690
Test: art/test/run-test --host 959
Change-Id: Ief4713290c83291c3d538501c83a7239bf2daf10
diff --git a/runtime/method_handles.cc b/runtime/method_handles.cc
index 1327a24..286e097 100644
--- a/runtime/method_handles.cc
+++ b/runtime/method_handles.cc
@@ -625,6 +625,10 @@
     case mirror::MethodHandle::kInstanceGet: {
       size_t obj_reg = operands->GetOperand(0);
       ObjPtr<mirror::Object> obj = shadow_frame.GetVRegReference(obj_reg);
+      if (obj == nullptr) {
+        ThrowNullPointerException("Receiver is null");
+        return false;
+      }
       MethodHandleFieldGet(self, shadow_frame, obj, field, field_type, result);
       return true;
     }
@@ -648,6 +652,10 @@
           callsite_type->GetPTypes()->Get(kPTypeIndex)->GetPrimitiveType(),
           value_reg);
       ObjPtr<mirror::Object> obj = shadow_frame.GetVRegReference(obj_reg);
+      if (obj == nullptr) {
+        ThrowNullPointerException("Receiver is null");
+        return false;
+      }
       return MethodHandleFieldPut(self, shadow_frame, obj, field, field_type, value);
     }
     case mirror::MethodHandle::kStaticPut: {
diff --git a/test/959-invoke-polymorphic-accessors/src/Main.java b/test/959-invoke-polymorphic-accessors/src/Main.java
index 03fd285..e4a6f94 100644
--- a/test/959-invoke-polymorphic-accessors/src/Main.java
+++ b/test/959-invoke-polymorphic-accessors/src/Main.java
@@ -793,6 +793,10 @@
                 Long z = (Long) h0.invoke(valueHolder);
                 fail();
             } catch (WrongMethodTypeException expected) {}
+            try {
+                int x = (int) h0.invokeExact((ValueHolder) null);
+                fail();
+            } catch (NullPointerException expected) {}
         }
 
         /*package*/ static Number getDoubleAsNumber() {
@@ -822,6 +826,10 @@
               h0.invoke(valueHolder, (Float) null);
               fail();
             } catch (NullPointerException expected) {}
+            try {
+                h0.invoke((ValueHolder) null, Float.valueOf(1.0f));
+                fail();
+              } catch (NullPointerException expected) {}
 
             // Test that type conversion checks work on small field types.
             short temp = (short) s0.invoke(valueHolder, new Byte((byte) 45));