diff options
author | Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com> | 2023-07-27 15:57:07 +0200 |
---|---|---|
committer | P-E-P <32375388+P-E-P@users.noreply.github.com> | 2023-07-28 09:15:21 +0000 |
commit | 69454e53048e24c80c725f4258d6dfd13f7ed023 (patch) | |
tree | be245238f3df3093098da69e50dfa4b7bdff362e | |
parent | 9b62bc32f58925e9d74fdb11e13fad23c6d9d3e8 (diff) | |
download | gcc-69454e53048e24c80c725f4258d6dfd13f7ed023.zip gcc-69454e53048e24c80c725f4258d6dfd13f7ed023.tar.gz gcc-69454e53048e24c80c725f4258d6dfd13f7ed023.tar.bz2 |
converter: Move literal conversion out
The literal conversion code could be used for the literal_from_string
callback, this means we should move it out of the function in it's own
function. This involves a new switch, which is quite sad but we're not
yet at a performance profiling phase, there may be lower hanging fruits.
gcc/rust/ChangeLog:
* util/rust-token-converter.cc (handle_suffix): Rework function
to make it work with the new literal conversion function.
(convert_literal): Add a new function to convert to a proc macro
literal from a literal tokenptr. The function will abort if the
pointer does not point to a literal.
(convert): Add call to convert literal for every literal case.
* util/rust-token-converter.h (convert_literal): Add public
prototype.
Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
-rw-r--r-- | gcc/rust/util/rust-token-converter.cc | 60 | ||||
-rw-r--r-- | gcc/rust/util/rust-token-converter.h | 3 |
2 files changed, 36 insertions, 27 deletions
diff --git a/gcc/rust/util/rust-token-converter.cc b/gcc/rust/util/rust-token-converter.cc index 67c1459..e0794f38 100644 --- a/gcc/rust/util/rust-token-converter.cc +++ b/gcc/rust/util/rust-token-converter.cc @@ -63,16 +63,41 @@ convert (ProcMacro::Span span) return span.start; } -static void -handle_suffix (ProcMacro::TokenStream &ts, const const_TokenPtr &token, - ProcMacro::LitKind kind) +static ProcMacro::Literal +handle_suffix (const const_TokenPtr &token, ProcMacro::LitKind kind) { auto str = token->as_string (); auto lookup = suffixes.lookup (token->get_type_hint ()); auto suffix = suffixes.is_iter_ok (lookup) ? lookup->second : ""; - ts.push (ProcMacro::TokenTree::make_tokentree ( - ProcMacro::Literal::make_literal (kind, convert (token->get_locus ()), str, - suffix))); + return ProcMacro::Literal::make_literal (kind, convert (token->get_locus ()), + str, suffix); +} + +ProcMacro::Literal +convert_literal (const_TokenPtr lit) +{ + auto loc = convert (lit->get_locus ()); + switch (lit->get_id ()) + { + case FLOAT_LITERAL: + return handle_suffix (lit, ProcMacro::LitKind::make_float ()); + case INT_LITERAL: + return handle_suffix (lit, ProcMacro::LitKind::make_integer ()); + case CHAR_LITERAL: + return ProcMacro::Literal::make_literal (ProcMacro::LitKind::make_char (), + loc, lit->as_string ()); + case STRING_LITERAL: + return ProcMacro::Literal::make_literal (ProcMacro::LitKind::make_str (), + loc, lit->as_string ()); + case BYTE_CHAR_LITERAL: + return ProcMacro::Literal::make_literal (ProcMacro::LitKind::make_byte (), + loc, lit->as_string ()); + case BYTE_STRING_LITERAL: + return ProcMacro::Literal::make_literal ( + ProcMacro::LitKind::make_byte_str (), loc, lit->as_string ()); + default: + rust_unreachable (); + } } ProcMacro::TokenStream @@ -87,32 +112,13 @@ convert (const std::vector<const_TokenPtr> &tokens) { // Literals case FLOAT_LITERAL: - handle_suffix (trees.back (), token, - ProcMacro::LitKind::make_float ()); - break; case INT_LITERAL: - handle_suffix (trees.back (), token, - ProcMacro::LitKind::make_integer ()); - break; case CHAR_LITERAL: - trees.back ().push (ProcMacro::TokenTree::make_tokentree ( - ProcMacro::Literal::make_literal (ProcMacro::LitKind::make_char (), - loc, token->as_string ()))); - break; case STRING_LITERAL: - trees.back ().push (ProcMacro::TokenTree::make_tokentree ( - ProcMacro::Literal::make_literal (ProcMacro::LitKind::make_str (), - loc, token->as_string ()))); - break; case BYTE_CHAR_LITERAL: - trees.back ().push (ProcMacro::TokenTree::make_tokentree ( - ProcMacro::Literal::make_literal (ProcMacro::LitKind::make_byte (), - loc, token->as_string ()))); - break; case BYTE_STRING_LITERAL: - trees.back ().push (ProcMacro::TokenTree::make_tokentree ( - ProcMacro::Literal::make_literal ( - ProcMacro::LitKind::make_byte_str (), loc, token->as_string ()))); + trees.back ().push ( + ProcMacro::TokenTree::make_tokentree (convert_literal (token))); break; // Ident case IDENTIFIER: diff --git a/gcc/rust/util/rust-token-converter.h b/gcc/rust/util/rust-token-converter.h index 75b3b38..3e9feeb 100644 --- a/gcc/rust/util/rust-token-converter.h +++ b/gcc/rust/util/rust-token-converter.h @@ -29,6 +29,9 @@ convert (const std::vector<const_TokenPtr> &tokens); std::vector<const_TokenPtr> convert (const ProcMacro::TokenStream &ts); +ProcMacro::Literal +convert_literal (const_TokenPtr lit); + } // namespace Rust #endif /* ! RUST_TOKEN_CONVERTER_H */ |