mirror of
https://github.com/roc-lang/roc.git
synced 2025-10-03 16:44:33 +00:00
Fix a bug by not recording normalized layouts
This commit is contained in:
parent
7169d0974d
commit
695b2e6363
1 changed files with 34 additions and 3 deletions
|
@ -608,7 +608,6 @@ impl<'a> LayoutInterner<'a> for TLLayoutInterner<'a> {
|
||||||
|
|
||||||
(normalized_layout, interned_layout)
|
(normalized_layout, interned_layout)
|
||||||
});
|
});
|
||||||
self.record(normalized_layout, interned);
|
|
||||||
if let Some(full_layout) = new_interned_full_layout {
|
if let Some(full_layout) = new_interned_full_layout {
|
||||||
self.record(full_layout, interned);
|
self.record(full_layout, interned);
|
||||||
}
|
}
|
||||||
|
@ -1005,7 +1004,7 @@ mod insert_recursive_layout {
|
||||||
|
|
||||||
use crate::layout::{Builtin, InLayout, Layout, UnionLayout};
|
use crate::layout::{Builtin, InLayout, Layout, UnionLayout};
|
||||||
|
|
||||||
use super::{GlobalLayoutInterner, LayoutInterner, TLLayoutInterner};
|
use super::{GlobalLayoutInterner, LayoutInterner};
|
||||||
|
|
||||||
const TARGET_INFO: TargetInfo = TargetInfo::default_x86_64();
|
const TARGET_INFO: TargetInfo = TargetInfo::default_x86_64();
|
||||||
|
|
||||||
|
@ -1018,7 +1017,7 @@ mod insert_recursive_layout {
|
||||||
])))
|
])))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_rec_ptr_index<'a>(interner: &TLLayoutInterner<'a>, layout: InLayout<'a>) -> usize {
|
fn get_rec_ptr_index<'a>(interner: &impl LayoutInterner<'a>, layout: InLayout<'a>) -> usize {
|
||||||
match interner.get(layout) {
|
match interner.get(layout) {
|
||||||
Layout::Union(UnionLayout::Recursive(&[&[l1], &[l2]])) => {
|
Layout::Union(UnionLayout::Recursive(&[&[l1], &[l2]])) => {
|
||||||
match (interner.get(l1), interner.get(l2)) {
|
match (interner.get(l1), interner.get(l2)) {
|
||||||
|
@ -1065,6 +1064,38 @@ mod insert_recursive_layout {
|
||||||
assert_eq!(in1, in2);
|
assert_eq!(in1, in2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn write_twice_thread_local_single_thread() {
|
||||||
|
let arena = &Bump::new();
|
||||||
|
let global = GlobalLayoutInterner::with_capacity(2, TARGET_INFO);
|
||||||
|
let mut interner = global.fork();
|
||||||
|
let layout = make_layout(arena, &mut interner);
|
||||||
|
|
||||||
|
let in1 = interner.insert_recursive(arena, layout);
|
||||||
|
let rec1 = get_rec_ptr_index(&interner, in1);
|
||||||
|
let in2 = interner.insert_recursive(arena, layout);
|
||||||
|
let rec2 = get_rec_ptr_index(&interner, in2);
|
||||||
|
|
||||||
|
assert_eq!(in1, in2);
|
||||||
|
assert_eq!(rec1, rec2);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn write_twice_single_thread() {
|
||||||
|
let arena = &Bump::new();
|
||||||
|
let global = GlobalLayoutInterner::with_capacity(2, TARGET_INFO);
|
||||||
|
let mut interner = GlobalLayoutInterner::unwrap(global).unwrap();
|
||||||
|
let layout = make_layout(arena, &mut interner);
|
||||||
|
|
||||||
|
let in1 = interner.insert_recursive(arena, layout);
|
||||||
|
let rec1 = get_rec_ptr_index(&interner, in1);
|
||||||
|
let in2 = interner.insert_recursive(arena, layout);
|
||||||
|
let rec2 = get_rec_ptr_index(&interner, in2);
|
||||||
|
|
||||||
|
assert_eq!(in1, in2);
|
||||||
|
assert_eq!(rec1, rec2);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn many_threads_read_write() {
|
fn many_threads_read_write() {
|
||||||
for _ in 0..100 {
|
for _ in 0..100 {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue