OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef V8_UTILS_H_ | 5 #ifndef V8_UTILS_H_ |
6 #define V8_UTILS_H_ | 6 #define V8_UTILS_H_ |
7 | 7 |
8 #include <limits.h> | 8 #include <limits.h> |
9 #include <stdlib.h> | 9 #include <stdlib.h> |
10 #include <string.h> | 10 #include <string.h> |
(...skipping 715 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
726 } | 726 } |
727 this->current_chunk_ = new_chunk; | 727 this->current_chunk_ = new_chunk; |
728 this->index_ = sequence_length; | 728 this->index_ = sequence_length; |
729 sequence_start_ = 0; | 729 sequence_start_ = 0; |
730 } | 730 } |
731 }; | 731 }; |
732 | 732 |
733 | 733 |
734 // Compare 8bit/16bit chars to 8bit/16bit chars. | 734 // Compare 8bit/16bit chars to 8bit/16bit chars. |
735 template <typename lchar, typename rchar> | 735 template <typename lchar, typename rchar> |
736 inline int CompareCharsUnsigned(const lchar* lhs, | 736 inline int CompareCharsUnsigned(const lchar* lhs, const rchar* rhs, |
737 const rchar* rhs, | 737 size_t chars) { |
738 int chars) { | |
739 const lchar* limit = lhs + chars; | 738 const lchar* limit = lhs + chars; |
740 if (sizeof(*lhs) == sizeof(char) && sizeof(*rhs) == sizeof(char)) { | 739 if (sizeof(*lhs) == sizeof(char) && sizeof(*rhs) == sizeof(char)) { |
741 // memcmp compares byte-by-byte, yielding wrong results for two-byte | 740 // memcmp compares byte-by-byte, yielding wrong results for two-byte |
742 // strings on little-endian systems. | 741 // strings on little-endian systems. |
743 return memcmp(lhs, rhs, chars); | 742 return memcmp(lhs, rhs, chars); |
744 } | 743 } |
745 while (lhs < limit) { | 744 while (lhs < limit) { |
746 int r = static_cast<int>(*lhs) - static_cast<int>(*rhs); | 745 int r = static_cast<int>(*lhs) - static_cast<int>(*rhs); |
747 if (r != 0) return r; | 746 if (r != 0) return r; |
748 ++lhs; | 747 ++lhs; |
749 ++rhs; | 748 ++rhs; |
750 } | 749 } |
751 return 0; | 750 return 0; |
752 } | 751 } |
753 | 752 |
754 template<typename lchar, typename rchar> | 753 template <typename lchar, typename rchar> |
755 inline int CompareChars(const lchar* lhs, const rchar* rhs, int chars) { | 754 inline int CompareChars(const lchar* lhs, const rchar* rhs, size_t chars) { |
756 DCHECK(sizeof(lchar) <= 2); | 755 DCHECK(sizeof(lchar) <= 2); |
757 DCHECK(sizeof(rchar) <= 2); | 756 DCHECK(sizeof(rchar) <= 2); |
758 if (sizeof(lchar) == 1) { | 757 if (sizeof(lchar) == 1) { |
759 if (sizeof(rchar) == 1) { | 758 if (sizeof(rchar) == 1) { |
760 return CompareCharsUnsigned(reinterpret_cast<const uint8_t*>(lhs), | 759 return CompareCharsUnsigned(reinterpret_cast<const uint8_t*>(lhs), |
761 reinterpret_cast<const uint8_t*>(rhs), | 760 reinterpret_cast<const uint8_t*>(rhs), |
762 chars); | 761 chars); |
763 } else { | 762 } else { |
764 return CompareCharsUnsigned(reinterpret_cast<const uint8_t*>(lhs), | 763 return CompareCharsUnsigned(reinterpret_cast<const uint8_t*>(lhs), |
765 reinterpret_cast<const uint16_t*>(rhs), | 764 reinterpret_cast<const uint16_t*>(rhs), |
(...skipping 544 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1310 // On return, *exits tells whether the file existed. | 1309 // On return, *exits tells whether the file existed. |
1311 Vector<const char> ReadFile(const char* filename, | 1310 Vector<const char> ReadFile(const char* filename, |
1312 bool* exists, | 1311 bool* exists, |
1313 bool verbose = true); | 1312 bool verbose = true); |
1314 Vector<const char> ReadFile(FILE* file, | 1313 Vector<const char> ReadFile(FILE* file, |
1315 bool* exists, | 1314 bool* exists, |
1316 bool verbose = true); | 1315 bool verbose = true); |
1317 | 1316 |
1318 | 1317 |
1319 template <typename sourcechar, typename sinkchar> | 1318 template <typename sourcechar, typename sinkchar> |
1320 INLINE(static void CopyCharsUnsigned(sinkchar* dest, | 1319 INLINE(static void CopyCharsUnsigned(sinkchar* dest, const sourcechar* src, |
1321 const sourcechar* src, | 1320 size_t chars)); |
1322 int chars)); | |
1323 #if defined(V8_HOST_ARCH_ARM) | 1321 #if defined(V8_HOST_ARCH_ARM) |
1324 INLINE(void CopyCharsUnsigned(uint8_t* dest, const uint8_t* src, int chars)); | 1322 INLINE(void CopyCharsUnsigned(uint8_t* dest, const uint8_t* src, size_t chars)); |
1325 INLINE(void CopyCharsUnsigned(uint16_t* dest, const uint8_t* src, int chars)); | 1323 INLINE(void CopyCharsUnsigned(uint16_t* dest, const uint8_t* src, |
1326 INLINE(void CopyCharsUnsigned(uint16_t* dest, const uint16_t* src, int chars)); | 1324 size_t chars)); |
| 1325 INLINE(void CopyCharsUnsigned(uint16_t* dest, const uint16_t* src, |
| 1326 size_t chars)); |
1327 #elif defined(V8_HOST_ARCH_MIPS) | 1327 #elif defined(V8_HOST_ARCH_MIPS) |
1328 INLINE(void CopyCharsUnsigned(uint8_t* dest, const uint8_t* src, int chars)); | 1328 INLINE(void CopyCharsUnsigned(uint8_t* dest, const uint8_t* src, size_t chars)); |
1329 INLINE(void CopyCharsUnsigned(uint16_t* dest, const uint16_t* src, int chars)); | 1329 INLINE(void CopyCharsUnsigned(uint16_t* dest, const uint16_t* src, |
| 1330 size_t chars)); |
1330 #elif defined(V8_HOST_ARCH_PPC) | 1331 #elif defined(V8_HOST_ARCH_PPC) |
1331 INLINE(void CopyCharsUnsigned(uint8_t* dest, const uint8_t* src, int chars)); | 1332 INLINE(void CopyCharsUnsigned(uint8_t* dest, const uint8_t* src, size_t chars)); |
1332 INLINE(void CopyCharsUnsigned(uint16_t* dest, const uint16_t* src, int chars)); | 1333 INLINE(void CopyCharsUnsigned(uint16_t* dest, const uint16_t* src, |
| 1334 size_t chars)); |
1333 #endif | 1335 #endif |
1334 | 1336 |
1335 // Copy from 8bit/16bit chars to 8bit/16bit chars. | 1337 // Copy from 8bit/16bit chars to 8bit/16bit chars. |
1336 template <typename sourcechar, typename sinkchar> | 1338 template <typename sourcechar, typename sinkchar> |
1337 INLINE(void CopyChars(sinkchar* dest, const sourcechar* src, int chars)); | 1339 INLINE(void CopyChars(sinkchar* dest, const sourcechar* src, size_t chars)); |
1338 | 1340 |
1339 template<typename sourcechar, typename sinkchar> | 1341 template <typename sourcechar, typename sinkchar> |
1340 void CopyChars(sinkchar* dest, const sourcechar* src, int chars) { | 1342 void CopyChars(sinkchar* dest, const sourcechar* src, size_t chars) { |
1341 DCHECK(sizeof(sourcechar) <= 2); | 1343 DCHECK(sizeof(sourcechar) <= 2); |
1342 DCHECK(sizeof(sinkchar) <= 2); | 1344 DCHECK(sizeof(sinkchar) <= 2); |
1343 if (sizeof(sinkchar) == 1) { | 1345 if (sizeof(sinkchar) == 1) { |
1344 if (sizeof(sourcechar) == 1) { | 1346 if (sizeof(sourcechar) == 1) { |
1345 CopyCharsUnsigned(reinterpret_cast<uint8_t*>(dest), | 1347 CopyCharsUnsigned(reinterpret_cast<uint8_t*>(dest), |
1346 reinterpret_cast<const uint8_t*>(src), | 1348 reinterpret_cast<const uint8_t*>(src), |
1347 chars); | 1349 chars); |
1348 } else { | 1350 } else { |
1349 CopyCharsUnsigned(reinterpret_cast<uint8_t*>(dest), | 1351 CopyCharsUnsigned(reinterpret_cast<uint8_t*>(dest), |
1350 reinterpret_cast<const uint16_t*>(src), | 1352 reinterpret_cast<const uint16_t*>(src), |
1351 chars); | 1353 chars); |
1352 } | 1354 } |
1353 } else { | 1355 } else { |
1354 if (sizeof(sourcechar) == 1) { | 1356 if (sizeof(sourcechar) == 1) { |
1355 CopyCharsUnsigned(reinterpret_cast<uint16_t*>(dest), | 1357 CopyCharsUnsigned(reinterpret_cast<uint16_t*>(dest), |
1356 reinterpret_cast<const uint8_t*>(src), | 1358 reinterpret_cast<const uint8_t*>(src), |
1357 chars); | 1359 chars); |
1358 } else { | 1360 } else { |
1359 CopyCharsUnsigned(reinterpret_cast<uint16_t*>(dest), | 1361 CopyCharsUnsigned(reinterpret_cast<uint16_t*>(dest), |
1360 reinterpret_cast<const uint16_t*>(src), | 1362 reinterpret_cast<const uint16_t*>(src), |
1361 chars); | 1363 chars); |
1362 } | 1364 } |
1363 } | 1365 } |
1364 } | 1366 } |
1365 | 1367 |
1366 template <typename sourcechar, typename sinkchar> | 1368 template <typename sourcechar, typename sinkchar> |
1367 void CopyCharsUnsigned(sinkchar* dest, const sourcechar* src, int chars) { | 1369 void CopyCharsUnsigned(sinkchar* dest, const sourcechar* src, size_t chars) { |
1368 sinkchar* limit = dest + chars; | 1370 sinkchar* limit = dest + chars; |
1369 if ((sizeof(*dest) == sizeof(*src)) && | 1371 if ((sizeof(*dest) == sizeof(*src)) && |
1370 (chars >= static_cast<int>(kMinComplexMemCopy / sizeof(*dest)))) { | 1372 (chars >= static_cast<int>(kMinComplexMemCopy / sizeof(*dest)))) { |
1371 MemCopy(dest, src, chars * sizeof(*dest)); | 1373 MemCopy(dest, src, chars * sizeof(*dest)); |
1372 } else { | 1374 } else { |
1373 while (dest < limit) *dest++ = static_cast<sinkchar>(*src++); | 1375 while (dest < limit) *dest++ = static_cast<sinkchar>(*src++); |
1374 } | 1376 } |
1375 } | 1377 } |
1376 | 1378 |
1377 | 1379 |
1378 #if defined(V8_HOST_ARCH_ARM) | 1380 #if defined(V8_HOST_ARCH_ARM) |
1379 void CopyCharsUnsigned(uint8_t* dest, const uint8_t* src, int chars) { | 1381 void CopyCharsUnsigned(uint8_t* dest, const uint8_t* src, size_t chars) { |
1380 switch (static_cast<unsigned>(chars)) { | 1382 switch (static_cast<unsigned>(chars)) { |
1381 case 0: | 1383 case 0: |
1382 break; | 1384 break; |
1383 case 1: | 1385 case 1: |
1384 *dest = *src; | 1386 *dest = *src; |
1385 break; | 1387 break; |
1386 case 2: | 1388 case 2: |
1387 memcpy(dest, src, 2); | 1389 memcpy(dest, src, 2); |
1388 break; | 1390 break; |
1389 case 3: | 1391 case 3: |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1425 case 15: | 1427 case 15: |
1426 memcpy(dest, src, 15); | 1428 memcpy(dest, src, 15); |
1427 break; | 1429 break; |
1428 default: | 1430 default: |
1429 MemCopy(dest, src, chars); | 1431 MemCopy(dest, src, chars); |
1430 break; | 1432 break; |
1431 } | 1433 } |
1432 } | 1434 } |
1433 | 1435 |
1434 | 1436 |
1435 void CopyCharsUnsigned(uint16_t* dest, const uint8_t* src, int chars) { | 1437 void CopyCharsUnsigned(uint16_t* dest, const uint8_t* src, size_t chars) { |
1436 if (chars >= kMinComplexConvertMemCopy) { | 1438 if (chars >= kMinComplexConvertMemCopy) { |
1437 MemCopyUint16Uint8(dest, src, chars); | 1439 MemCopyUint16Uint8(dest, src, chars); |
1438 } else { | 1440 } else { |
1439 MemCopyUint16Uint8Wrapper(dest, src, chars); | 1441 MemCopyUint16Uint8Wrapper(dest, src, chars); |
1440 } | 1442 } |
1441 } | 1443 } |
1442 | 1444 |
1443 | 1445 |
1444 void CopyCharsUnsigned(uint16_t* dest, const uint16_t* src, int chars) { | 1446 void CopyCharsUnsigned(uint16_t* dest, const uint16_t* src, size_t chars) { |
1445 switch (static_cast<unsigned>(chars)) { | 1447 switch (static_cast<unsigned>(chars)) { |
1446 case 0: | 1448 case 0: |
1447 break; | 1449 break; |
1448 case 1: | 1450 case 1: |
1449 *dest = *src; | 1451 *dest = *src; |
1450 break; | 1452 break; |
1451 case 2: | 1453 case 2: |
1452 memcpy(dest, src, 4); | 1454 memcpy(dest, src, 4); |
1453 break; | 1455 break; |
1454 case 3: | 1456 case 3: |
(...skipping 12 matching lines...) Expand all Loading... |
1467 memcpy(dest, src, 14); | 1469 memcpy(dest, src, 14); |
1468 break; | 1470 break; |
1469 default: | 1471 default: |
1470 MemCopy(dest, src, chars * sizeof(*dest)); | 1472 MemCopy(dest, src, chars * sizeof(*dest)); |
1471 break; | 1473 break; |
1472 } | 1474 } |
1473 } | 1475 } |
1474 | 1476 |
1475 | 1477 |
1476 #elif defined(V8_HOST_ARCH_MIPS) | 1478 #elif defined(V8_HOST_ARCH_MIPS) |
1477 void CopyCharsUnsigned(uint8_t* dest, const uint8_t* src, int chars) { | 1479 void CopyCharsUnsigned(uint8_t* dest, const uint8_t* src, size_t chars) { |
1478 if (chars < kMinComplexMemCopy) { | 1480 if (chars < kMinComplexMemCopy) { |
1479 memcpy(dest, src, chars); | 1481 memcpy(dest, src, chars); |
1480 } else { | 1482 } else { |
1481 MemCopy(dest, src, chars); | 1483 MemCopy(dest, src, chars); |
1482 } | 1484 } |
1483 } | 1485 } |
1484 | 1486 |
1485 void CopyCharsUnsigned(uint16_t* dest, const uint16_t* src, int chars) { | 1487 void CopyCharsUnsigned(uint16_t* dest, const uint16_t* src, size_t chars) { |
1486 if (chars < kMinComplexMemCopy) { | 1488 if (chars < kMinComplexMemCopy) { |
1487 memcpy(dest, src, chars * sizeof(*dest)); | 1489 memcpy(dest, src, chars * sizeof(*dest)); |
1488 } else { | 1490 } else { |
1489 MemCopy(dest, src, chars * sizeof(*dest)); | 1491 MemCopy(dest, src, chars * sizeof(*dest)); |
1490 } | 1492 } |
1491 } | 1493 } |
1492 #elif defined(V8_HOST_ARCH_PPC) | 1494 #elif defined(V8_HOST_ARCH_PPC) |
1493 #define CASE(n) \ | 1495 #define CASE(n) \ |
1494 case n: \ | 1496 case n: \ |
1495 memcpy(dest, src, n); \ | 1497 memcpy(dest, src, n); \ |
1496 break | 1498 break |
1497 void CopyCharsUnsigned(uint8_t* dest, const uint8_t* src, int chars) { | 1499 void CopyCharsUnsigned(uint8_t* dest, const uint8_t* src, size_t chars) { |
1498 switch (static_cast<unsigned>(chars)) { | 1500 switch (static_cast<unsigned>(chars)) { |
1499 case 0: | 1501 case 0: |
1500 break; | 1502 break; |
1501 case 1: | 1503 case 1: |
1502 *dest = *src; | 1504 *dest = *src; |
1503 break; | 1505 break; |
1504 CASE(2); | 1506 CASE(2); |
1505 CASE(3); | 1507 CASE(3); |
1506 CASE(4); | 1508 CASE(4); |
1507 CASE(5); | 1509 CASE(5); |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1568 memcpy(dest, src, chars); | 1570 memcpy(dest, src, chars); |
1569 break; | 1571 break; |
1570 } | 1572 } |
1571 } | 1573 } |
1572 #undef CASE | 1574 #undef CASE |
1573 | 1575 |
1574 #define CASE(n) \ | 1576 #define CASE(n) \ |
1575 case n: \ | 1577 case n: \ |
1576 memcpy(dest, src, n * 2); \ | 1578 memcpy(dest, src, n * 2); \ |
1577 break | 1579 break |
1578 void CopyCharsUnsigned(uint16_t* dest, const uint16_t* src, int chars) { | 1580 void CopyCharsUnsigned(uint16_t* dest, const uint16_t* src, size_t chars) { |
1579 switch (static_cast<unsigned>(chars)) { | 1581 switch (static_cast<unsigned>(chars)) { |
1580 case 0: | 1582 case 0: |
1581 break; | 1583 break; |
1582 case 1: | 1584 case 1: |
1583 *dest = *src; | 1585 *dest = *src; |
1584 break; | 1586 break; |
1585 CASE(2); | 1587 CASE(2); |
1586 CASE(3); | 1588 CASE(3); |
1587 CASE(4); | 1589 CASE(4); |
1588 CASE(5); | 1590 CASE(5); |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1673 // Takes the address of the limit variable in order to find out where | 1675 // Takes the address of the limit variable in order to find out where |
1674 // the top of stack is right now. | 1676 // the top of stack is right now. |
1675 uintptr_t limit = reinterpret_cast<uintptr_t>(&limit); | 1677 uintptr_t limit = reinterpret_cast<uintptr_t>(&limit); |
1676 return limit; | 1678 return limit; |
1677 } | 1679 } |
1678 | 1680 |
1679 } // namespace internal | 1681 } // namespace internal |
1680 } // namespace v8 | 1682 } // namespace v8 |
1681 | 1683 |
1682 #endif // V8_UTILS_H_ | 1684 #endif // V8_UTILS_H_ |
OLD | NEW |