Index: runtime/vm/object.cc |
=================================================================== |
--- runtime/vm/object.cc (revision 3811) |
+++ runtime/vm/object.cc (working copy) |
@@ -7506,6 +7506,51 @@ |
} |
+void ByteArray::Copy(uint8_t* dst, |
+ const ByteArray& src, |
+ intptr_t src_offset, |
+ intptr_t length) { |
+ ASSERT(Utils::RangeCheck(src_offset, length, src.Length())); |
+ { |
+ NoGCScope no_gc; |
+ memmove(dst, src.ByteAddr(src_offset), length); |
+ } |
+} |
+ |
+ |
+void ByteArray::Copy(const ByteArray& dst, |
+ intptr_t dst_offset, |
+ const uint8_t* src, |
+ intptr_t length) { |
+ ASSERT(Utils::RangeCheck(dst_offset, length, dst.Length())); |
+ { |
+ NoGCScope no_gc; |
+ memmove(dst.ByteAddr(dst_offset), src, length); |
+ } |
+} |
+ |
+ |
+void ByteArray::Copy(const ByteArray& dst, |
+ intptr_t dst_offset, |
+ const ByteArray& src, |
+ intptr_t src_offset, |
+ intptr_t length) { |
+ ASSERT(Utils::RangeCheck(src_offset, length, src.Length())); |
+ ASSERT(Utils::RangeCheck(dst_offset, length, dst.Length())); |
+ { |
+ NoGCScope no_gc; |
+ memmove(dst.ByteAddr(dst_offset), src.ByteAddr(src_offset), length); |
+ } |
+} |
+ |
+ |
+uint8_t* ByteArray::ByteAddr(intptr_t byte_offset) const { |
+ // ByteArray is an abstract class. |
+ UNREACHABLE(); |
+ return NULL; |
+} |
+ |
+ |
const char* ByteArray::ToCString() const { |
// ByteArray is an abstract class. |
UNREACHABLE(); |
@@ -7526,7 +7571,9 @@ |
NoGCScope no_gc; |
result ^= raw; |
result.SetLength(len); |
- memset(result.Addr<uint8_t>(0), 0, len); |
+ if (len > 0) { |
+ memset(result.Addr<uint8_t>(0), 0, len); |
+ } |
} |
return result.raw(); |
} |
@@ -7539,7 +7586,9 @@ |
InternalByteArray::Handle(InternalByteArray::New(len, space)); |
{ |
NoGCScope no_gc; |
- memmove(result.Addr<uint8_t>(0), data, len); |
+ if (len > 0) { |
+ memmove(result.Addr<uint8_t>(0), data, len); |
+ } |
} |
return result.raw(); |
} |