Skip to content

Commit dd59cd1

Browse files
committed
Support for CxxVector<*mut T> and CxxVector<*const T>
1 parent a7898a2 commit dd59cd1

File tree

14 files changed

+893
-110
lines changed

14 files changed

+893
-110
lines changed

gen/src/write.rs

Lines changed: 46 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use crate::gen::nested::NamespaceEntries;
33
use crate::gen::out::OutFile;
44
use crate::gen::{builtin, include, Opt};
55
use crate::syntax::atom::Atom::{self, *};
6-
use crate::syntax::instantiate::{ImplKey, NamedImplKey};
6+
use crate::syntax::instantiate::{CxxVectorPayloadImplKey, ImplKey, NamedImplKey, PtrMutability};
77
use crate::syntax::map::UnorderedMap as Map;
88
use crate::syntax::set::UnorderedSet;
99
use crate::syntax::symbol::{self, Symbol};
@@ -1352,6 +1352,7 @@ fn write_space_after_type(out: &mut OutFile, ty: &Type) {
13521352
enum UniquePtr<'a> {
13531353
Ident(&'a Ident),
13541354
CxxVector(&'a Ident),
1355+
CxxVectorPtr(PtrMutability, &'a Ident),
13551356
}
13561357

13571358
trait ToTypename {
@@ -1371,6 +1372,17 @@ impl<'a> ToTypename for UniquePtr<'a> {
13711372
UniquePtr::CxxVector(element) => {
13721373
format!("::std::vector<{}>", element.to_typename(types))
13731374
}
1375+
UniquePtr::CxxVectorPtr(mutability, element) => {
1376+
let const_prefix = match mutability {
1377+
PtrMutability::Const => "const ",
1378+
PtrMutability::Mut => "",
1379+
};
1380+
format!(
1381+
"::std::vector<{}{}*>",
1382+
const_prefix,
1383+
element.to_typename(types)
1384+
)
1385+
}
13741386
}
13751387
}
13761388
}
@@ -1392,6 +1404,13 @@ impl<'a> ToMangled for UniquePtr<'a> {
13921404
UniquePtr::CxxVector(element) => {
13931405
symbol::join(&[&"std", &"vector", &element.to_mangled(types)])
13941406
}
1407+
UniquePtr::CxxVectorPtr(mutability, element) => {
1408+
let prefix = match mutability {
1409+
PtrMutability::Const => "ptrc",
1410+
PtrMutability::Mut => "ptrm",
1411+
};
1412+
symbol::join(&[&"std", &"vector", &prefix, &element.to_mangled(types)])
1413+
}
13951414
}
13961415
}
13971416
}
@@ -1412,7 +1431,7 @@ fn write_generic_instantiations(out: &mut OutFile) {
14121431
ImplKey::UniquePtr(ident) => write_unique_ptr(out, ident),
14131432
ImplKey::SharedPtr(ident) => write_shared_ptr(out, ident),
14141433
ImplKey::WeakPtr(ident) => write_weak_ptr(out, ident),
1415-
ImplKey::CxxVector(ident) => write_cxx_vector(out, ident),
1434+
ImplKey::CxxVector(payload) => write_cxx_vector(out, payload),
14161435
}
14171436
}
14181437
out.end_block(Block::ExternC);
@@ -1639,21 +1658,21 @@ fn write_unique_ptr_common(out: &mut OutFile, ty: UniquePtr) {
16391658
// bindings for a "new" method anyway. But the Rust code can't be called
16401659
// for Opaque types because the 'new' method is not implemented.
16411660
UniquePtr::Ident(ident) => out.types.is_maybe_trivial(ident),
1642-
UniquePtr::CxxVector(_) => false,
1661+
UniquePtr::CxxVector(_) | UniquePtr::CxxVectorPtr(..) => false,
16431662
};
16441663

16451664
let conditional_delete = match ty {
16461665
UniquePtr::Ident(ident) => {
16471666
!out.types.structs.contains_key(ident) && !out.types.enums.contains_key(ident)
16481667
}
1649-
UniquePtr::CxxVector(_) => false,
1668+
UniquePtr::CxxVector(_) | UniquePtr::CxxVectorPtr(..) => false,
16501669
};
16511670

