diff --git a/dm/DM.cpp b/dm/DM.cpp
index d86db82..0ee436c 100644
--- a/dm/DM.cpp
+++ b/dm/DM.cpp
@@ -1269,9 +1269,9 @@
             continue;
         }
         if (test.needsGpu && FLAGS_gpu) {
-            (FLAGS_gpu_threading ? gParallelTests : gSerialTests).push(test);
+            (FLAGS_gpu_threading ? gParallelTests : gSerialTests).push_back(test);
         } else if (!test.needsGpu && FLAGS_cpu) {
-            gParallelTests.push(test);
+            gParallelTests.push_back(test);
         }
     }
 }
diff --git a/experimental/svg/model/SkSVGAttributeParser.cpp b/experimental/svg/model/SkSVGAttributeParser.cpp
index dc328a1..d60ffd8 100644
--- a/experimental/svg/model/SkSVGAttributeParser.cpp
+++ b/experimental/svg/model/SkSVGAttributeParser.cpp
@@ -559,7 +559,7 @@
             break;
         }
 
-        pts.push(SkPoint::Make(x, y));
+        pts.push_back(SkPoint::Make(x, y));
         parsedValue = true;
     }
 
@@ -636,7 +636,7 @@
                 break;
             }
 
-            dashes.push(dash);
+            dashes.push_back(dash);
             parsedValue = true;
         }
 
diff --git a/include/private/SkMessageBus.h b/include/private/SkMessageBus.h
index 9fe060d..01145ec 100644
--- a/include/private/SkMessageBus.h
+++ b/include/private/SkMessageBus.h
@@ -70,7 +70,7 @@
     // Register ourselves with the corresponding message bus.
     SkMessageBus<Message>* bus = SkMessageBus<Message>::Get();
     SkAutoMutexAcquire lock(bus->fInboxesMutex);
-    bus->fInboxes.push(this);
+    bus->fInboxes.push_back(this);
 }
 
 template<typename Message>
diff --git a/include/private/SkTDArray.h b/include/private/SkTDArray.h
index c6bd4ff..c48da42 100644
--- a/include/private/SkTDArray.h
+++ b/include/private/SkTDArray.h
@@ -13,6 +13,7 @@
 #include "SkTo.h"
 #include "SkTypes.h"
 
+#include <initializer_list>
 #include <utility>
 
 template <typename T> class SkTDArray {
@@ -29,6 +30,7 @@
             fReserve = fCount = count;
         }
     }
+    SkTDArray(const std::initializer_list<T>& list) : SkTDArray(list.begin(), list.size()) {}
     SkTDArray(const SkTDArray<T>& src) : fArray(nullptr), fReserve(0), fCount(0) {
         SkTDArray<T> tmp(src.fArray, src.fCount);
         this->swap(tmp);
@@ -77,11 +79,13 @@
     }
 
     bool isEmpty() const { return fCount == 0; }
+    bool empty() const { return this->isEmpty(); }
 
     /**
      *  Return the number of elements in the array
      */
     int count() const { return fCount; }
+    size_t size() const { return fCount; }
 
     /**
      *  Return the total number of elements allocated.
@@ -95,10 +99,12 @@
      */
     size_t bytes() const { return fCount * sizeof(T); }
 
-    T*  begin() { return fArray; }
+    T*        begin() { return fArray; }
     const T*  begin() const { return fArray; }
-    T*  end() { return fArray ? fArray + fCount : nullptr; }
+    const T* cbegin() const { return fArray; }
+    T*        end() { return fArray ? fArray + fCount : nullptr; }
     const T*  end() const { return fArray ? fArray + fCount : nullptr; }
+    const T* cend() const { return fArray ? fArray + fCount : nullptr; }
 
     T&  operator[](int index) {
         SkASSERT(index < fCount);
@@ -151,6 +157,10 @@
             this->resizeStorageToAtLeast(reserve);
         }
     }
+    void reserve(size_t n) {
+        SkASSERT_RELEASE(SkTFitsIn<int>(n));
+        this->setReserve(SkToInt(n));
+    }
 
     T* prepend() {
         this->adjustCount(1);
@@ -263,13 +273,16 @@
     }
 
     // routines to treat the array like a stack
-    T*       push() { return this->append(); }
-    void     push(const T& elem) { *this->append() = elem; }
+    void push_back(const T& v) { *this->append() = v; }
+    T*      push() { return this->append(); }
     const T& top() const { return (*this)[fCount - 1]; }
     T&       top() { return (*this)[fCount - 1]; }
     void     pop(T* elem) { SkASSERT(fCount > 0); if (elem) *elem = (*this)[fCount - 1]; --fCount; }
     void     pop() { SkASSERT(fCount > 0); --fCount; }
 
