| 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
|
|
|