16521671
if conditional_delete {
16531672
out.builtin.is_complete = true;
16541673
let definition = match ty {
16551674
UniquePtr::Ident(ty) => &out.types.resolve(ty).name.cxx,
1656-
UniquePtr::CxxVector(_) => unreachable!(),
1675+
UniquePtr::CxxVector(_) | UniquePtr::CxxVectorPtr(..) => unreachable!(),
16571676
};
16581677
writeln!(
16591678
out,
@@ -1895,7 +1914,17 @@ fn write_weak_ptr(out: &mut OutFile, key: NamedImplKey) {
18951914
writeln!(out, "}}");
18961915
}
18971916

1898-
fn write_cxx_vector(out: &mut OutFile, key: NamedImplKey) {
1917+
fn write_cxx_vector(out: &mut OutFile, payload: CxxVectorPayloadImplKey) {
1918+
let (key, ptr_prefix, unique_ptr_payload) = match payload {
1919+
CxxVectorPayloadImplKey::Named(id) => (id, "", UniquePtr::CxxVector(id.rust)),
1920+
CxxVectorPayloadImplKey::Ptr(id, mutability) => {
1921+
let prefix = match mutability {
1922+
PtrMutability::Const => "ptrc$",
1923+
PtrMutability::Mut => "ptrm$",
1924+
};
1925+
(id, prefix, UniquePtr::CxxVectorPtr(mutability, id.rust))
1926+
}
1927+
};
18991928
let element = key.rust;
19001929
let inner = element.to_typename(out.types);
19011930
let instance = element.to_mangled(out.types);
@@ -1907,26 +1936,26 @@ fn write_cxx_vector(out: &mut OutFile, key: NamedImplKey) {
19071936
begin_function_definition(out);
19081937
writeln!(
19091938
out,
1910-
"::std::vector<{}> *cxxbridge1$std$vector${}$new() noexcept {{",
1911-
inner, instance,
1939+
"::std::vector<{}> *cxxbridge1$std$vector${}{}$new() noexcept {{",
1940+
inner, ptr_prefix, instance,
19121941
);
19131942
writeln!(out, " return new ::std::vector<{}>();", inner);
19141943
writeln!(out, "}}");
19151944

19161945
begin_function_definition(out);
19171946
writeln!(
19181947
out,
1919-
"::std::size_t cxxbridge1$std$vector${}$size(::std::vector<{}> const &s) noexcept {{",
1920-
instance, inner,
1948+
"::std::size_t cxxbridge1$std$vector${}{}$size(const ::std::vector<{}> &s) noexcept {{",
1949+
ptr_prefix, instance, inner,
19211950
);
19221951
writeln!(out, " return s.size();");
19231952
writeln!(out, "}}");
19241953

19251954
begin_function_definition(out);
19261955
writeln!(
19271956
out,
1928-
"{} *cxxbridge1$std$vector${}$get_unchecked(::std::vector<{}> *s, ::std::size_t pos) noexcept {{",
1929-
inner, instance, inner,
1957+
"{} *cxxbridge1$std$vector${}{}$get_unchecked(::std::vector<{}> *s, ::std::size_t pos) noexcept {{",
1958+
inner, ptr_prefix, instance, inner,
19301959
);
19311960
writeln!(out, " return &(*s)[pos];");
19321961
writeln!(out, "}}");
@@ -1935,8 +1964,8 @@ fn write_cxx_vector(out: &mut OutFile, key: NamedImplKey) {
19351964
begin_function_definition(out);
19361965
writeln!(
19371966
out,
1938-
"void cxxbridge1$std$vector${}$push_back(::std::vector<{}> *v, {} *value) noexcept {{",
1939-
instance, inner, inner,
1967+
"void cxxbridge1$std$vector${}{}$push_back(::std::vector<{}> *v, {} *value) noexcept {{",
1968+
ptr_prefix, instance, inner, inner,
19401969
);
19411970
writeln!(out, " v->push_back(::std::move(*value));");
19421971
writeln!(out, " ::rust::destroy(value);");
@@ -1945,14 +1974,14 @@ fn write_cxx_vector(out: &mut OutFile, key: NamedImplKey) {
19451974
begin_function_definition(out);
19461975
writeln!(
19471976
out,
1948-
"void cxxbridge1$std$vector${}$pop_back(::std::vector<{}> *v, {} *out) noexcept {{",
1949-
instance, inner, inner,
1977+
"void cxxbridge1$std$vector${}{}$pop_back(::std::vector<{}> *v, {} *out) noexcept {{",
1978+
ptr_prefix, instance, inner, inner,
19501979
);
19511980
writeln!(out, " ::new (out) {}(::std::move(v->back()));", inner);
19521981
writeln!(out, " v->pop_back();");
19531982
writeln!(out, "}}");
19541983
}
19551984

19561985
out.include.memory = true;
1957-
write_unique_ptr_common(out, UniquePtr::CxxVector(element));
1986+
write_unique_ptr_common(out, unique_ptr_payload);
19581987
}

0 commit comments

Comments
 (0)