@@ -38,9 +38,33 @@ typedef float64 CellType_F64;
3838#endif
3939
4040#if WASM_ENABLE_SHARED_HEAP != 0
41- #define app_addr_in_shared_heap (app_addr , bytes ) \
42- (shared_heap && (app_addr) >= shared_heap_start_off \
43- && (app_addr) <= shared_heap_end_off - bytes + 1)
41+ /* TODO: add code for 64 bit version when memory64 is enabled for fast-interp */
42+ #define get_shared_heap_start_off (shared_heap ) (shared_heap->start_off_mem32)
43+ /* Check whether the app addr in the last visited shared heap, if not, check the
44+ * shared heap chain to find which(if any) shared heap the app addr in, and
45+ * update the last visited shared heap info if found. */
46+ #define app_addr_in_shared_heap (app_addr , bytes ) \
47+ (shared_heap && (app_addr) >= shared_heap_start_off \
48+ && (app_addr) <= shared_heap_end_off - bytes + 1) \
49+ || ({ \
50+ bool in_chain = false; \
51+ WASMSharedHeap *cur; \
52+ uint64 cur_shared_heap_start_off, cur_shared_heap_end_off; \
53+ for (cur = shared_heap; cur; cur = cur->chain_next) { \
54+ cur_shared_heap_start_off = get_shared_heap_start_off(cur); \
55+ cur_shared_heap_end_off = \
56+ cur_shared_heap_start_off + cur->size - 1; \
57+ if ((app_addr) >= cur_shared_heap_start_off \
58+ && (app_addr) <= cur_shared_heap_end_off - bytes + 1) { \
59+ shared_heap_start_off = cur_shared_heap_start_off; \
60+ shared_heap_end_off = cur_shared_heap_end_off; \
61+ shared_heap_base_addr = cur->base_addr; \
62+ in_chain = true; \
63+ break; \
64+ } \
65+ } \
66+ in_chain; \
67+ })
4468
4569#define shared_heap_addr_app_to_native (app_addr , native_addr ) \
4670 native_addr = shared_heap_base_addr + ((app_addr)-shared_heap_start_off)
@@ -1540,19 +1564,12 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
15401564#if WASM_ENABLE_SHARED_HEAP != 0
15411565 WASMSharedHeap * shared_heap = module -> e ? module -> e -> shared_heap : NULL ;
15421566 uint8 * shared_heap_base_addr = shared_heap ? shared_heap -> base_addr : NULL ;
1543- /*
1544- #if WASM_ENABLE_MEMORY64 != 0
15451567 uint64 shared_heap_start_off =
1546- shared_heap ? (is_memory64 ? shared_heap->start_off_mem64
1547- : shared_heap->start_off_mem32)
1548- : 0;
1568+ shared_heap ? get_shared_heap_start_off (shared_heap ) : 0 ;
15491569 uint64 shared_heap_end_off =
1550- shared_heap ? (is_memory64 ? UINT64_MAX : UINT32_MAX) : 0;
1551- #else
1552- */ /* TODO: uncomment the code when memory64 is enabled for fast-interp */
1553- uint64 shared_heap_start_off =
1554- shared_heap ? shared_heap -> start_off_mem32 : 0 ;
1555- uint64 shared_heap_end_off = shared_heap ? UINT32_MAX : 0 ;
1570+ shared_heap
1571+ ? (get_shared_heap_start_off (shared_heap ) + shared_heap -> size - 1 )
1572+ : 0 ;
15561573/* #endif */
15571574#endif /* end of WASM_ENABLE_SHARED_HEAP != 0 */
15581575
0 commit comments