+    // DEPRECATED -- update call-sites to remove
+    void push(const T& v) { this->push_back(v); }
+
     void deleteAll() {
         T*  iter = fArray;
         T*  stop = fArray + fCount;
diff --git a/modules/sksg/src/SkSGInvalidationController.cpp b/modules/sksg/src/SkSGInvalidationController.cpp
index 81a3376..df711ab 100644
--- a/modules/sksg/src/SkSGInvalidationController.cpp
+++ b/modules/sksg/src/SkSGInvalidationController.cpp
@@ -25,7 +25,7 @@
         ctm.mapRect(rect.writable());
     }
 
-    fRects.push(*rect);
+    fRects.push_back(*rect);
     fBounds.join(*rect);
 }
 
diff --git a/modules/sksg/src/SkSGNode.cpp b/modules/sksg/src/SkSGNode.cpp
index 35b2640..0cb578e 100644
--- a/modules/sksg/src/SkSGNode.cpp
+++ b/modules/sksg/src/SkSGNode.cpp
@@ -63,7 +63,7 @@
 
         auto observers = new SkTDArray<Node*>();
         observers->setReserve(2);
-        observers->push(node->fInvalObserver);
+        observers->push_back(node->fInvalObserver);
 
         node->fInvalObserverArray = observers;
         node->fFlags |= kObserverArray_Flag;
@@ -72,7 +72,7 @@
     // No duplicate observers.
     SkASSERT(node->fInvalObserverArray->find(this) < 0);
 
-    node->fInvalObserverArray->push(this);
+    node->fInvalObserverArray->push_back(this);
 }
 
 void Node::unobserveInval(const sk_sp<Node>& node) {
diff --git a/src/core/SkEdgeBuilder.cpp b/src/core/SkEdgeBuilder.cpp
index 48c1bca..17d84ef 100644
--- a/src/core/SkEdgeBuilder.cpp
+++ b/src/core/SkEdgeBuilder.cpp
@@ -127,7 +127,7 @@
     if (fEdgeType == kBezier) {
         SkLine* line = fAlloc.make<SkLine>();
         if (line->set(pts)) {
-            fList.push(line);
+            fList.push_back(line);
         }
     } else if (fEdgeType == kAnalyticEdge) {
         SkAnalyticEdge* edge = fAlloc.make<SkAnalyticEdge>();
@@ -141,7 +141,7 @@
                     goto unallocate_analytic_edge;
                 }
             }
-            fList.push(edge);
+            fList.push_back(edge);
         } else {
 unallocate_analytic_edge:
             ;
@@ -159,7 +159,7 @@
                     goto unallocate_edge;
                 }
             }
-            fList.push(edge);
+            fList.push_back(edge);
         } else {
 unallocate_edge:
             ;
@@ -172,19 +172,19 @@
     if (fEdgeType == kBezier) {
         SkQuad* quad = fAlloc.make<SkQuad>();
         if (quad->set(pts)) {
-            fList.push(quad);
+            fList.push_back(quad);
         }
     } else if (fEdgeType == kAnalyticEdge) {
         SkAnalyticQuadraticEdge* edge = fAlloc.make<SkAnalyticQuadraticEdge>();
         if (edge->setQuadratic(pts)) {
-            fList.push(edge);
+            fList.push_back(edge);
         } else {
             // TODO: unallocate edge from storage...
         }
     } else {
         SkQuadraticEdge* edge = fAlloc.make<SkQuadraticEdge>();
         if (edge->setQuadratic(pts, fShiftUp)) {
-            fList.push(edge);
+            fList.push_back(edge);
         } else {
             // TODO: unallocate edge from storage...
         }
@@ -195,19 +195,19 @@
     if (fEdgeType == kBezier) {
         SkCubic* cubic = fAlloc.make<SkCubic>();
         if (cubic->set(pts)) {
-            fList.push(cubic);
+            fList.push_back(cubic);
         }
     } else if (fEdgeType == kAnalyticEdge) {
         SkAnalyticCubicEdge* edge = fAlloc.make<SkAnalyticCubicEdge>();
         if (edge->setCubic(pts)) {
-            fList.push(edge);
+            fList.push_back(edge);
         } else {
             // TODO: unallocate edge from storage...
         }
     } else {
         SkCubicEdge* edge = fAlloc.make<SkCubicEdge>();
         if (edge->setCubic(pts, fShiftUp)) {
-            fList.push(edge);
+            fList.push_back(edge);
         } else {
             // TODO: unallocate edge from storage...
         }
diff --git a/src/core/SkPath.cpp b/src/core/SkPath.cpp
index 99ac492..05d2ca8 100644
--- a/src/core/SkPath.cpp
+++ b/src/core/SkPath.cpp
@@ -3077,7 +3077,7 @@
         }
         SkVector tangent;
         SkEvalCubicAt(c, t, nullptr, &tangent, nullptr);
-        tangents->push(tangent);
+        tangents->push_back(tangent);
     }
 }
 
