From 0680907b3b19273b908c91306932abbf82f85cce Mon Sep 17 00:00:00 2001 From: Pierre-Emmanuel Patry Date: Thu, 27 Jul 2023 16:21:25 +0200 Subject: gccrs: 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. libgrust/ChangeLog: * libproc_macro/literal.cc (Literal__from_string): Add implementation with call to constructor. (Literal::make_literal): Add new constructor which calls the callback. * libproc_macro/literal.h: Add new constructor's prototype. * libproc_macro/proc_macro.cc (bridge_is_available): Change symbol name to match convention. * libproc_macro/registration.h: Add lit_from_str symbol. * libproc_macro/tokenstream.cc (TokenStream::make_tokenstream): Change symbol name to disambiguate with literal from string. Signed-off-by: Pierre-Emmanuel Patry --- gcc/rust/expand/rust-proc-macro.cc | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) (limited to 'gcc') 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::value, + ProcMacro::ts_from_str_fn_t>::value, + "Registration callback signature not synced, check proc macro internals."); + +static_assert ( + std::is_same::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; -- cgit v1.1