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 <pierre-emmanuel.patry@embecosm.com>
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)
{
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
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;
#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;
}
}
return {this->kind, this->text.clone (), this->suffix.clone (), this->span};
}
+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)
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 = "");
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;
#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 */
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