@@ -1510,8 +1510,18 @@ void CWriter::WriteElemInitializers() {
15101510 continue ;
15111511 }
15121512
1513- Write (" static const wasm_elem_segment_expr_t elem_segment_exprs_" ,
1514- GlobalName (elem_segment->name ), " [] = " , OpenBrace ());
1513+ switch (elem_segment->elem_type ) {
1514+ case Type::FuncRef:
1515+ Write (" static const wasm_elem_segment_expr_t elem_segment_exprs_" ,
1516+ GlobalName (elem_segment->name ), " [] = " , OpenBrace ());
1517+ break ;
1518+ case Type::ExternRef:
1519+ Write (" static const wasm_rt_externref_t elem_segment_exprs_" ,
1520+ GlobalName (elem_segment->name ), " [] = " , OpenBrace ());
1521+ break ;
1522+ default :
1523+ WABT_UNREACHABLE;
1524+ }
15151525
15161526 for (const ExprList& elem_expr : elem_segment->elem_exprs ) {
15171527 assert (elem_expr.size () == 1 );
@@ -1531,10 +1541,14 @@ void CWriter::WriteElemInitializers() {
15311541 } else {
15321542 Write (" 0" );
15331543 }
1534- Write (" }, " , Newline ());
1544+ Write (" }," , Newline ());
15351545 } break ;
15361546 case ExprType::RefNull:
1537- Write (" {0, NULL, 0}," , Newline ());
1547+ if (elem_segment->elem_type == Type::FuncRef) {
1548+ Write (" {0, NULL, 0}," , Newline ());
1549+ } else {
1550+ Write (" NULL," , Newline ());
1551+ }
15381552 break ;
15391553 default :
15401554 WABT_UNREACHABLE;
@@ -1565,28 +1579,32 @@ void CWriter::WriteElemInitializers() {
15651579
15661580 const Table* table = module_->GetTable (elem_segment->table_var );
15671581
1568- // TODO: Resolve whether nonempty externref-type element segments
1569- // are permitted (WebAssembly/spec#1543)
1570- if (table->elem_type != Type::FuncRef) {
1582+ if (table->elem_type != Type::FuncRef &&
1583+ table->elem_type != Type::ExternRef) {
15711584 WABT_UNREACHABLE;
15721585 }
15731586
1574- Write (" funcref_table_init(" , ExternalInstancePtr (table->name ), " , " );
1587+ Write (GetReferenceTypeName (table->elem_type ), " _table_init(" ,
1588+ ExternalInstancePtr (table->name ), " , " );
15751589 if (elem_segment->elem_exprs .empty ()) {
15761590 Write (" NULL, 0, " );
15771591 } else {
15781592 Write (" elem_segment_exprs_" , GlobalName (elem_segment->name ), " , " ,
15791593 elem_segment->elem_exprs .size (), " , " );
15801594 }
15811595 WriteInitExpr (elem_segment->offset );
1582- if (elem_segment->elem_exprs .empty ()) {
1583- // It's mandatory to handle the case of a zero-length elem segment
1584- // (even in a module with no types). This must trap if the offset
1585- // is out of bounds.
1586- Write (" , 0, 0, instance, NULL);" , Newline ());
1596+ if (table->elem_type == Type::ExternRef) {
1597+ Write (" , 0, " , elem_segment->elem_exprs .size (), " );" , Newline ());
15871598 } else {
1588- Write (" , 0, " , elem_segment->elem_exprs .size (),
1589- " , instance, func_types);" , Newline ());
1599+ if (elem_segment->elem_exprs .empty ()) {
1600+ // It's mandatory to handle the case of a zero-length elem segment
1601+ // (even in a module with no types). This must trap if the offset
1602+ // is out of bounds.
1603+ Write (" , 0, 0, instance, NULL);" , Newline ());
1604+ } else {
1605+ Write (" , 0, " , elem_segment->elem_exprs .size (),
1606+ " , instance, func_types);" , Newline ());
1607+ }
15901608 }
15911609 }
15921610
0 commit comments