[vm] Object store lazy init for `dart:ffi`

In a follow up CL, we lookup members in `dart:ffi` lazily.

Also removes ffi member from store that was never used.

Split off https://dart-review.googlesource.com/c/sdk/+/229544 to make
that CL smaller.

TEST=SDK build

Bug: https://github.com/dart-lang/sdk/issues/47777

Change-Id: I2eed23b57ff92217bfae8fabfc84cf75cb62f313
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/234942
Reviewed-by: Aske Simon Christensen <askesc@google.com>
Commit-Queue: Daco Harkes <dacoharkes@google.com>
diff --git a/runtime/vm/app_snapshot.cc b/runtime/vm/app_snapshot.cc
index 1a5a835..f694613b 100644
--- a/runtime/vm/app_snapshot.cc
+++ b/runtime/vm/app_snapshot.cc
@@ -5759,6 +5759,7 @@
                             DECLARE_OBJECT_STORE_FIELD,
                             DECLARE_OBJECT_STORE_FIELD,
                             DECLARE_OBJECT_STORE_FIELD,
+                            DECLARE_OBJECT_STORE_FIELD,
                             DECLARE_OBJECT_STORE_FIELD)
 #undef DECLARE_OBJECT_STORE_FIELD
 };
diff --git a/runtime/vm/object_store.cc b/runtime/vm/object_store.cc
index 81c5977..23f9b4d 100644
--- a/runtime/vm/object_store.cc
+++ b/runtime/vm/object_store.cc
@@ -105,6 +105,7 @@
                               EMIT_FIELD_INIT,
                               EMIT_FIELD_INIT,
                               EMIT_FIELD_INIT,
+                              EMIT_FIELD_INIT,
                               EMIT_FIELD_INIT)
 #undef EMIT_FIELD_INIT
       // Just to prevent a trailing comma.
@@ -140,7 +141,8 @@
 #define EMIT_FIELD_NAME(type, name) #name "_",
         OBJECT_STORE_FIELD_LIST(
             EMIT_FIELD_NAME, EMIT_FIELD_NAME, EMIT_FIELD_NAME, EMIT_FIELD_NAME,
-            EMIT_FIELD_NAME, EMIT_FIELD_NAME, EMIT_FIELD_NAME, EMIT_FIELD_NAME)
+            EMIT_FIELD_NAME, EMIT_FIELD_NAME, EMIT_FIELD_NAME, EMIT_FIELD_NAME,
+            EMIT_FIELD_NAME)
 #undef EMIT_FIELD_NAME
     };
     ObjectPtr* current = from();
@@ -461,6 +463,13 @@
   }
 }
 
+void ObjectStore::LazyInitFfiMembers() {
+  auto* const thread = Thread::Current();
+  SafepointWriteRwLocker locker(thread,
+                                thread->isolate_group()->program_lock());
+  // TODO(http://dartbug.com/47777): Implement finalizers.
+}
+
 void ObjectStore::LazyInitIsolateMembers() {
   auto* const thread = Thread::Current();
   SafepointWriteRwLocker locker(thread,
diff --git a/runtime/vm/object_store.h b/runtime/vm/object_store.h
index 88d7a2e..f86b8c5 100644
--- a/runtime/vm/object_store.h
+++ b/runtime/vm/object_store.h
@@ -43,7 +43,8 @@
 // LAZY_ISOLATE - needs lazy init getter for a "dart:isolate" member
 // LAZY_INTERNAL - needs lazy init getter for a "dart:_internal" member
 #define OBJECT_STORE_FIELD_LIST(R_, RW, ARW_RELAXED, ARW_AR, LAZY_CORE,        \
-                                LAZY_ASYNC, LAZY_ISOLATE, LAZY_INTERNAL)       \
+                                LAZY_ASYNC, LAZY_ISOLATE, LAZY_INTERNAL,       \
+                                LAZY_FFI)                                      \
   LAZY_CORE(Class, list_class)                                                 \
   LAZY_CORE(Type, non_nullable_list_rare_type)                                 \
   LAZY_CORE(Type, non_nullable_map_rare_type)                                  \
@@ -239,7 +240,6 @@
   RW(GrowableObjectArray, ffi_callback_functions)                              \
   RW(Class, ffi_pointer_class)                                                 \
   RW(Class, ffi_native_type_class)                                             \
-  RW(Object, ffi_as_function_internal)                                         \
   // Please remember the last entry must be referred in the 'to' function below.
 
 #define OBJECT_STORE_STUB_CODE_LIST(DO)                                        \
@@ -426,6 +426,8 @@
   DECLARE_LAZY_INIT_GETTER(Type, name, LazyInitIsolateMembers)
 #define DECLARE_LAZY_INIT_INTERNAL_GETTER(Type, name)                          \
   DECLARE_LAZY_INIT_GETTER(Type, name, LazyInitInternalMembers)
+#define DECLARE_LAZY_INIT_FFI_GETTER(Type, name)                               \
+  DECLARE_LAZY_INIT_GETTER(Type, name, LazyInitFfiMembers)
   OBJECT_STORE_FIELD_LIST(DECLARE_GETTER,
                           DECLARE_GETTER_AND_SETTER,
                           DECLARE_RELAXED_ATOMIC_GETTER_AND_SETTER,
@@ -433,7 +435,8 @@
                           DECLARE_LAZY_INIT_CORE_GETTER,
                           DECLARE_LAZY_INIT_ASYNC_GETTER,
                           DECLARE_LAZY_INIT_ISOLATE_GETTER,
-                          DECLARE_LAZY_INIT_INTERNAL_GETTER)
+                          DECLARE_LAZY_INIT_INTERNAL_GETTER,
+                          DECLARE_LAZY_INIT_FFI_GETTER)
 #undef DECLARE_OFFSET
 #undef DECLARE_GETTER
 #undef DECLARE_GETTER_AND_SETTER
@@ -493,6 +496,7 @@
  private:
   void LazyInitCoreMembers();
   void LazyInitAsyncMembers();
+  void LazyInitFfiMembers();
   void LazyInitIsolateMembers();
   void LazyInitInternalMembers();
 
@@ -512,12 +516,13 @@
                           DECLARE_LAZY_OBJECT_STORE_FIELD,
                           DECLARE_LAZY_OBJECT_STORE_FIELD,
                           DECLARE_LAZY_OBJECT_STORE_FIELD,
+                          DECLARE_LAZY_OBJECT_STORE_FIELD,
                           DECLARE_LAZY_OBJECT_STORE_FIELD)
 #undef DECLARE_OBJECT_STORE_FIELD
 #undef DECLARE_ATOMIC_OBJECT_STORE_FIELD
 #undef DECLARE_LAZY_OBJECT_STORE_FIELD
   ObjectPtr* to() {
-    return reinterpret_cast<ObjectPtr*>(&ffi_as_function_internal_);
+    return reinterpret_cast<ObjectPtr*>(&ffi_native_type_class_);
   }
   ObjectPtr* to_snapshot(Snapshot::Kind kind) {
     switch (kind) {