Index: src/utils.cc |
diff --git a/src/utils.cc b/src/utils.cc |
index 7af30f27b7bd57a395bf028aa97883d606423cb8..c159fc13ea7ca105549cc12464efd91527daab08 100644 |
--- a/src/utils.cc |
+++ b/src/utils.cc |
@@ -29,7 +29,7 @@ void SimpleStringBuilder::AddString(const char* s) { |
void SimpleStringBuilder::AddSubstring(const char* s, int n) { |
ASSERT(!is_finalized() && position_ + n <= buffer_.length()); |
ASSERT(static_cast<size_t>(n) <= strlen(s)); |
- OS::MemCopy(&buffer_[position_], s, n * kCharSize); |
+ MemCopy(&buffer_[position_], s, n * kCharSize); |
position_ += n; |
} |
@@ -145,12 +145,12 @@ char* ReadLine(const char* prompt) { |
char* new_result = NewArray<char>(new_len); |
// Copy the existing input into the new array and set the new |
// array as the result. |
- OS::MemCopy(new_result, result, offset * kCharSize); |
+ MemCopy(new_result, result, offset * kCharSize); |
DeleteArray(result); |
result = new_result; |
} |
// Copy the newly read line into the result. |
- OS::MemCopy(result + offset, line_buf, len * kCharSize); |
+ MemCopy(result + offset, line_buf, len * kCharSize); |
offset += len; |
} |
ASSERT(result != NULL); |
@@ -314,4 +314,65 @@ void StringBuilder::AddFormattedList(const char* format, va_list list) { |
} |
+#if V8_TARGET_ARCH_IA32 || V8_TARGET_ARCH_X87 |
+static void MemMoveWrapper(void* dest, const void* src, size_t size) { |
+ memmove(dest, src, size); |
+} |
+ |
+ |
+// Initialize to library version so we can call this at any time during startup. |
+static MemMoveFunction memmove_function = &MemMoveWrapper; |
+ |
+// Defined in codegen-ia32.cc. |
+MemMoveFunction CreateMemMoveFunction(); |
+ |
+// Copy memory area to disjoint memory area. |
+void MemMove(void* dest, const void* src, size_t size) { |
+ if (size == 0) return; |
+ // Note: here we rely on dependent reads being ordered. This is true |
+ // on all architectures we currently support. |
+ (*memmove_function)(dest, src, size); |
+} |
+ |
+#elif V8_OS_POSIX && V8_HOST_ARCH_ARM |
+void MemCopyUint16Uint8Wrapper(uint16_t* dest, const uint8_t* src, |
+ size_t chars) { |
+ uint16_t* limit = dest + chars; |
+ while (dest < limit) { |
+ *dest++ = static_cast<uint16_t>(*src++); |
+ } |
+} |
+ |
+ |
+MemCopyUint8Function memcopy_uint8_function = &MemCopyUint8Wrapper; |
+MemCopyUint16Uint8Function memcopy_uint16_uint8_function = |
+ &MemCopyUint16Uint8Wrapper; |
+// Defined in codegen-arm.cc. |
+MemCopyUint8Function CreateMemCopyUint8Function(MemCopyUint8Function stub); |
+MemCopyUint16Uint8Function CreateMemCopyUint16Uint8Function( |
+ MemCopyUint16Uint8Function stub); |
+ |
+#elif V8_OS_POSIX && V8_HOST_ARCH_MIPS |
+MemCopyUint8Function memcopy_uint8_function = &MemCopyUint8Wrapper; |
+// Defined in codegen-mips.cc. |
+MemCopyUint8Function CreateMemCopyUint8Function(MemCopyUint8Function stub); |
+#endif |
+ |
+ |
+void init_memcopy_functions() { |
+#if V8_TARGET_ARCH_IA32 || V8_TARGET_ARCH_X87 |
+ MemMoveFunction generated_memmove = CreateMemMoveFunction(); |
+ if (generated_memmove != NULL) { |
+ memmove_function = generated_memmove; |
+ } |
+#elif V8_OS_POSIX && V8_HOST_ARCH_ARM |
+ memcopy_uint8_function = CreateMemCopyUint8Function(&MemCopyUint8Wrapper); |
+ memcopy_uint16_uint8_function = |
+ CreateMemCopyUint16Uint8Function(&MemCopyUint16Uint8Wrapper); |
+#elif V8_OS_POSIX && V8_HOST_ARCH_MIPS |
+ memcopy_uint8_function = CreateMemCopyUint8Function(&MemCopyUint8Wrapper); |
+#endif |
+} |
+ |
+ |
} } // namespace v8::internal |