aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>2023-07-27 15:57:07 +0200
committerP-E-P <32375388+P-E-P@users.noreply.github.com>2023-07-28 09:15:21 +0000
commit69454e53048e24c80c725f4258d6dfd13f7ed023 (patch)
treebe245238f3df3093098da69e50dfa4b7bdff362e
parent9b62bc32f58925e9d74fdb11e13fad23c6d9d3e8 (diff)
downloadgcc-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.cc60
-rw-r--r--gcc/rust/util/rust-token-converter.h3
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 */