diff options
author | Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com> | 2023-05-23 16:45:08 +0200 |
---|---|---|
committer | Arthur Cohen <arthur.cohen@embecosm.com> | 2023-06-08 14:32:35 +0200 |
commit | c60b36b977da356ea4a120ffd5e0c1fc4e1aedca (patch) | |
tree | 9f971190bf13af1ec5cc636ff04aa8d267f191f3 | |
parent | f13da289f1c330e280b7f992aca275c9dad8a511 (diff) | |
download | gcc-c60b36b977da356ea4a120ffd5e0c1fc4e1aedca.zip gcc-c60b36b977da356ea4a120ffd5e0c1fc4e1aedca.tar.gz gcc-c60b36b977da356ea4a120ffd5e0c1fc4e1aedca.tar.bz2 |
libproc_macro: Fix Tokenstream growth
TokenStream did not copy back enough old data to the new location. This
commit also add more explicit memcpy usages in order to facilitate
change to utf-8 later.
ChangeLog:
* libgrust/libproc_macro/ffistring.cc (FFIString::make_ffistring):
Add explicit sizeof and utf-8 warning.
(FFIString::clone): Add explicit sizeof and utf-8 warning.
* libgrust/libproc_macro/ident.cc (Ident::clone): Likewise.
(Ident::make_ident): Likewise.
* libgrust/libproc_macro/tokenstream.cc (TokenStream::grow):
Fix vector growth.
(TokenStream__clone): Add explicit sizeof.
Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
-rw-r--r-- | libgrust/libproc_macro/ffistring.cc | 6 | ||||
-rw-r--r-- | libgrust/libproc_macro/ident.cc | 10 | ||||
-rw-r--r-- | libgrust/libproc_macro/tokenstream.cc | 4 |
3 files changed, 12 insertions, 8 deletions
diff --git a/libgrust/libproc_macro/ffistring.cc b/libgrust/libproc_macro/ffistring.cc index 06e4e81..2de674c 100644 --- a/libgrust/libproc_macro/ffistring.cc +++ b/libgrust/libproc_macro/ffistring.cc @@ -42,7 +42,8 @@ FFIString FFIString::make_ffistring (const unsigned char *data, std::uint64_t len) { unsigned char *inner = new unsigned char[len]; - std::memcpy (inner, data, len); + // FIXME: UTF-8 Update this with sizeof codepoint instead + std::memcpy (inner, data, len * sizeof (unsigned char)); return {inner, len}; } @@ -50,7 +51,8 @@ FFIString FFIString::clone () const { unsigned char *inner = new unsigned char[this->len]; - std::memcpy (inner, this->data, this->len); + // FIXME: UTF-8 Update this with sizeof codepoint instead + std::memcpy (inner, this->data, this->len * sizeof (unsigned char)); return {inner, this->len}; } diff --git a/libgrust/libproc_macro/ident.cc b/libgrust/libproc_macro/ident.cc index 2369705..6c8472d 100644 --- a/libgrust/libproc_macro/ident.cc +++ b/libgrust/libproc_macro/ident.cc @@ -56,8 +56,9 @@ Ident Ident::clone () const { unsigned char *val = new unsigned char[this->len]; - std::memcpy (val, this->val, this->len); - return {this->is_raw, val, this->len, this->span}; + // FIXME: UTF-8 Update this with sizeof codepoint instead + std::memcpy (val, this->val, this->len * sizeof (char)); + return {this->is_raw, val, this->len}; } Ident @@ -73,8 +74,9 @@ Ident::make_ident (const unsigned char *str, std::uint64_t len, Span span, bool raw) { unsigned char *val = new unsigned char[len]; - std::memcpy (val, str, len); - return {raw, val, len, span}; + // FIXME: UTF-8 Update this with sizeof codepoint instead + std::memcpy (val, str, len * sizeof (char)); + return {raw, val, len}; } void diff --git a/libgrust/libproc_macro/tokenstream.cc b/libgrust/libproc_macro/tokenstream.cc index 25e42dc..d1116ff 100644 --- a/libgrust/libproc_macro/tokenstream.cc +++ b/libgrust/libproc_macro/tokenstream.cc @@ -51,7 +51,7 @@ TokenStream::grow (std::uint64_t delta) auto new_capacity = capacity + (delta != 0 ? delta : 1); auto *new_data = new TokenTree[new_capacity]; capacity = new_capacity; - std::memcpy (new_data, data, size); + std::memcpy (new_data, data, size * sizeof (TokenTree)); delete[] data; data = new_data; } @@ -107,7 +107,7 @@ extern "C" TokenStream TokenStream__clone (const TokenStream *ts) { auto *data = new TokenTree[ts->capacity]; - std::memcpy (data, ts->data, ts->size); + std::memcpy (data, ts->data, ts->size * sizeof (TokenTree)); return {data, ts->size, ts->capacity}; } |