Skip to content

Commit

Permalink
Fix ffi and enum conventions
Browse files Browse the repository at this point in the history
gcc/rust/ChangeLog:

	* ast/rust-fmt.h (enum ParseMode):
	Drop typedef in Cpp

libgrust/ChangeLog:

	* libformat_parser/generic_format_parser/src/lib.rs:
	Remove repr(C)
	* libformat_parser/src/bin.rs: Use ffi
	* libformat_parser/src/lib.rs: pub ffi, create ParseMode and match
	rustc's parse mode
  • Loading branch information
badumbatish authored and CohenArthur committed Jul 24, 2024
1 parent a79d297 commit 0d0530b
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 25 deletions.
6 changes: 3 additions & 3 deletions gcc/rust/ast/rust-fmt.h
Original file line number Diff line number Diff line change
Expand Up @@ -258,11 +258,11 @@ struct FormatArgsHandle
RustString rust_string;
};

typedef enum
enum ParseMode
{
Format,
Format = 0,
InlineAsm,
} ParseMode;
};

extern "C" {

Expand Down
1 change: 0 additions & 1 deletion libgrust/libformat_parser/generic_format_parser/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,6 @@ enum InputStringKind {
}

/// The type of format string that we are parsing.
#[repr(C)]
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub enum ParseMode {
/// A normal format string as per `format_args!`.
Expand Down
2 changes: 1 addition & 1 deletion libgrust/libformat_parser/src/bin.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,6 @@ fn main() {
None,
None,
false,
generic_format_parser::ParseMode::Format
libformat_parser::ffi::ParseMode::Format,
));
}
43 changes: 23 additions & 20 deletions libgrust/libformat_parser/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ where
// FIXME: Make an ffi module in a separate file
// FIXME: Remember to leak the boxed type somehow
// FIXME: How to encode the Option type? As a pointer? Option<T> -> Option<&T> -> *const T could work maybe?
mod ffi {
pub mod ffi {
use super::IntoFFI;

// FIXME: We need to ensure we deal with memory properly - whether it's owned by the C++ side or the Rust side
Expand Down Expand Up @@ -79,14 +79,14 @@ mod ffi {

// TODO: Not needed for now?
// /// The type of format string that we are parsing.
// #[derive(Copy, Clone, Debug, Eq, PartialEq)]
// #[repr(C)]
// pub enum ParseMode {
// /// A normal format string as per `format_args!`.
// Format,
// /// An inline assembly template string for `asm!`.
// InlineAsm,
// }
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
#[repr(C)]
pub enum ParseMode {
/// A normal format string as per `format_args!`.
Format = 0,
/// An inline assembly template string for `asm!`.
InlineAsm,
}

/// A piece is a portion of the format string which represents the next part
/// to emit. These are emitted as a stream by the `Parser` class.
Expand Down Expand Up @@ -327,17 +327,20 @@ mod ffi {

// FIXME: Rename?
pub mod rust {
use generic_format_parser::{ParseMode, Parser, Piece};

use crate::ffi::ParseMode;
use generic_format_parser::{Parser, Piece};
pub fn collect_pieces(
input: &str,
style: Option<usize>,
snippet: Option<String>,
append_newline: bool,
parse_mode: ParseMode
parse_mode: ParseMode,
) -> Vec<Piece<'_>> {
let parser = Parser::new(input, style, snippet, append_newline, parse_mode);

let converted_parse_mode = match parse_mode {
ParseMode::Format => generic_format_parser::ParseMode::Format,
ParseMode::InlineAsm => generic_format_parser::ParseMode::InlineAsm,
};
let parser = Parser::new(input, style, snippet, append_newline, converted_parse_mode);
parser.into_iter().collect()
}
}
Expand All @@ -361,12 +364,11 @@ pub struct RustString {
#[repr(C)]
pub struct FormatArgsHandle(PieceSlice, RustString);


#[no_mangle]
pub extern "C" fn collect_pieces(
input: *const libc::c_char,
append_newline: bool,
parse_mode : generic_format_parser::ParseMode
parse_mode: crate::ffi::ParseMode,
) -> FormatArgsHandle {
// FIXME: Add comment
let str = unsafe { CStr::from_ptr(input) };
Expand All @@ -379,10 +381,11 @@ pub extern "C" fn collect_pieces(
let s = unsafe { std::mem::transmute::<&'_ str, &'static str>(s) };

// FIXME: No unwrap
let pieces: Vec<ffi::Piece<'_>> = rust::collect_pieces(s, None, None, append_newline, parse_mode)
.into_iter()
.map(Into::into)
.collect();
let pieces: Vec<ffi::Piece<'_>> =
rust::collect_pieces(s, None, None, append_newline, parse_mode)
.into_iter()
.map(Into::into)
.collect();

let piece_slice = PieceSlice {
len: pieces.len(),
Expand Down

0 comments on commit 0d0530b

Please sign in to comment.