@@ -3104,7 +3104,7 @@
             continue;
         }
         SkConic conic(pts, w);
-        tangents->push(conic.evalTangentAt(t));
+        tangents->push_back(conic.evalTangentAt(t));
     }
 }
 
@@ -3130,7 +3130,7 @@
         if (!SkScalarNearlyEqual(x, xt)) {
             continue;
         }
-        tangents->push(SkEvalQuadTangentAt(pts, t));
+        tangents->push_back(SkEvalQuadTangentAt(pts, t));
     }
 }
 
@@ -3153,7 +3153,7 @@
     }
     SkVector v;
     v.set(dx, dy);
-    tangents->push(v);
+    tangents->push_back(v);
 }
 
 static bool contains_inclusive(const SkRect& r, SkScalar x, SkScalar y) {
diff --git a/src/core/SkPictureRecord.cpp b/src/core/SkPictureRecord.cpp
index 922fb6a..ca36e7e 100644
--- a/src/core/SkPictureRecord.cpp
+++ b/src/core/SkPictureRecord.cpp
@@ -47,7 +47,7 @@
 void SkPictureRecord::willSave() {
     // record the offset to us, making it non-positive to distinguish a save
     // from a clip entry.
-    fRestoreOffsetStack.push(-(int32_t)fWriter.bytesWritten());
+    fRestoreOffsetStack.push_back(-(int32_t)fWriter.bytesWritten());
     this->recordSave();
 
     this->INHERITED::willSave();
@@ -64,7 +64,7 @@
 SkCanvas::SaveLayerStrategy SkPictureRecord::getSaveLayerStrategy(const SaveLayerRec& rec) {
     // record the offset to us, making it non-positive to distinguish a save
     // from a clip entry.
-    fRestoreOffsetStack.push(-(int32_t)fWriter.bytesWritten());
+    fRestoreOffsetStack.push_back(-(int32_t)fWriter.bytesWritten());
     this->recordSaveLayer(rec);
 
     (void)this->INHERITED::getSaveLayerStrategy(rec);
diff --git a/src/core/SkRTree.cpp b/src/core/SkRTree.cpp
index 4d1787e..8d9239c 100644
--- a/src/core/SkRTree.cpp
+++ b/src/core/SkRTree.cpp
@@ -172,7 +172,7 @@
     for (int i = 0; i < node->fNumChildren; ++i) {
         if (SkRect::Intersects(node->fChildren[i].fBounds, query)) {
             if (0 == node->fLevel) {
-                results->push(node->fChildren[i].fOpIndex);
+                results->push_back(node->fChildren[i].fOpIndex);
             } else {
                 this->search(node->fChildren[i].fSubtree, query, results);
             }
diff --git a/src/core/SkRecordDraw.cpp b/src/core/SkRecordDraw.cpp
index 9c58456..e42ff29 100644
--- a/src/core/SkRecordDraw.cpp
+++ b/src/core/SkRecordDraw.cpp
@@ -169,7 +169,7 @@
         fCTM = SkMatrix::I();
 
         // We push an extra save block to track the bounds of any top-level control operations.
-        fSaveStack.push({ 0, Bounds::MakeEmpty(), nullptr, fCTM });
+        fSaveStack.push_back({ 0, Bounds::MakeEmpty(), nullptr, fCTM });
     }
 
     void cleanUp() {
@@ -275,7 +275,7 @@
         sb.paint = paint;
         sb.ctm = this->fCTM;
 
-        fSaveStack.push(sb);
+        fSaveStack.push_back(sb);
         this->pushControl();
     }
 
@@ -329,7 +329,7 @@
     }
 
     void pushControl() {
-        fControlIndices.push(fCurrentOp);
+        fControlIndices.push_back(fCurrentOp);
         if (!fSaveStack.isEmpty()) {
             fSaveStack.top().controlOps++;
         }
diff --git a/src/gpu/ops/GrAAConvexTessellator.cpp b/src/gpu/ops/GrAAConvexTessellator.cpp
index 72df654..e08a354 100644
--- a/src/gpu/ops/GrAAConvexTessellator.cpp
+++ b/src/gpu/ops/GrAAConvexTessellator.cpp
@@ -451,10 +451,10 @@
             SkASSERT(SkScalarNearlyEqual(1.0f, fNorms[cur].length()));
         }
 
-        fNorms.push(SkPoint::Make(-fNorms[0].fX, -fNorms[0].fY));
+        fNorms.push_back(SkPoint::Make(-fNorms[0].fX, -fNorms[0].fY));
         // we won't actually use the bisectors, so just push zeroes
-        fBisectors.push(SkPoint::Make(0.0, 0.0));
-        fBisectors.push(SkPoint::Make(0.0, 0.0));
+        fBisectors.push_back(SkPoint::Make(0.0, 0.0));
+        fBisectors.push_back(SkPoint::Make(0.0, 0.0));
     } else {
         return false;
     }
diff --git a/src/gpu/vk/GrVkPipelineState.cpp b/src/gpu/vk/GrVkPipelineState.cpp
index 011db9d..cd59eab 100644
--- a/src/gpu/vk/GrVkPipelineState.cpp
+++ b/src/gpu/vk/GrVkPipelineState.cpp
@@ -308,16 +308,16 @@
         const GrSamplerState& state = bindings[i].fState;
         GrVkTexture* texture = bindings[i].fTexture;
 
-        fSamplers.push(gpu->resourceProvider().findOrCreateCompatibleSampler(
+        fSamplers.push_back(gpu->resourceProvider().findOrCreateCompatibleSampler(
                 state, texture->texturePriv().maxMipMapLevel()));
 
         const GrVkResource* textureResource = texture->resource();
         textureResource->ref();
-        fTextures.push(textureResource);
+        fTextures.push_back(textureResource);
 
         const GrVkImageView* textureView = texture->textureView();
         textureView->ref();
-        fTextureViews.push(textureView);
+        fTextureViews.push_back(textureView);
 
         VkDescriptorImageInfo imageInfo;
         memset(&imageInfo, 0, sizeof(VkDescriptorImageInfo));
diff --git a/src/pathops/SkPathWriter.cpp b/src/pathops/SkPathWriter.cpp
index 9548c3b4f..797f42f 100644
--- a/src/pathops/SkPathWriter.cpp
+++ b/src/pathops/SkPathWriter.cpp
@@ -97,8 +97,8 @@
         this->close();
     } else {
         SkASSERT(fDefer[1]);
-        fEndPtTs.push(fFirstPtT);
-        fEndPtTs.push(fDefer[1]);
+        fEndPtTs.push_back(fFirstPtT);
+        fEndPtTs.push_back(fDefer[1]);
         fPartials.push_back(fCurrent);
         this->init();
     }
diff --git a/src/pdf/SkPDFDevice.cpp b/src/pdf/SkPDFDevice.cpp
index fc7384f..43ee5f6 100644
--- a/src/pdf/SkPDFDevice.cpp
+++ b/src/pdf/SkPDFDevice.cpp
@@ -1464,7 +1464,7 @@
     SkTDArray<SkPDFObject*> fonts;
     fonts.setReserve(fFontResources.count());
     for (SkPDFFont* font : fFontResources) {
-        fonts.push(font);
+        fonts.push_back(font);
     }
     return SkPDFResourceDict::Make(
             &fGraphicStateResources,
@@ -1900,7 +1900,7 @@
                 int resourceIndex = fShaderResources.find(pdfShader.get());
                 if (resourceIndex < 0) {
                     resourceIndex = fShaderResources.count();
-                    fShaderResources.push(pdfShader.get());
+                    fShaderResources.push_back(pdfShader.get());
                     pdfShader.get()->ref();
                 }
                 entry->fShaderIndex = resourceIndex;
@@ -1933,7 +1933,7 @@
     int result = fGraphicStateResources.find(gs);
     if (result < 0) {
         result = fGraphicStateResources.count();
-        fGraphicStateResources.push(gs);
+        fGraphicStateResources.push_back(gs);
         gs->ref();
     }
     return result;
@@ -1946,7 +1946,7 @@
     int result = fXObjectResources.find(xObject);
     if (result < 0) {
         result = fXObjectResources.count();
-        fXObjectResources.push(SkRef(xObject));
+        fXObjectResources.push_back(SkRef(xObject));
     }
     return result;
 }
@@ -1960,7 +1960,7 @@
     if (resourceIndex < 0) {
         fDocument->registerFont(newFont.get());
         resourceIndex = fFontResources.count();
-        fFontResources.push(newFont.release());
+        fFontResources.push_back(newFont.release());
     }
     return resourceIndex;
 }
diff --git a/src/pdf/SkPDFDocument.cpp b/src/pdf/SkPDFDocument.cpp
index 7d91454..ace2f45 100644
--- a/src/pdf/SkPDFDocument.cpp
+++ b/src/pdf/SkPDFDocument.cpp
@@ -61,7 +61,7 @@
         // always free and has a generation number of 65,535; it is
         // the head of the linked list of free objects."
         SkASSERT(fOffsets.count() == fNextToBeSerialized);
-        fOffsets.push(this->offset(wStream));
+        fOffsets.push_back(this->offset(wStream));
         wStream->writeDecAsText(index);
         wStream->writeText(" 0 obj\n");  // Generation number is always 0.
         object->emitObject(wStream, fObjNumMap);
diff --git a/src/pdf/SkPDFFont.cpp b/src/pdf/SkPDFFont.cpp
index e997650..c25d724 100644
--- a/src/pdf/SkPDFFont.cpp
+++ b/src/pdf/SkPDFFont.cpp
@@ -351,7 +351,7 @@
     // TODO(halcanary): sfntly should take a more compact format.
     SkTDArray<unsigned> subset;
     if (!glyphUsage.has(0)) {
-        subset.push(0);  // Always include glyph 0.
+        subset.push_back(0);  // Always include glyph 0.
     }
     glyphUsage.exportTo(&subset);
 
diff --git a/src/pdf/SkPDFGradientShader.cpp b/src/pdf/SkPDFGradientShader.cpp
index dc11d64..1336938 100644
--- a/src/pdf/SkPDFGradientShader.cpp
+++ b/src/pdf/SkPDFGradientShader.cpp
@@ -791,11 +791,11 @@
                                                    SkPDFObject* gState) {
     SkTDArray<SkPDFObject*> patterns;
     if (functionShader) {
-        patterns.push(functionShader);
+        patterns.push_back(functionShader);
     }
     SkTDArray<SkPDFObject*> graphicStates;
     if (gState) {
-        graphicStates.push(gState);
+        graphicStates.push_back(gState);
     }
     return SkPDFResourceDict::Make(&graphicStates, &patterns, nullptr, nullptr);
 }
diff --git a/src/pdf/SkPDFMakeToUnicodeCmap.cpp b/src/pdf/SkPDFMakeToUnicodeCmap.cpp
index 4f383e1..7fd2931 100644
--- a/src/pdf/SkPDFMakeToUnicodeCmap.cpp
+++ b/src/pdf/SkPDFMakeToUnicodeCmap.cpp
@@ -182,7 +182,7 @@
                     currentRangeEntry.fUnicode + i - currentRangeEntry.fStart;
             if (!inSubset || !inRange) {
                 if (currentRangeEntry.fEnd > currentRangeEntry.fStart) {
-                    bfrangeEntries.push(currentRangeEntry);
+                    bfrangeEntries.push_back(currentRangeEntry);
                 } else {
                     BFChar* entry = bfcharEntries.append();
                     entry->fGlyphId = currentRangeEntry.fStart;
diff --git a/src/ports/SkFontMgr_android_parser.cpp b/src/ports/SkFontMgr_android_parser.cpp
index 1269523..df58815 100644
--- a/src/ports/SkFontMgr_android_parser.cpp
+++ b/src/ports/SkFontMgr_android_parser.cpp
@@ -556,7 +556,7 @@
             if (child->start) {
                 child->start(self, tag, attributes);
             }
-            self->fHandler.push(child);
+            self->fHandler.push_back(child);
             XML_SetCharacterDataHandler(self->fParser, child->chars);
         } else {
             SK_FONTCONFIGPARSER_WARNING("'%s' tag not recognized, skipping", tag);
diff --git a/src/utils/SkBitSet.h b/src/utils/SkBitSet.h
index 98aa05f..755e63b 100644
--- a/src/utils/SkBitSet.h
+++ b/src/utils/SkBitSet.h
@@ -55,7 +55,7 @@
                 unsigned int index = i * 32;
                 for (unsigned int j = 0; j < 32; ++j) {
                     if (0x1 & (value >> j)) {
-                        array->push(index + j);
+                        array->push_back(index + j);
                     }
                 }
             }
diff --git a/tests/GpuRectanizerTest.cpp b/tests/GpuRectanizerTest.cpp
index 5b737fe..0035346 100644
--- a/tests/GpuRectanizerTest.cpp
+++ b/tests/GpuRectanizerTest.cpp
@@ -61,8 +61,8 @@
     SkRandom rand;
 
     for (int i = 0; i < 50; i++) {
-        rects.push(SkISize::Make(rand.nextRangeU(1, kWidth / 2),
-                                 rand.nextRangeU(1, kHeight / 2)));
+        rects.push_back(SkISize::Make(rand.nextRangeU(1, kWidth / 2),
+                                      rand.nextRangeU(1, kHeight / 2)));
     }
 
     test_skyline(reporter, rects);
diff --git a/tests/OnFlushCallbackTest.cpp b/tests/OnFlushCallbackTest.cpp
index f992e53..9eb2dca 100644
--- a/tests/OnFlushCallbackTest.cpp
+++ b/tests/OnFlushCallbackTest.cpp
@@ -281,7 +281,7 @@
         }
 
         if (!header) {
-            fOps.push({opListID, nullptr});
+            fOps.push_back({opListID, nullptr});
             header = &(fOps[fOps.count()-1]);
         }
 
@@ -334,7 +334,7 @@
         SkTDArray<LinkedListHeader*> lists;
         for (int i = 0; i < numOpListIDs; ++i) {
             if (LinkedListHeader* list = this->getList(opListIDs[i])) {
-                lists.push(list);
+                lists.push_back(list);
             }
         }
 
diff --git a/tests/PDFGlyphsToUnicodeTest.cpp b/tests/PDFGlyphsToUnicodeTest.cpp
index ab520eb..64eefbd 100644
--- a/tests/PDFGlyphsToUnicodeTest.cpp
+++ b/tests/PDFGlyphsToUnicodeTest.cpp
@@ -39,41 +39,41 @@
     SkTDArray<uint16_t> glyphsInSubset;
     SkBitSet subset(kMaximumGlyphCount);
 
-    glyphToUnicode.push(0);  // 0
-    glyphToUnicode.push(0);  // 1
-    glyphToUnicode.push(0);  // 2
-    glyphsInSubset.push(3);
-    glyphToUnicode.push(0x20);  // 3
-    glyphsInSubset.push(4);
-    glyphToUnicode.push(0x25);  // 4
-    glyphsInSubset.push(5);
-    glyphToUnicode.push(0x27);  // 5
-    glyphsInSubset.push(6);
-    glyphToUnicode.push(0x28);  // 6
-    glyphsInSubset.push(7);
-    glyphToUnicode.push(0x29);  // 7
-    glyphsInSubset.push(8);
-    glyphToUnicode.push(0x2F);  // 8
-    glyphsInSubset.push(9);
-    glyphToUnicode.push(0x33);  // 9
-    glyphToUnicode.push(0);  // 10
-    glyphsInSubset.push(11);
-    glyphToUnicode.push(0x35);  // 11
-    glyphsInSubset.push(12);
-    glyphToUnicode.push(0x36);  // 12
-    glyphsInSubset.push(13);
-    glyphToUnicode.push(0x37);  // 13
+    glyphToUnicode.push_back(0);  // 0
+    glyphToUnicode.push_back(0);  // 1
+    glyphToUnicode.push_back(0);  // 2
+    glyphsInSubset.push_back(3);
+    glyphToUnicode.push_back(0x20);  // 3
+    glyphsInSubset.push_back(4);
+    glyphToUnicode.push_back(0x25);  // 4
+    glyphsInSubset.push_back(5);
+    glyphToUnicode.push_back(0x27);  // 5
+    glyphsInSubset.push_back(6);
+    glyphToUnicode.push_back(0x28);  // 6
+    glyphsInSubset.push_back(7);
+    glyphToUnicode.push_back(0x29);  // 7
+    glyphsInSubset.push_back(8);
+    glyphToUnicode.push_back(0x2F);  // 8
+    glyphsInSubset.push_back(9);
+    glyphToUnicode.push_back(0x33);  // 9
+    glyphToUnicode.push_back(0);  // 10
+    glyphsInSubset.push_back(11);
+    glyphToUnicode.push_back(0x35);  // 11
+    glyphsInSubset.push_back(12);
+    glyphToUnicode.push_back(0x36);  // 12
+    glyphsInSubset.push_back(13);
+    glyphToUnicode.push_back(0x37);  // 13
     for (uint16_t i = 14; i < 0xFE; ++i) {
-        glyphToUnicode.push(0);  // Zero from index 0x9 to 0xFD
+        glyphToUnicode.push_back(0);  // Zero from index 0x9 to 0xFD
     }
-    glyphsInSubset.push(0xFE);
-    glyphToUnicode.push(0x1010);
-    glyphsInSubset.push(0xFF);
-    glyphToUnicode.push(0x1011);
-    glyphsInSubset.push(0x100);
-    glyphToUnicode.push(0x1012);
-    glyphsInSubset.push(0x101);
-    glyphToUnicode.push(0x1013);
+    glyphsInSubset.push_back(0xFE);
+    glyphToUnicode.push_back(0x1010);
+    glyphsInSubset.push_back(0xFF);
+    glyphToUnicode.push_back(0x1011);
+    glyphsInSubset.push_back(0x100);
+    glyphToUnicode.push_back(0x1012);
+    glyphsInSubset.push_back(0x101);
+    glyphToUnicode.push_back(0x1013);
 
     SkGlyphID lastGlyphID = SkToU16(glyphToUnicode.count() - 1);
 
@@ -160,16 +160,16 @@
     // Glyph id 2c 51 56 57 44 4f
     // Unicode  49 6e 73 74 61 6c
     for (SkUnichar i = 0; i < 100; ++i) {
-      glyphToUnicode.push(i + 29);
+      glyphToUnicode.push_back(i + 29);
     }
     lastGlyphID = SkToU16(glyphToUnicode.count() - 1);
 
-    glyphsInSubset.push(0x2C);
-    glyphsInSubset.push(0x44);
-    glyphsInSubset.push(0x4F);
-    glyphsInSubset.push(0x51);
-    glyphsInSubset.push(0x56);
-    glyphsInSubset.push(0x57);
+    glyphsInSubset.push_back(0x2C);
+    glyphsInSubset.push_back(0x44);
+    glyphsInSubset.push_back(0x4F);
+    glyphsInSubset.push_back(0x51);
+    glyphsInSubset.push_back(0x56);
+    glyphsInSubset.push_back(0x57);
 
     SkDynamicMemoryWStream buffer2;
     subset2.setAll(glyphsInSubset.begin(), glyphsInSubset.count());
diff --git a/tests/RTreeTest.cpp b/tests/RTreeTest.cpp
index b39af67..9b451d1 100644
--- a/tests/RTreeTest.cpp
+++ b/tests/RTreeTest.cpp
@@ -30,7 +30,7 @@
     // manually intersect with every rectangle
     for (int i = 0; i < NUM_RECTS; ++i) {
         if (SkRect::Intersects(query, rects[i])) {
-            expected.push(i);
+            expected.push_back(i);
         }
     }
 
diff --git a/tools/debugger/SkDebugCanvas.cpp b/tools/debugger/SkDebugCanvas.cpp
index 537bcb1..19b88e9 100644
--- a/tools/debugger/SkDebugCanvas.cpp
+++ b/tools/debugger/SkDebugCanvas.cpp
@@ -84,7 +84,7 @@
 }
 
 void SkDebugCanvas::addDrawCommand(SkDrawCommand* command) {
-    fCommandVector.push(command);
+    fCommandVector.push_back(command);
 }
 
 void SkDebugCanvas::draw(SkCanvas* canvas) {
diff --git a/tools/flags/SkCommandLineFlags.cpp b/tools/flags/SkCommandLineFlags.cpp
index 8e38c52..3924812 100644
--- a/tools/flags/SkCommandLineFlags.cpp
+++ b/tools/flags/SkCommandLineFlags.cpp
@@ -253,7 +253,7 @@
                 SkTDArray<SkFlagInfo*> allFlags;
                 for (SkFlagInfo* flag = SkCommandLineFlags::gHead; flag;
                      flag = flag->next()) {
-                    allFlags.push(flag);
+                    allFlags.push_back(flag);
                 }
                 SkTQSort(&allFlags[0], &allFlags[allFlags.count() - 1],
                          CompareFlagsByName());
diff --git a/tools/sk_app/Window.h b/tools/sk_app/Window.h
index 8a71f35..be4da9a 100644
--- a/tools/sk_app/Window.h
+++ b/tools/sk_app/Window.h
@@ -158,7 +158,7 @@
 
     void pushLayer(Layer* layer) {
         layer->onAttach(this);
-        fLayers.push(layer);
+        fLayers.push_back(layer);
     }
 
     void onBackendCreated();
diff --git a/tools/skdiff/skdiff_main.cpp b/tools/skdiff/skdiff_main.cpp
index 56aebe7..b4fdaad 100644
--- a/tools/skdiff/skdiff_main.cpp
+++ b/tools/skdiff/skdiff_main.cpp
@@ -183,14 +183,14 @@
         uint32_t mismatchValue;
 
         if (drp->fBase.fFilename.equals(drp->fComparison.fFilename)) {
-            fResultsOfType[drp->fResult].push(new SkString(drp->fBase.fFilename));
+            fResultsOfType[drp->fResult].push_back(new SkString(drp->fBase.fFilename));
         } else {
             SkString* blame = new SkString("(");
             blame->append(drp->fBase.fFilename);
             blame->append(", ");
             blame->append(drp->fComparison.fFilename);
             blame->append(")");
-            fResultsOfType[drp->fResult].push(blame);
+            fResultsOfType[drp->fResult].push_back(blame);
         }
         switch (drp->fResult) {
           case DiffRecord::kEqualBits_Result:
@@ -215,7 +215,7 @@
             break;
           case DiffRecord::kCouldNotCompare_Result:
             fNumMismatches++;
-            fStatusOfType[drp->fBase.fStatus][drp->fComparison.fStatus].push(
+            fStatusOfType[drp->fBase.fStatus][drp->fComparison.fStatus].push_back(
                     new SkString(drp->fBase.fFilename));
             break;
           case DiffRecord::kUnknown_Result:
@@ -274,7 +274,7 @@
         pathRelativeToRootDir.append(fileName);
         if (string_contains_any_of(pathRelativeToRootDir, matchSubstrings) &&
             !string_contains_any_of(pathRelativeToRootDir, nomatchSubstrings)) {
-            files->push(new SkString(pathRelativeToRootDir));
+            files->push_back(new SkString(pathRelativeToRootDir));
         }
     }
 
@@ -516,7 +516,7 @@
             get_bounds(*drp);
         }
         SkASSERT(DiffRecord::kUnknown_Result != drp->fResult);
-        differences->push(drp);
+        differences->push_back(drp);
         summary->add(drp);
     }
 
