@@ -933,12 +933,12 @@ Result WastParser::ParseDataModuleField(Module* module) {
933933 } else if (ParseVarOpt (&field->data_segment .memory_var , Var (0 , loc))) {
934934 CHECK_RESULT (ParseOffsetExpr (&field->data_segment .offset ));
935935 } else if (!ParseOffsetExprOpt (&field->data_segment .offset )) {
936- if (options_->features .bulk_memory_enabled ()) {
937- field->data_segment .flags |= SegPassive;
938- } else {
936+ if (!options_->features .bulk_memory_enabled ()) {
939937 Error (loc, " passive data segments are not allowed" );
940938 return Result::Error;
941939 }
940+
941+ field->data_segment .kind = SegmentKind::Passive;
942942 }
943943
944944 ParseTextListOpt (&field->data_segment .data );
@@ -956,7 +956,7 @@ Result WastParser::ParseElemModuleField(Module* module) {
956956 // With MVP text format the name here was intended to refer to the table
957957 // that the elem segment was part of, but we never did anything with this name
958958 // since there was only one table anyway.
959- // With bulk-memory enabled this introduces a new name for the particualr
959+ // With bulk-memory enabled this introduces a new name for the particular
960960 // elem segment.
961961 std::string initial_name;
962962 bool has_name = ParseBindVarOpt (&initial_name);
@@ -970,7 +970,6 @@ Result WastParser::ParseElemModuleField(Module* module) {
970970 // Optional table specifier
971971 if (options_->features .bulk_memory_enabled ()) {
972972 if (PeekMatchLpar (TokenType::Table)) {
973- field->elem_segment .flags |= SegExplicitIndex;
974973 EXPECT (Lpar);
975974 EXPECT (Table);
976975 CHECK_RESULT (ParseVar (&field->elem_segment .table_var ));
@@ -981,23 +980,25 @@ Result WastParser::ParseElemModuleField(Module* module) {
981980 } else {
982981 if (has_name) {
983982 field->elem_segment .table_var = Var (initial_name, loc);
984- field->elem_segment .flags |= SegExplicitIndex;
985983 } else {
986984 ParseVarOpt (&field->elem_segment .table_var , Var (0 , loc));
987985 }
988986 }
989987
990988 if (!ParseOffsetExprOpt (&field->elem_segment .offset )) {
991- field->elem_segment .flags |= SegPassive ;
989+ field->elem_segment .kind = SegmentKind::Passive ;
992990 }
993991
994992 if (ParseRefTypeOpt (&field->elem_segment .elem_type )) {
995- // TODO: Don't allow unless bulk memory is enabled.
996- field->elem_segment .flags |= (SegPassive | SegUseElemExprs);
997993 // Parse a potentially empty sequence of ElemExprs.
998994 while (true ) {
999995 Var var;
996+ Location loc = GetLocation ();
1000997 if (MatchLpar (TokenType::RefNull)) {
998+ if (!(options_->features .bulk_memory_enabled () ||
999+ options_->features .reference_types_enabled ())) {
1000+ Error (loc, " ref.null not allowed" );
1001+ }
10011002 field->elem_segment .elem_exprs .emplace_back ();
10021003 EXPECT (Rpar);
10031004 } else if (MatchLpar (TokenType::RefFunc)) {
@@ -1319,8 +1320,6 @@ Result WastParser::ParseTableModuleField(Module* module) {
13191320 auto elem_segment_field = MakeUnique<ElemSegmentModuleField>(loc);
13201321 ElemSegment& elem_segment = elem_segment_field->elem_segment ;
13211322 elem_segment.table_var = Var (module ->tables .size ());
1322- if (module ->tables .size () > 0 )
1323- elem_segment.flags |= SegExplicitIndex;
13241323 elem_segment.offset .push_back (MakeUnique<ConstExpr>(Const::I32 (0 )));
13251324 elem_segment.offset .back ().loc = loc;
13261325 elem_segment.elem_type = elem_type;
0 commit comments