aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>2023-07-19 11:50:23 +0200
committerP-E-P <32375388+P-E-P@users.noreply.github.com>2023-07-19 15:03:42 +0000
commit4332fbfaec8b6b66efa737c92d191003a76264bf (patch)
treecc17cf25f5619d6fd0a0004fa6a37fecdaa49b35
parent04c9af6d0f2d38504a5add30c44a348a91af4b57 (diff)
downloadgcc-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.cc2
-rw-r--r--libgrust/libproc_macro/ident.cc28
-rw-r--r--libgrust/libproc_macro/ident.h13
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);