@@ -537,7 +537,7 @@
         if (getBounds) {
             get_bounds(*drp);
         }
-        differences->push(drp);
+        differences->push_back(drp);
         summary->add(drp);
     }
 
@@ -558,7 +558,7 @@
         if (getBounds) {
             get_bounds(*drp);
         }
-        differences->push(drp);
+        differences->push_back(drp);
         summary->add(drp);
     }
 
@@ -705,7 +705,7 @@
             continue;
         }
         if (!strcmp(argv[i], "--match")) {
-            matchSubstrings.push(new SkString(argv[++i]));
+            matchSubstrings.push_back(new SkString(argv[++i]));
             continue;
         }
         if (!strcmp(argv[i], "--nocolorspace")) {
@@ -717,7 +717,7 @@
             continue;
         }
         if (!strcmp(argv[i], "--nomatch")) {
-            nomatchSubstrings.push(new SkString(argv[++i]));
+            nomatchSubstrings.push_back(new SkString(argv[++i]));
             continue;
         }
         if (!strcmp(argv[i], "--noprintdirs")) {
@@ -809,7 +809,7 @@
     // If no matchSubstrings were specified, match ALL strings
     // (except for whatever nomatchSubstrings were specified, if any).
     if (matchSubstrings.isEmpty()) {
-        matchSubstrings.push(new SkString(""));
+        matchSubstrings.push_back(new SkString(""));
     }
 
     create_diff_images(diffProc, colorThreshold, ignoreColorSpace, &differences,
diff --git a/tools/viewer/ImGuiLayer.cpp b/tools/viewer/ImGuiLayer.cpp
index fe55a61..3ed94a0 100644
--- a/tools/viewer/ImGuiLayer.cpp
+++ b/tools/viewer/ImGuiLayer.cpp
@@ -124,9 +124,9 @@
         pos.rewind(); uv.rewind(); color.rewind();
         for (int i = 0; i < drawList->VtxBuffer.size(); ++i) {
             const ImDrawVert& vert = drawList->VtxBuffer[i];
-            pos.push(SkPoint::Make(vert.pos.x, vert.pos.y));
-            uv.push(SkPoint::Make(vert.uv.x, vert.uv.y));
-            color.push(vert.col);
+            pos.push_back(SkPoint::Make(vert.pos.x, vert.pos.y));
+            uv.push_back(SkPoint::Make(vert.uv.x, vert.uv.y));
+            color.push_back(vert.col);
         }
         // ImGui colors are RGBA
         SkSwapRB(color.begin(), color.begin(), color.count());
