Version 2.15.0-37.0.dev

Merge commit 'f4ca1ed08b05ef3d1af72ecf28b3a7e41ce20b86' into 'dev'
diff --git a/pkg/compiler/pubspec.yaml b/pkg/compiler/pubspec.yaml
index dbdaec6..6e63cb6 100644
--- a/pkg/compiler/pubspec.yaml
+++ b/pkg/compiler/pubspec.yaml
@@ -12,7 +12,8 @@
   # Published packages - repo version ensured via dependency_overrides
   collection: any
   crypto: any
-  dart2js_info: any
+  dart2js_info:
+    path: ../dart2js_info
   front_end:
     path: ../front_end
   kernel:
@@ -56,8 +57,14 @@
 
 dependency_overrides:
   # Packages with source in the SDK
+  _fe_analyzer_shared:
+    path: ../_fe_analyzer_shared
+  analyzer:
+    path: ../analyzer
   front_end:
     path: ../front_end
+  js:
+    path: ../js
   kernel:
     path: ../kernel
   meta:
@@ -91,9 +98,7 @@
   path:
     path: ../../third_party/pkg/path
   protobuf:
-    path: ../../third_party/pkg/protobuf
-  quiver:
-    path: ../../third_party/pkg/quiver
+    path: ../../third_party/pkg/protobuf/protobuf
   shelf:
     path: ../../third_party/pkg/shelf
   shelf_static:
@@ -106,6 +111,10 @@
     path: ../../third_party/pkg/stream_channel
   string_scanner:
     path: ../../third_party/pkg/string_scanner
+  test:
+    path: ../../third_party/pkg/test/pkgs/test
+  test_api:
+    path: ../../third_party/pkg/test/pkgs/test_api
   typed_data:
     path: ../../third_party/pkg/typed_data
   yaml:
diff --git a/pkg/front_end/test/utils/io_utils.dart b/pkg/front_end/test/utils/io_utils.dart
index 6c22a65..8851f27 100644
--- a/pkg/front_end/test/utils/io_utils.dart
+++ b/pkg/front_end/test/utils/io_utils.dart
@@ -4,11 +4,28 @@
 
 import 'dart:io' show Directory, File, Platform, Process, ProcessResult;
 
+import 'package:_fe_analyzer_shared/src/util/filenames.dart';
+
 String computeRepoDir() {
+  Uri uri;
+  if (Platform.script.hasAbsolutePath) {
+    uri = Platform.script;
+  } else if (Platform.packageConfig != null) {
+    String packageConfig = Platform.packageConfig!;
+    final String prefix = "file://";
+    if (packageConfig.startsWith(prefix)) {
+      uri = Uri.parse(packageConfig);
+    } else {
+      uri = Uri.base.resolve(nativeToUriPath(packageConfig));
+    }
+  } else {
+    throw "Can't obtain the path to the SDK either via "
+        "Platform.script or Platform.packageConfig";
+  }
+  String path = new File.fromUri(uri).parent.path;
   ProcessResult result = Process.runSync(
       'git', ['rev-parse', '--show-toplevel'],
-      runInShell: true,
-      workingDirectory: new File.fromUri(Platform.script).parent.path);
+      runInShell: true, workingDirectory: path);
   if (result.exitCode != 0) {
     throw "Git returned non-zero error code (${result.exitCode}):\n\n"
         "stdout: ${result.stdout}\n\n"
diff --git a/runtime/vm/compiler/backend/il.cc b/runtime/vm/compiler/backend/il.cc
index 333b6e6..1a6db80 100644
--- a/runtime/vm/compiler/backend/il.cc
+++ b/runtime/vm/compiler/backend/il.cc
@@ -231,6 +231,7 @@
                              thread()->isolate_group()->program_lock());
     finder.ScanImplementorClasses(dst_klass);
   }
+  if (cids.is_empty()) return;
 
   // Sort all collected cids.
   intptr_t* cids_array = cids.data();
diff --git a/runtime/vm/heap/scavenger.cc b/runtime/vm/heap/scavenger.cc
index cfb05b7..cf52ef4 100644
--- a/runtime/vm/heap/scavenger.cc
+++ b/runtime/vm/heap/scavenger.cc
@@ -291,7 +291,7 @@
     if (!obj->IsNewObject() || visiting_old_object_->untag()->IsRemembered()) {
       return;
     }
