Bug 1335895 - part 23: Added ArrayRefBase::CopyTo() r=jchen draft
authorRandall Barker <rbarker@mozilla.com>
Sat, 01 Apr 2017 15:48:39 -0700
changeset 565572 6a4a15ca3a7807a46d9cacc4a187c33f73858bd2
parent 565571 fd2c8f5f95d86fba51ac72e6a9307a6661b198af
child 565573 5e68d85ce6156383223e4d022c391e93beb8f1e7
push id54904
push userbmo:rbarker@mozilla.com
push dateThu, 20 Apr 2017 02:39:58 +0000
reviewersjchen
bugs1335895
milestone55.0a1
Bug 1335895 - part 23: Added ArrayRefBase::CopyTo() r=jchen
widget/android/jni/Refs.h
--- a/widget/android/jni/Refs.h
+++ b/widget/android/jni/Refs.h
@@ -848,24 +848,37 @@ public:
     }
 
     nsTArray<ElementType> GetElements() const
     {
         using JNIElemType = typename detail::TypeAdapter<ElementType>::JNIType;
         static_assert(sizeof(ElementType) == sizeof(JNIElemType),
                       "Size of native type must match size of JNI type");
 
-        const jsize len = size_t(Base::Env()->GetArrayLength(Base::Instance()));
+        const size_t len = size_t(Base::Env()->GetArrayLength(Base::Instance()));
+
+        nsTArray<ElementType> array(len);
+        array.SetLength(len);
+        CopyTo(array.Elements(), len);
+        return array;
+    }
 
-        nsTArray<ElementType> array((size_t(len)));
-        array.SetLength(size_t(len));
+    // returns number of elements copied
+    size_t CopyTo(ElementType* buffer, size_t size) const
+    {
+        using JNIElemType = typename detail::TypeAdapter<ElementType>::JNIType;
+        static_assert(sizeof(ElementType) == sizeof(JNIElemType),
+                      "Size of native type must match size of JNI type");
+
+        const size_t len = size_t(Base::Env()->GetArrayLength(Base::Instance()));
+        const size_t amountToCopy = (len > size ? size : len);
         (Base::Env()->*detail::TypeAdapter<ElementType>::GetArray)(
-                Base::Instance(), 0, len,
-                reinterpret_cast<JNIElemType*>(array.Elements()));
-        return array;
+                Base::Instance(), 0, jsize(amountToCopy),
+                reinterpret_cast<JNIElemType*>(buffer));
+        return amountToCopy;
     }
 
     ElementType operator[](size_t index) const
     {
         return GetElement(index);
     }
 
     operator nsTArray<ElementType>() const