diff options
author | Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com> | 2023-07-27 16:21:25 +0200 |
---|---|---|
committer | P-E-P <32375388+P-E-P@users.noreply.github.com> | 2023-07-28 09:15:21 +0000 |
commit | fe6ad2e676ee5734856d86cf1dbbc12aef7e5561 (patch) | |
tree | b7844fb216a15b089864aafef98f20f65b6e4157 | |
parent | 69454e53048e24c80c725f4258d6dfd13f7ed023 (diff) | |
download | gcc-fe6ad2e676ee5734856d86cf1dbbc12aef7e5561.zip gcc-fe6ad2e676ee5734856d86cf1dbbc12aef7e5561.tar.gz gcc-fe6ad2e676ee5734856d86cf1dbbc12aef7e5561.tar.bz2 |
proc_macro: Add literal_from_string callback
The function to get a literal from a string missed an implementation.
It did require a conversion function to achieve it, now that callback
system has been merged this function can be easily implemented.
gcc/rust/ChangeLog:
* expand/rust-proc-macro.cc (literal_from_string): Add callback
function.
(load_macros_array): Likewise.
ChangeLog:
* libgrust/libproc_macro/literal.cc (Literal__from_string): Add
implementation with call to constructor.
(Literal::make_literal): Add new constructor which calls the
callback.
* libgrust/libproc_macro/literal.h: Add new constructor's
prototype.
* libgrust/libproc_macro/proc_macro.cc (bridge_is_available):
Change symbol name to match convention.
* libgrust/libproc_macro/registration.h: Add lit_from_str
symbol.
* libgrust/libproc_macro/tokenstream.cc (TokenStream::make_tokenstream):
Change symbol name to disambiguate with literal from string.
Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
-rw-r--r-- | gcc/rust/expand/rust-proc-macro.cc | 30 | ||||
-rw-r--r-- | libgrust/libproc_macro/literal.cc | 16 | ||||
-rw-r--r-- | libgrust/libproc_macro/literal.h | 1 | ||||
-rw-r--r-- | libgrust/libproc_macro/proc_macro.cc | 8 | ||||
-rw-r--r-- | libgrust/libproc_macro/registration.h | 9 | ||||
-rw-r--r-- | libgrust/libproc_macro/tokenstream.cc | 2 |
6 files changed, 52 insertions, 14 deletions
diff --git a/gcc/rust/expand/rust-proc-macro.cc b/gcc/rust/expand/rust-proc-macro.cc index c664e20..69de989 100644 --- a/gcc/rust/expand/rust-proc-macro.cc +++ b/gcc/rust/expand/rust-proc-macro.cc @@ -28,6 +28,22 @@ const std::string PROC_MACRO_DECL_PREFIX = "__gccrs_proc_macro_decls_"; namespace { +ProcMacro::Literal +literal_from_string (const std::string &data, bool &error) +{ + Lexer lex (data); + const_TokenPtr output = lex.build_token (); + if (output == nullptr || !output->is_literal ()) + { + error = true; + // We should probably rework this + return ProcMacro::Literal::make_usize (0); + } + + error = false; + return convert_literal (output); +} + ProcMacro::TokenStream tokenstream_from_string (std::string &data, bool &lex_error) { @@ -55,7 +71,12 @@ tokenstream_from_string (std::string &data, bool &lex_error) static_assert ( std::is_same<decltype (tokenstream_from_string) *, - ProcMacro::from_str_function_t>::value, + ProcMacro::ts_from_str_fn_t>::value, + "Registration callback signature not synced, check proc macro internals."); + +static_assert ( + std::is_same<decltype (literal_from_string) *, + ProcMacro::lit_from_str_fn_t>::value, "Registration callback signature not synced, check proc macro internals."); } // namespace @@ -96,10 +117,13 @@ load_macros_array (std::string path) return nullptr; } - if (!REGISTER_CALLBACK (handle, __gccrs_proc_macro_from_str_fn, + if (!REGISTER_CALLBACK (handle, __gccrs_proc_macro_ts_from_str_, tokenstream_from_string)) return nullptr; - if (!REGISTER_CALLBACK (handle, __gccrs_proc_macro_is_available_fn, + if (!REGISTER_CALLBACK (handle, __gccrs_proc_macro_lit_from_str_, + literal_from_string)) + return nullptr; + if (!REGISTER_CALLBACK (handle, __gccrs_proc_macro_is_available_, ProcMacro::BridgeState::Available)) return nullptr; diff --git a/libgrust/libproc_macro/literal.cc b/libgrust/libproc_macro/literal.cc index 8e1e0a4..ea09106 100644 --- a/libgrust/libproc_macro/literal.cc +++ b/libgrust/libproc_macro/literal.cc @@ -24,15 +24,19 @@ #include <cstring> #include <cstdlib> +#include "registration.h" + namespace ProcMacro { extern "C" { bool Literal__from_string (FFIString str, Literal *lit) { - // FIXME: implement this function with lexer - std::abort (); - return false; + bool result; + auto source = str.to_string (); + + *lit = Literal::make_literal (source, result); + return result; } } @@ -50,6 +54,12 @@ Literal::clone () const } Literal +Literal::make_literal (const std::string &text, bool &has_error) +{ + return __gccrs_proc_macro_lit_from_str_ (text, has_error); +} + +Literal Literal::make_literal (LitKind kind, Span span, const std::string &text, const std::string &suffix) { diff --git a/libgrust/libproc_macro/literal.h b/libgrust/libproc_macro/literal.h index fb8a8b4..37ba089 100644 --- a/libgrust/libproc_macro/literal.h +++ b/libgrust/libproc_macro/literal.h @@ -77,6 +77,7 @@ public: Literal clone () const; bool has_suffix () const { return suffix.len != 0; }; + static Literal make_literal (const std::string &text, bool &has_error); static Literal make_literal (const LitKind kind, Span span, const std::string &text, const std::string &suffix = ""); diff --git a/libgrust/libproc_macro/proc_macro.cc b/libgrust/libproc_macro/proc_macro.cc index 293fc95..0490673 100644 --- a/libgrust/libproc_macro/proc_macro.cc +++ b/libgrust/libproc_macro/proc_macro.cc @@ -53,12 +53,12 @@ Procmacro::make_bang (const char *name, BangMacro macro) extern "C" bool bridge_is_available () { - return __gccrs_proc_macro_is_available_fn - == ProcMacro::BridgeState::Available; + return __gccrs_proc_macro_is_available_ == ProcMacro::BridgeState::Available; } } // namespace ProcMacro -ProcMacro::from_str_function_t __gccrs_proc_macro_from_str_fn = nullptr; -ProcMacro::BridgeState __gccrs_proc_macro_is_available_fn +ProcMacro::ts_from_str_fn_t __gccrs_proc_macro_ts_from_str_ = nullptr; +ProcMacro::lit_from_str_fn_t __gccrs_proc_macro_lit_from_str_ = nullptr; +ProcMacro::BridgeState __gccrs_proc_macro_is_available_ = ProcMacro::BridgeState::Unavailable; diff --git a/libgrust/libproc_macro/registration.h b/libgrust/libproc_macro/registration.h index aba7edd..98e7c13 100644 --- a/libgrust/libproc_macro/registration.h +++ b/libgrust/libproc_macro/registration.h @@ -26,14 +26,17 @@ #include <string> #include "tokenstream.h" #include "bridge.h" +#include "literal.h" namespace ProcMacro { -using from_str_function_t = ProcMacro::TokenStream (*) (std::string &, bool &); +using ts_from_str_fn_t = ProcMacro::TokenStream (*) (std::string &, bool &); +using lit_from_str_fn_t = ProcMacro::Literal (*) (const std::string &, bool &); } // namespace ProcMacro -extern "C" ProcMacro::from_str_function_t __gccrs_proc_macro_from_str_fn; -extern "C" ProcMacro::BridgeState __gccrs_proc_macro_is_available_fn; +extern "C" ProcMacro::ts_from_str_fn_t __gccrs_proc_macro_ts_from_str_; +extern "C" ProcMacro::lit_from_str_fn_t __gccrs_proc_macro_lit_from_str_; +extern "C" ProcMacro::BridgeState __gccrs_proc_macro_is_available_; #endif /* !REGISTRATION_H */ diff --git a/libgrust/libproc_macro/tokenstream.cc b/libgrust/libproc_macro/tokenstream.cc index 0f7f1f2..685f284 100644 --- a/libgrust/libproc_macro/tokenstream.cc +++ b/libgrust/libproc_macro/tokenstream.cc @@ -49,7 +49,7 @@ TokenStream::make_tokenstream (std::uint64_t capacity) TokenStream TokenStream::make_tokenstream (std::string &source, bool &has_error) { - return __gccrs_proc_macro_from_str_fn (source, has_error); + return __gccrs_proc_macro_ts_from_str_ (source, has_error); } void |