Skip to content

Commit 6a1e672

Browse files
authored
Use constructors to initialize state rather than lazily initializing (#9)
The old approach didn't work in the case that `hiwire_new_deduplicate` was called before `hiwire_new`.
1 parent e9eab6e commit 6a1e672

File tree

6 files changed

+24
-29
lines changed

6 files changed

+24
-29
lines changed

src/_deduplicate.c

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ EM_JS(void, __hiwire_deduplicate_delete, (__externref_t map, __externref_t value
3535
});
3636
// clang-format on
3737

38-
static void
38+
static void __attribute__((constructor))
3939
deduplicate_init()
4040
{
4141
_deduplicate_map = hiwire_intern(__hiwire_deduplicate_new());
@@ -58,9 +58,6 @@ _hiwire_deduplicate_delete(__externref_t value)
5858
{
5959
return __hiwire_deduplicate_delete(hiwire_get(_deduplicate_map), value);
6060
}
61-
62-
#else
63-
#define deduplicate_init()
6461
#endif
6562

6663
#ifdef _HIWIRE_CAN_DEDUPLICATE

src/hiwire.c

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,6 @@ HwRef
4646
hiwire_new(__externref_t value)
4747
{
4848
uint index = _hiwire.freeHead;
49-
if (_hiwire.slotInfoSize == 0) {
50-
_hiwire_table_init();
51-
deduplicate_init();
52-
}
5349
uint needed_size = sizeof(uint[index + 1]);
5450
uint orig_size = sizeof(uint[_hiwire.slotInfoSize]);
5551
if (needed_size > orig_size) {

src/wasm_table.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ _hiwire_immortal_add(__externref_t value)
1818
return __builtin_wasm_table_grow(_hiwire_immortal_table, value, 1);
1919
}
2020

21-
void
21+
static void __attribute__((constructor))
2222
_hiwire_table_init(void)
2323
{
2424
__builtin_wasm_table_grow(_hiwire_table, __builtin_wasm_ref_null_extern(), 1);

src/wasm_table.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@ typedef unsigned int uint;
55
__externref_t _hiwire_immortal_get(uint);
66
uint _hiwire_immortal_add(__externref_t);
77

8-
void
9-
_hiwire_table_init(void);
108
__externref_t _hiwire_get(uint);
119
uint _hiwire_set(uint, __externref_t);
1210
void _hiwire_delete(uint);

tests/ctests/test_deduplication.c

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,25 @@ main()
55
{
66
__externref_t o1 = get_obj(7);
77
__externref_t o2 = get_obj(9);
8-
HwRef id11 = hiwire_new(o1);
9-
ASSERT(!SLOT_DEDUPLICATED(id11));
10-
HwRef id12 = hiwire_new_deduplicate(o1);
11-
ASSERT(SLOT_DEDUPLICATED(id12));
8+
HwRef id11 = hiwire_new_deduplicate(o1);
9+
ASSERT(SLOT_DEDUPLICATED(id11));
10+
HwRef id12 = hiwire_new(o1);
11+
ASSERT(!SLOT_DEDUPLICATED(id12));
1212
HwRef id13 = hiwire_new(o1);
1313
HwRef id14 = hiwire_new_deduplicate(o1);
1414
ASSERT(id11 != id12);
15-
ASSERT(id12 == id14);
15+
ASSERT(id11 != id13);
16+
ASSERT(id12 != id13);
17+
ASSERT(id11 == id14);
1618
ASSERT(HEAP_REF_TO_INDEX(id11) == 1);
1719
ASSERT(HEAP_REF_TO_INDEX(id12) == 2);
1820
ASSERT(HEAP_REF_TO_INDEX(id13) == 3);
19-
ASSERT(HEAP_REF_TO_INDEX(id14) == 2);
20-
ASSERT(SLOT_REFCOUNT(id11) == 1);
21-
ASSERT(SLOT_REFCOUNT(id12) == 2);
21+
ASSERT(HEAP_REF_TO_INDEX(id14) == 1);
22+
ASSERT(SLOT_REFCOUNT(id11) == 2);
23+
ASSERT(SLOT_REFCOUNT(id12) == 1);
2224
ASSERT(SLOT_REFCOUNT(id13) == 1);
23-
ASSERT(!SLOT_DEDUPLICATED(id11));
24-
ASSERT(SLOT_DEDUPLICATED(id12));
25+
ASSERT(SLOT_DEDUPLICATED(id11));
26+
ASSERT(!SLOT_DEDUPLICATED(id12));
2527
ASSERT(!SLOT_DEDUPLICATED(id13));
2628

2729
HwRef id21 = hiwire_new(o2);

tests/ctests/test_deduplication.out

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
1-
PASS  !SLOT_DEDUPLICATED(id11)
2-
PASS  SLOT_DEDUPLICATED(id12)
1+
PASS  SLOT_DEDUPLICATED(id11)
2+
PASS  !SLOT_DEDUPLICATED(id12)
33
PASS  id11 != id12
4-
PASS  id12 == id14
4+
PASS  id11 != id13
5+
PASS  id12 != id13
6+
PASS  id11 == id14
57
PASS  HEAP_REF_TO_INDEX(id11) == 1
68
PASS  HEAP_REF_TO_INDEX(id12) == 2
79
PASS  HEAP_REF_TO_INDEX(id13) == 3
8-
PASS  HEAP_REF_TO_INDEX(id14) == 2
9-
PASS  SLOT_REFCOUNT(id11) == 1
10-
PASS  SLOT_REFCOUNT(id12) == 2
10+
PASS  HEAP_REF_TO_INDEX(id14) == 1
11+
PASS  SLOT_REFCOUNT(id11) == 2
12+
PASS  SLOT_REFCOUNT(id12) == 1
1113
PASS  SLOT_REFCOUNT(id13) == 1
12-
PASS  !SLOT_DEDUPLICATED(id11)
13-
PASS  SLOT_DEDUPLICATED(id12)
14+
PASS  SLOT_DEDUPLICATED(id11)
15+
PASS  !SLOT_DEDUPLICATED(id12)
1416
PASS  !SLOT_DEDUPLICATED(id13)
1517
PASS  id21 != id22
1618
PASS  id22 == id24

0 commit comments

Comments
 (0)