-    visiting_old_object_->untag()->SetRememberedBitUnsynchronized();
+    visiting_old_object_->untag()->SetRememberedBit();
     thread_->StoreBufferAddObjectGC(visiting_old_object_);
   }
 
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 5680c3a..f99afbe 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -317,14 +317,10 @@
     ASSERT(IsOldObject());
     return !tags_.Read<OldAndNotRememberedBit>();
   }
-  bool TryAcquireRememberedBit() {
-    ASSERT(!IsCardRemembered());
-    return tags_.TryClear<OldAndNotRememberedBit>();
-  }
-  void SetRememberedBitUnsynchronized() {
+  void SetRememberedBit() {
     ASSERT(!IsRemembered());
     ASSERT(!IsCardRemembered());
-    tags_.UpdateUnsynchronized<OldAndNotRememberedBit>(false);
+    tags_.UpdateBool<OldAndNotRememberedBit>(false);
   }
   void ClearRememberedBit() {
     ASSERT(IsOldObject());
@@ -332,10 +328,10 @@
   }
 
   DART_FORCE_INLINE
-  void EnsureInRememberedSet(Thread* thread) {
-    if (TryAcquireRememberedBit()) {
-      thread->StoreBufferAddObject(ObjectPtr(this));
-    }
+  void AddToRememberedSet(Thread* thread) {
+    ASSERT(!this->IsRemembered());
+    this->SetRememberedBit();
+    thread->StoreBufferAddObject(ObjectPtr(this));
   }
 
   bool IsCardRemembered() const { return tags_.Read<CardRememberedBit>(); }
@@ -669,7 +665,7 @@
       if (value->IsNewObject()) {
         // Generational barrier: record when a store creates an
         // old-and-not-remembered -> new reference.
-        EnsureInRememberedSet(thread);
+        AddToRememberedSet(thread);
       } else {
         // Incremental barrier: record when a store creates an
         // old -> old-and-not-marked reference.
@@ -699,9 +695,11 @@
       if (value->IsNewObject()) {
         // Generational barrier: record when a store creates an
         // old-and-not-remembered -> new reference.
+        ASSERT(!this->IsRemembered());
         if (this->IsCardRemembered()) {
           RememberCard(addr);
-        } else if (this->TryAcquireRememberedBit()) {
+        } else {
+          this->SetRememberedBit();
           thread->StoreBufferAddObject(static_cast<ObjectPtr>(this));
         }
       } else {
diff --git a/runtime/vm/runtime_entry.cc b/runtime/vm/runtime_entry.cc
index d6c3ad6..a545c0e 100644
--- a/runtime/vm/runtime_entry.cc
+++ b/runtime/vm/runtime_entry.cc
@@ -483,7 +483,7 @@
   }
 
   if (add_to_remembered_set) {
-    object->untag()->EnsureInRememberedSet(thread);
+    object->untag()->AddToRememberedSet(thread);
   }
 
   // For incremental write barrier elimination, we need to ensure that the
diff --git a/runtime/vm/thread.cc b/runtime/vm/thread.cc
index a9e319e..09a3b25 100644
--- a/runtime/vm/thread.cc
+++ b/runtime/vm/thread.cc
@@ -688,7 +688,9 @@
 
       switch (op_) {
         case Thread::RestoreWriteBarrierInvariantOp::kAddToRememberedSet:
-          obj->untag()->EnsureInRememberedSet(current_);
+          if (!obj->untag()->IsRemembered()) {
+            obj->untag()->AddToRememberedSet(current_);
+          }
           if (current_->is_marking()) {
             current_->DeferredMarkingStackAddObject(obj);
           }
diff --git a/tools/VERSION b/tools/VERSION
index f951325..445bc0f 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 15
 PATCH 0
-PRERELEASE 36
+PRERELEASE 37
 PRERELEASE_PATCH 0
\ No newline at end of file
diff --git a/tools/bots/test_matrix.json b/tools/bots/test_matrix.json
index 9e2fefe..5d0abed 100644
--- a/tools/bots/test_matrix.json
+++ b/tools/bots/test_matrix.json
@@ -3473,6 +3473,13 @@
       },
       "steps": [
         {
+          "name": "validate pkg/ pubspec files",
+          "script": "tools/sdks/dart-sdk/bin/dart",
+          "arguments": [
+            "tools/package_deps/bin/package_deps.dart"
+          ]
+        },
+        {
           "name": "validate .dart_tool/package_config.json",
           "script": "tools/sdks/dart-sdk/bin/dart",
           "arguments": [