use crate::machine::loader::LiveLoadState;
use crate::machine::machine_indices::*;
use crate::machine::streams::*;
+use crate::parser::char_reader::CharReader;
use crate::raw_block::*;
use crate::rcu::Rcu;
use crate::rcu::RcuRef;
allocated_ptr
}
+
+ /// # Safety
+ /// - ptr points to an allocated slab of the correct kind
+ unsafe fn dealloc(ptr: NonNull<TypedAllocSlab<Self>>) {
+ drop(unsafe { Box::from_raw(ptr.as_ptr()) });
+ }
}
#[derive(Debug)]
unsafe fn drop_slab_in_place(value: NonNull<AllocSlab>) {
macro_rules! drop_typed_slab_in_place {
($payload: ty, $value: expr) => {
- drop(Box::from_raw(
- $value.as_ptr().cast::<TypedAllocSlab<$payload>>(),
- ));
+ <$payload as ArenaAllocated>::dealloc($value.cast::<TypedAllocSlab<$payload>>())
};
}
drop_typed_slab_in_place!(Rational, value);
}
ArenaHeaderTag::InputFileStream => {
- drop_typed_slab_in_place!(InputFileStream, value);
+ drop_typed_slab_in_place!(StreamLayout<CharReader<InputFileStream>>, value);
}
ArenaHeaderTag::OutputFileStream => {
- drop_typed_slab_in_place!(OutputFileStream, value);
+ drop_typed_slab_in_place!(StreamLayout<OutputFileStream>, value);
}
ArenaHeaderTag::NamedTcpStream => {
- drop_typed_slab_in_place!(NamedTcpStream, value);
+ drop_typed_slab_in_place!(StreamLayout<CharReader<NamedTcpStream>>, value);
}
ArenaHeaderTag::NamedTlsStream => {
#[cfg(feature = "tls")]
- drop_typed_slab_in_place!(NamedTlsStream, value);
+ drop_typed_slab_in_place!(StreamLayout<CharReader<NamedTlsStream>>, value);
}
ArenaHeaderTag::HttpReadStream => {
#[cfg(feature = "http")]
- drop_typed_slab_in_place!(HttpReadStream, value);
+ drop_typed_slab_in_place!(StreamLayout<CharReader<HttpReadStream>>, value);
}
ArenaHeaderTag::HttpWriteStream => {
#[cfg(feature = "http")]
- drop_typed_slab_in_place!(HttpWriteStream, value);
+ drop_typed_slab_in_place!(StreamLayout<CharReader<HttpWriteStream>>, value);
}
ArenaHeaderTag::ReadlineStream => {
- drop_typed_slab_in_place!(ReadlineStream, value);
+ drop_typed_slab_in_place!(StreamLayout<ReadlineStream>, value);
}
ArenaHeaderTag::StaticStringStream => {
- drop_typed_slab_in_place!(StaticStringStream, value);
+ drop_typed_slab_in_place!(StreamLayout<StaticStringStream>, value);
}
ArenaHeaderTag::ByteStream => {
- drop_typed_slab_in_place!(ByteStream, value);
+ drop_typed_slab_in_place!(StreamLayout<CharReader<ByteStream>>, value);
}
ArenaHeaderTag::LiveLoadState | ArenaHeaderTag::InactiveLoadState => {
drop_typed_slab_in_place!(LiveLoadState, value);
drop_typed_slab_in_place!(HttpResponse, value);
}
ArenaHeaderTag::StandardOutputStream => {
- drop_typed_slab_in_place!(StandardOutputStream, value);
+ drop_typed_slab_in_place!(StreamLayout<StandardOutputStream>, value);
}
ArenaHeaderTag::StandardErrorStream => {
- drop_typed_slab_in_place!(StandardErrorStream, value);
+ drop_typed_slab_in_place!(StreamLayout<StandardErrorStream>, value);
}
ArenaHeaderTag::NullStream
| ArenaHeaderTag::IndexPtrUndefined
}
#[test]
- #[cfg_attr(miri, ignore = "blocked on streams.rs UB")]
fn heap_cell_value_const_cast() {
let mut wam = MockWAM::new();
#[cfg(target_pointer_width = "32")]
#[serial]
#[test]
-#[cfg_attr(miri, ignore = "blocked on streams.rs UB")]
+#[cfg_attr(miri, ignore = "blocked on helper.rs UB")]
fn builtins() {
load_module_test("src/tests/builtins.pl", "");
}
#[serial]
#[test]
-#[cfg_attr(miri, ignore = "blocked on streams.rs UB")]
+#[cfg_attr(miri, ignore = "blocked on helper.rs UB")]
fn call_with_inference_limit() {
load_module_test("src/tests/call_with_inference_limit.pl", "");
}
#[serial]
#[test]
-#[cfg_attr(miri, ignore = "blocked on streams.rs UB")]
+#[cfg_attr(miri, ignore = "blocked on helper.rs UB")]
fn facts() {
load_module_test("src/tests/facts.pl", "");
}
#[serial]
#[test]
-#[cfg_attr(miri, ignore = "blocked on streams.rs UB")]
+#[cfg_attr(miri, ignore = "blocked on helper.rs UB")]
fn hello_world() {
load_module_test("src/tests/hello_world.pl", "Hello World!\n");
}
#[serial]
#[test]
-#[cfg_attr(miri, ignore = "blocked on streams.rs UB")]
+#[cfg_attr(miri, ignore = "blocked on helper.rs UB")]
fn syntax_error() {
load_module_test(
"tests-pl/syntax_error.pl",
#[serial]
#[test]
-#[cfg_attr(miri, ignore = "blocked on streams.rs UB")]
+#[cfg_attr(miri, ignore = "blocked on helper.rs UB")]
fn predicates() {
load_module_test("src/tests/predicates.pl", "");
}
#[serial]
#[test]
-#[cfg_attr(miri, ignore = "blocked on streams.rs UB")]
+#[cfg_attr(miri, ignore = "blocked on helper.rs UB")]
fn rules() {
load_module_test("src/tests/rules.pl", "");
}
#[serial]
#[test]
-#[cfg_attr(miri, ignore = "blocked on streams.rs UB")]
+#[cfg_attr(miri, ignore = "blocked on helper.rs UB")]
fn setup_call_cleanup_load() {
load_module_test(
"src/tests/setup_call_cleanup.pl",
#[serial]
#[test]
-#[cfg_attr(miri, ignore = "blocked on streams.rs UB")]
+#[cfg_attr(miri, ignore = "blocked on helper.rs UB")]
fn clpz_load() {
load_module_test("src/tests/clpz/test_clpz.pl", "");
}
#[serial]
#[test]
-#[cfg_attr(miri, ignore = "blocked on streams.rs UB")]
+#[cfg_attr(miri, ignore = "blocked on helper.rs UB")]
fn iso_conformity_tests() {
load_module_test("tests-pl/iso-conformity-tests.pl", "All tests passed");
}