Bug 1335895 - part 23: Added ArrayRefBase::CopyTo() r=jchen draft
authorRandall Barker <rbarker@mozilla.com>
Sat, 01 Apr 2017 15:48:39 -0700
changeset 558765 2d1646ecc7a696eb4ad023ec73f677acd312915d
parent 558764 6271adc8757c9ecc1a773eb5379cca017fa5cd3f
child 558766 d73190b4199e03bc9f0247ebcc511267468dfa5b
push id52941
push userbmo:rbarker@mozilla.com
push dateFri, 07 Apr 2017 23:43:33 +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