|
25 | 25 | #include "env-inl.h"
|
26 | 26 | #include "node_buffer.h"
|
27 | 27 | #include "node_errors.h"
|
| 28 | +#include "simdutf.h" |
28 | 29 | #include "util.h"
|
29 | 30 |
|
30 | 31 | #include <climits>
|
@@ -467,60 +468,6 @@ Maybe<size_t> StringBytes::Size(Isolate* isolate,
|
467 | 468 | UNREACHABLE();
|
468 | 469 | }
|
469 | 470 |
|
470 |
| - |
471 |
| - |
472 |
| - |
473 |
| -static bool contains_non_ascii_slow(const char* buf, size_t len) { |
474 |
| - for (size_t i = 0; i < len; ++i) { |
475 |
| - if (buf[i] & 0x80) |
476 |
| - return true; |
477 |
| - } |
478 |
| - return false; |
479 |
| -} |
480 |
| - |
481 |
| - |
482 |
| -static bool contains_non_ascii(const char* src, size_t len) { |
483 |
| - if (len < 16) { |
484 |
| - return contains_non_ascii_slow(src, len); |
485 |
| - } |
486 |
| - |
487 |
| - const unsigned bytes_per_word = sizeof(uintptr_t); |
488 |
| - const unsigned align_mask = bytes_per_word - 1; |
489 |
| - const unsigned unaligned = reinterpret_cast<uintptr_t>(src) & align_mask; |
490 |
| - |
491 |
| - if (unaligned > 0) { |
492 |
| - const unsigned n = bytes_per_word - unaligned; |
493 |
| - if (contains_non_ascii_slow(src, n)) |
494 |
| - return true; |
495 |
| - src += n; |
496 |
| - len -= n; |
497 |
| - } |
498 |
| - |
499 |
| - |
500 |
| -#if defined(_WIN64) || defined(_LP64) |
501 |
| - const uintptr_t mask = 0x8080808080808080ll; |
502 |
| -#else |
503 |
| - const uintptr_t mask = 0x80808080l; |
504 |
| -#endif |
505 |
| - |
506 |
| - const uintptr_t* srcw = reinterpret_cast<const uintptr_t*>(src); |
507 |
| - |
508 |
| - for (size_t i = 0, n = len / bytes_per_word; i < n; ++i) { |
509 |
| - if (srcw[i] & mask) |
510 |
| - return true; |
511 |
| - } |
512 |
| - |
513 |
| - const unsigned remainder = len & align_mask; |
514 |
| - if (remainder > 0) { |
515 |
| - const size_t offset = len - remainder; |
516 |
| - if (contains_non_ascii_slow(src + offset, remainder)) |
517 |
| - return true; |
518 |
| - } |
519 |
| - |
520 |
| - return false; |
521 |
| -} |
522 |
| - |
523 |
| - |
524 | 471 | static void force_ascii_slow(const char* src, char* dst, size_t len) {
|
525 | 472 | for (size_t i = 0; i < len; ++i) {
|
526 | 473 | dst[i] = src[i] & 0x7f;
|
@@ -634,7 +581,8 @@ MaybeLocal<Value> StringBytes::Encode(Isolate* isolate,
|
634 | 581 | }
|
635 | 582 |
|
636 | 583 | case ASCII:
|
637 |
| - if (contains_non_ascii(buf, buflen)) { |
| 584 | + if (simdutf::validate_ascii_with_errors(buf, buflen).error) { |
| 585 | + // The input contains non-ASCII bytes. |
638 | 586 | char* out = node::UncheckedMalloc(buflen);
|
639 | 587 | if (out == nullptr) {
|
640 | 588 | *error = node::ERR_MEMORY_ALLOCATION_FAILED(isolate);
|
|
0 commit comments