diff options
author | Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com> | 2023-07-19 11:50:23 +0200 |
---|---|---|
committer | P-E-P <32375388+P-E-P@users.noreply.github.com> | 2023-07-19 15:03:42 +0000 |
commit | 4332fbfaec8b6b66efa737c92d191003a76264bf (patch) | |
tree | cc17cf25f5619d6fd0a0004fa6a37fecdaa49b35 | |
parent | 04c9af6d0f2d38504a5add30c44a348a91af4b57 (diff) | |
download | gcc-4332fbfaec8b6b66efa737c92d191003a76264bf.zip gcc-4332fbfaec8b6b66efa737c92d191003a76264bf.tar.gz gcc-4332fbfaec8b6b66efa737c92d191003a76264bf.tar.bz2 |
libproc_macro: Change Ident structure
Use FFIString in Ident structure rather that a raw pointer and a
length, this will reduce the size of the code dealing with raw
pointers. Which should prevent some error.
gcc/rust/ChangeLog:
* util/rust-token-converter.cc (from_ident): Adapt code to new
constructor.
ChangeLog:
* libgrust/libproc_macro/ident.cc (Ident__new): Constructor
accepts an FFIString now.
(Ident__new_raw): Likewise.
(Ident::clone): Internal members change means clone also change.
(Ident::make_ident): Change constructor call.
(Ident::drop): Add call to FFIString::clone.
* libgrust/libproc_macro/ident.h (struct Ident): Remove raw
pointer and length, add an FFIString inside instead.
(Ident__new): Change constructor.
(Ident__new_raw): Change constructor.
Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
-rw-r--r-- | gcc/rust/util/rust-token-converter.cc | 2 | ||||
-rw-r--r-- | libgrust/libproc_macro/ident.cc | 28 | ||||
-rw-r--r-- | libgrust/libproc_macro/ident.h | 13 |
3 files changed, 15 insertions, 28 deletions
diff --git a/gcc/rust/util/rust-token-converter.cc b/gcc/rust/util/rust-token-converter.cc index 3206ced..ffda24e 100644 --- a/gcc/rust/util/rust-token-converter.cc +++ b/gcc/rust/util/rust-token-converter.cc @@ -269,7 +269,7 @@ from_tokenstream (const ProcMacro::TokenStream &ts, static void from_ident (const ProcMacro::Ident &ident, std::vector<const_TokenPtr> &result) { - std::string value (reinterpret_cast<const char *> (ident.val), ident.len); + std::string value (ident.value.to_string ()); if (ident.is_raw) value = "r#" + value; diff --git a/libgrust/libproc_macro/ident.cc b/libgrust/libproc_macro/ident.cc index 6c8472d..221d38e 100644 --- a/libgrust/libproc_macro/ident.cc +++ b/libgrust/libproc_macro/ident.cc @@ -28,15 +28,15 @@ namespace ProcMacro { extern "C" { Ident -Ident__new (unsigned char *str, std::uint64_t len, Span span) +Ident__new (FFIString str, Span span) { - return Ident::make_ident (str, len, span); + return Ident::make_ident (str, span); } Ident -Ident__new_raw (unsigned char *str, std::uint64_t len, Span span) +Ident__new_raw (FFIString str, Span span) { - return Ident::make_ident (str, len, span, true); + return Ident::make_ident (str, span, true); } void @@ -55,35 +55,25 @@ Ident__clone (const Ident *ident) Ident Ident::clone () const { - unsigned char *val = new unsigned char[this->len]; - // 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}; + return {this->is_raw, value.clone (), this->span}; } Ident Ident::make_ident (std::string str, Span span, bool raw) { - return Ident::make_ident (reinterpret_cast<const unsigned char *> ( - str.c_str ()), - str.length (), span, raw); + return Ident::make_ident (FFIString::make_ffistring (str), span, raw); } Ident -Ident::make_ident (const unsigned char *str, std::uint64_t len, Span span, - bool raw) +Ident::make_ident (FFIString str, Span span, bool raw) { - unsigned char *val = new unsigned char[len]; - // FIXME: UTF-8 Update this with sizeof codepoint instead - std::memcpy (val, str, len * sizeof (char)); - return {raw, val, len}; + return {raw, str, span}; } void Ident::drop (Ident *ident) { - delete[] ident->val; - ident->len = 0; + FFIString::drop (&ident->value); } } // namespace ProcMacro diff --git a/libgrust/libproc_macro/ident.h b/libgrust/libproc_macro/ident.h index 28d6ebe..66547d9 100644 --- a/libgrust/libproc_macro/ident.h +++ b/libgrust/libproc_macro/ident.h @@ -27,23 +27,20 @@ #include <string> #include "span.h" +#include "ffistring.h" namespace ProcMacro { struct Ident { bool is_raw; - // TODO: Adapt this to UTF-8 - unsigned char *val; - // Length in bytes - std::uint64_t len; + FFIString value; Span span; public: Ident clone () const; static Ident make_ident (std::string str, Span span, bool raw = false); - static Ident make_ident (const unsigned char *str, std::uint64_t len, - Span span, bool raw = false); + static Ident make_ident (FFIString str, Span span, bool raw = false); static void drop (Ident *ident); }; @@ -51,10 +48,10 @@ public: extern "C" { Ident -Ident__new (unsigned char *str, std::uint64_t len, Span span); +Ident__new (FFIString str, Span span); Ident -Ident__new_raw (unsigned char *str, std::uint64_t len, Span span); +Ident__new_raw (FFIString str, Span span); void Ident__drop (Ident *ident); |