diff --git a/libgrust/libproc_macro/ident.cc b/libgrust/libproc_macro/ident.cc index 6ea70dc0823..6ad9e7807f1 100644 --- a/libgrust/libproc_macro/ident.cc +++ b/libgrust/libproc_macro/ident.cc @@ -27,17 +27,13 @@ extern "C" { Ident Ident__new (unsigned char *str, std::uint64_t len) { - unsigned char *val = new unsigned char[len]; - std::memcpy (val, str, len); - return {false, val, len}; + return Ident::make_ident (str, len); } Ident Ident__new_raw (unsigned char *str, std::uint64_t len) { - unsigned char *val = new unsigned char[len]; - std::memcpy (val, str, len); - return {true, val, len}; + return Ident::make_ident (str, len, true); } void @@ -49,8 +45,30 @@ Ident__drop (Ident *ident) Ident Ident__clone (const Ident *ident) { - unsigned char *val = new unsigned char[ident->len]; - std::memcpy (val, ident->val, ident->len); - return {ident->is_raw, val, ident->len}; + return ident->clone (); } } + +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}; +} + +Ident +Ident::make_ident (std::string str, bool raw) +{ + return Ident::make_ident (reinterpret_cast ( + str.c_str ()), + str.length (), raw); +} + +Ident +Ident::make_ident (const unsigned char *str, std::uint64_t len, bool raw) +{ + unsigned char *val = new unsigned char[len]; + std::memcpy (val, str, len); + return {raw, val, len}; +} diff --git a/libgrust/libproc_macro/ident.h b/libgrust/libproc_macro/ident.h index 0a4b4f88bad..8ab7e6dc324 100644 --- a/libgrust/libproc_macro/ident.h +++ b/libgrust/libproc_macro/ident.h @@ -33,6 +33,12 @@ struct Ident unsigned char *val; // Length in bytes std::uint64_t len; + +public: + Ident clone () const; + static Ident make_ident (std::string str, bool raw = false); + static Ident make_ident (const unsigned char *str, std::uint64_t len, + bool raw = false); }; extern "C" {