Skip to content

Commit e7cb4fb

Browse files
authored
[Wasm GC] GC-prefixed opcodes are int8, not LEBs (WebAssembly#4889)
This starts to matter with strings, it turns out. This change should make us runnable in v8. Spec: https://github.com/WebAssembly/gc/blob/main/proposals/gc/MVP.md#instructions-1
1 parent d0c6ca0 commit e7cb4fb

2 files changed

Lines changed: 61 additions & 61 deletions

File tree

src/wasm/wasm-binary.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3830,7 +3830,7 @@ BinaryConsts::ASTNodes WasmBinaryBuilder::readExpression(Expression*& curr) {
38303830
break;
38313831
}
38323832
case BinaryConsts::GCPrefix: {
3833-
auto opcode = getU32LEB();
3833+
uint8_t opcode = getInt8();
38343834
if (maybeVisitI31New(curr, opcode)) {
38353835
break;
38363836
}

src/wasm/wasm-stack.cpp

Lines changed: 60 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -2001,12 +2001,12 @@ void BinaryInstWriter::visitTupleExtract(TupleExtract* curr) {
20012001
}
20022002

20032003
void BinaryInstWriter::visitI31New(I31New* curr) {
2004-
o << int8_t(BinaryConsts::GCPrefix) << U32LEB(BinaryConsts::I31New);
2004+
o << int8_t(BinaryConsts::GCPrefix) << int8_t(BinaryConsts::I31New);
20052005
}
20062006

20072007
void BinaryInstWriter::visitI31Get(I31Get* curr) {
20082008
o << int8_t(BinaryConsts::GCPrefix)
2009-
<< U32LEB(curr->signed_ ? BinaryConsts::I31GetS : BinaryConsts::I31GetU);
2009+
<< int8_t(curr->signed_ ? BinaryConsts::I31GetS : BinaryConsts::I31GetU);
20102010
}
20112011

20122012
void BinaryInstWriter::visitCallRef(CallRef* curr) {
@@ -2016,16 +2016,16 @@ void BinaryInstWriter::visitCallRef(CallRef* curr) {
20162016

20172017
void BinaryInstWriter::visitRefTest(RefTest* curr) {
20182018
o << int8_t(BinaryConsts::GCPrefix);
2019-
o << U32LEB(BinaryConsts::RefTestStatic);
2019+
o << int8_t(BinaryConsts::RefTestStatic);
20202020
parent.writeIndexedHeapType(curr->intendedType);
20212021
}
20222022

20232023
void BinaryInstWriter::visitRefCast(RefCast* curr) {
20242024
o << int8_t(BinaryConsts::GCPrefix);
20252025
if (curr->safety == RefCast::Unsafe) {
2026-
o << U32LEB(BinaryConsts::RefCastNopStatic);
2026+
o << int8_t(BinaryConsts::RefCastNopStatic);
20272027
} else {
2028-
o << U32LEB(BinaryConsts::RefCastStatic);
2028+
o << int8_t(BinaryConsts::RefCastStatic);
20292029
}
20302030
parent.writeIndexedHeapType(curr->intendedType);
20312031
}
@@ -2040,29 +2040,29 @@ void BinaryInstWriter::visitBrOn(BrOn* curr) {
20402040
break;
20412041
case BrOnCast:
20422042
o << int8_t(BinaryConsts::GCPrefix);
2043-
o << U32LEB(BinaryConsts::BrOnCastStatic);
2043+
o << int8_t(BinaryConsts::BrOnCastStatic);
20442044
break;
20452045
case BrOnCastFail:
20462046
o << int8_t(BinaryConsts::GCPrefix);
2047-
o << U32LEB(BinaryConsts::BrOnCastStaticFail);
2047+
o << int8_t(BinaryConsts::BrOnCastStaticFail);
20482048
break;
20492049
case BrOnFunc:
2050-
o << int8_t(BinaryConsts::GCPrefix) << U32LEB(BinaryConsts::BrOnFunc);
2050+
o << int8_t(BinaryConsts::GCPrefix) << int8_t(BinaryConsts::BrOnFunc);
20512051
break;
20522052
case BrOnNonFunc:
2053-
o << int8_t(BinaryConsts::GCPrefix) << U32LEB(BinaryConsts::BrOnNonFunc);
2053+
o << int8_t(BinaryConsts::GCPrefix) << int8_t(BinaryConsts::BrOnNonFunc);
20542054
break;
20552055
case BrOnData:
2056-
o << int8_t(BinaryConsts::GCPrefix) << U32LEB(BinaryConsts::BrOnData);
2056+
o << int8_t(BinaryConsts::GCPrefix) << int8_t(BinaryConsts::BrOnData);
20572057
break;
20582058
case BrOnNonData:
2059-
o << int8_t(BinaryConsts::GCPrefix) << U32LEB(BinaryConsts::BrOnNonData);
2059+
o << int8_t(BinaryConsts::GCPrefix) << int8_t(BinaryConsts::BrOnNonData);
20602060
break;
20612061
case BrOnI31:
2062-
o << int8_t(BinaryConsts::GCPrefix) << U32LEB(BinaryConsts::BrOnI31);
2062+
o << int8_t(BinaryConsts::GCPrefix) << int8_t(BinaryConsts::BrOnI31);
20632063
break;
20642064
case BrOnNonI31:
2065-
o << int8_t(BinaryConsts::GCPrefix) << U32LEB(BinaryConsts::BrOnNonI31);
2065+
o << int8_t(BinaryConsts::GCPrefix) << int8_t(BinaryConsts::BrOnNonI31);
20662066
break;
20672067
default:
20682068
WASM_UNREACHABLE("invalid br_on_*");
@@ -2076,9 +2076,9 @@ void BinaryInstWriter::visitBrOn(BrOn* curr) {
20762076
void BinaryInstWriter::visitStructNew(StructNew* curr) {
20772077
o << int8_t(BinaryConsts::GCPrefix);
20782078
if (curr->isWithDefault()) {
2079-
o << U32LEB(BinaryConsts::StructNewDefault);
2079+
o << int8_t(BinaryConsts::StructNewDefault);
20802080
} else {
2081-
o << U32LEB(BinaryConsts::StructNew);
2081+
o << int8_t(BinaryConsts::StructNew);
20822082
}
20832083
parent.writeIndexedHeapType(curr->type.getHeapType());
20842084
}
@@ -2094,30 +2094,30 @@ void BinaryInstWriter::visitStructGet(StructGet* curr) {
20942094
} else {
20952095
op = BinaryConsts::StructGetU;
20962096
}
2097-
o << int8_t(BinaryConsts::GCPrefix) << U32LEB(op);
2097+
o << int8_t(BinaryConsts::GCPrefix) << int8_t(op);
20982098
parent.writeIndexedHeapType(heapType);
20992099
o << U32LEB(curr->index);
21002100
}
21012101

21022102
void BinaryInstWriter::visitStructSet(StructSet* curr) {
2103-
o << int8_t(BinaryConsts::GCPrefix) << U32LEB(BinaryConsts::StructSet);
2103+
o << int8_t(BinaryConsts::GCPrefix) << int8_t(BinaryConsts::StructSet);
21042104
parent.writeIndexedHeapType(curr->ref->type.getHeapType());
21052105
o << U32LEB(curr->index);
21062106
}
21072107

21082108
void BinaryInstWriter::visitArrayNew(ArrayNew* curr) {
21092109
o << int8_t(BinaryConsts::GCPrefix);
21102110
if (curr->isWithDefault()) {
2111-
o << U32LEB(BinaryConsts::ArrayNewDefault);
2111+
o << int8_t(BinaryConsts::ArrayNewDefault);
21122112
} else {
2113-
o << U32LEB(BinaryConsts::ArrayNew);
2113+
o << int8_t(BinaryConsts::ArrayNew);
21142114
}
21152115
parent.writeIndexedHeapType(curr->type.getHeapType());
21162116
}
21172117

21182118
void BinaryInstWriter::visitArrayInit(ArrayInit* curr) {
21192119
o << int8_t(BinaryConsts::GCPrefix);
2120-
o << U32LEB(BinaryConsts::ArrayInitStatic);
2120+
o << int8_t(BinaryConsts::ArrayInitStatic);
21212121
parent.writeIndexedHeapType(curr->type.getHeapType());
21222122
o << U32LEB(curr->values.size());
21232123
}
@@ -2133,22 +2133,22 @@ void BinaryInstWriter::visitArrayGet(ArrayGet* curr) {
21332133
} else {
21342134
op = BinaryConsts::ArrayGetU;
21352135
}
2136-
o << int8_t(BinaryConsts::GCPrefix) << U32LEB(op);
2136+
o << int8_t(BinaryConsts::GCPrefix) << int8_t(op);
21372137
parent.writeIndexedHeapType(heapType);
21382138
}
21392139

21402140
void BinaryInstWriter::visitArraySet(ArraySet* curr) {
2141-
o << int8_t(BinaryConsts::GCPrefix) << U32LEB(BinaryConsts::ArraySet);
2141+
o << int8_t(BinaryConsts::GCPrefix) << int8_t(BinaryConsts::ArraySet);
21422142
parent.writeIndexedHeapType(curr->ref->type.getHeapType());
21432143
}
21442144

21452145
void BinaryInstWriter::visitArrayLen(ArrayLen* curr) {
2146-
o << int8_t(BinaryConsts::GCPrefix) << U32LEB(BinaryConsts::ArrayLen);
2146+
o << int8_t(BinaryConsts::GCPrefix) << int8_t(BinaryConsts::ArrayLen);
21472147
parent.writeIndexedHeapType(curr->ref->type.getHeapType());
21482148
}
21492149

21502150
void BinaryInstWriter::visitArrayCopy(ArrayCopy* curr) {
2151-
o << int8_t(BinaryConsts::GCPrefix) << U32LEB(BinaryConsts::ArrayCopy);
2151+
o << int8_t(BinaryConsts::GCPrefix) << int8_t(BinaryConsts::ArrayCopy);
21522152
parent.writeIndexedHeapType(curr->destRef->type.getHeapType());
21532153
parent.writeIndexedHeapType(curr->srcRef->type.getHeapType());
21542154
}
@@ -2159,13 +2159,13 @@ void BinaryInstWriter::visitRefAs(RefAs* curr) {
21592159
o << int8_t(BinaryConsts::RefAsNonNull);
21602160
break;
21612161
case RefAsFunc:
2162-
o << int8_t(BinaryConsts::GCPrefix) << U32LEB(BinaryConsts::RefAsFunc);
2162+
o << int8_t(BinaryConsts::GCPrefix) << int8_t(BinaryConsts::RefAsFunc);
21632163
break;
21642164
case RefAsData:
2165-
o << int8_t(BinaryConsts::GCPrefix) << U32LEB(BinaryConsts::RefAsData);
2165+
o << int8_t(BinaryConsts::GCPrefix) << int8_t(BinaryConsts::RefAsData);
21662166
break;
21672167
case RefAsI31:
2168-
o << int8_t(BinaryConsts::GCPrefix) << U32LEB(BinaryConsts::RefAsI31);
2168+
o << int8_t(BinaryConsts::GCPrefix) << int8_t(BinaryConsts::RefAsI31);
21692169
break;
21702170
default:
21712171
WASM_UNREACHABLE("invalid ref.as_*");
@@ -2176,64 +2176,64 @@ void BinaryInstWriter::visitStringNew(StringNew* curr) {
21762176
o << int8_t(BinaryConsts::GCPrefix);
21772177
switch (curr->op) {
21782178
case StringNewUTF8:
2179-
o << U32LEB(BinaryConsts::StringNewWTF8)
2179+
o << int8_t(BinaryConsts::StringNewWTF8)
21802180
<< U32LEB(BinaryConsts::StringPolicy::UTF8);
21812181
break;
21822182
case StringNewWTF8:
2183-
o << U32LEB(BinaryConsts::StringNewWTF8)
2183+
o << int8_t(BinaryConsts::StringNewWTF8)
21842184
<< U32LEB(BinaryConsts::StringPolicy::WTF8);
21852185
break;
21862186
case StringNewReplace:
2187-
o << U32LEB(BinaryConsts::StringNewWTF8)
2187+
o << int8_t(BinaryConsts::StringNewWTF8)
21882188
<< U32LEB(BinaryConsts::StringPolicy::Replace);
21892189
break;
21902190
case StringNewWTF16:
2191-
o << U32LEB(BinaryConsts::StringNewWTF16);
2191+
o << int8_t(BinaryConsts::StringNewWTF16);
21922192
break;
21932193
case StringNewUTF8Array:
2194-
o << U32LEB(BinaryConsts::StringNewWTF8Array)
2194+
o << int8_t(BinaryConsts::StringNewWTF8Array)
21952195
<< U32LEB(BinaryConsts::StringPolicy::UTF8);
21962196
break;
21972197
case StringNewWTF8Array:
2198-
o << U32LEB(BinaryConsts::StringNewWTF8Array)
2198+
o << int8_t(BinaryConsts::StringNewWTF8Array)
21992199
<< U32LEB(BinaryConsts::StringPolicy::WTF8);
22002200
break;
22012201
case StringNewReplaceArray:
2202-
o << U32LEB(BinaryConsts::StringNewWTF8Array)
2202+
o << int8_t(BinaryConsts::StringNewWTF8Array)
22032203
<< U32LEB(BinaryConsts::StringPolicy::Replace);
22042204
break;
22052205
case StringNewWTF16Array:
2206-
o << U32LEB(BinaryConsts::StringNewWTF16Array);
2206+
o << int8_t(BinaryConsts::StringNewWTF16Array);
22072207
break;
22082208
default:
22092209
WASM_UNREACHABLE("invalid string.new*");
22102210
}
22112211
}
22122212

22132213
void BinaryInstWriter::visitStringConst(StringConst* curr) {
2214-
o << int8_t(BinaryConsts::GCPrefix) << U32LEB(BinaryConsts::StringConst)
2214+
o << int8_t(BinaryConsts::GCPrefix) << int8_t(BinaryConsts::StringConst)
22152215
<< U32LEB(parent.getStringIndex(curr->string));
22162216
}
22172217

22182218
void BinaryInstWriter::visitStringMeasure(StringMeasure* curr) {
22192219
o << int8_t(BinaryConsts::GCPrefix);
22202220
switch (curr->op) {
22212221
case StringMeasureUTF8:
2222-
o << U32LEB(BinaryConsts::StringMeasureWTF8)
2222+
o << int8_t(BinaryConsts::StringMeasureWTF8)
22232223
<< U32LEB(BinaryConsts::StringPolicy::UTF8);
22242224
break;
22252225
case StringMeasureWTF8:
2226-
o << U32LEB(BinaryConsts::StringMeasureWTF8)
2226+
o << int8_t(BinaryConsts::StringMeasureWTF8)
22272227
<< U32LEB(BinaryConsts::StringPolicy::WTF8);
22282228
break;
22292229
case StringMeasureWTF16:
2230-
o << U32LEB(BinaryConsts::StringMeasureWTF16);
2230+
o << int8_t(BinaryConsts::StringMeasureWTF16);
22312231
break;
22322232
case StringMeasureIsUSV:
2233-
o << U32LEB(BinaryConsts::StringIsUSV);
2233+
o << int8_t(BinaryConsts::StringIsUSV);
22342234
break;
22352235
case StringMeasureWTF16View:
2236-
o << U32LEB(BinaryConsts::StringViewWTF16Length);
2236+
o << int8_t(BinaryConsts::StringViewWTF16Length);
22372237
break;
22382238
default:
22392239
WASM_UNREACHABLE("invalid string.new*");
@@ -2244,51 +2244,51 @@ void BinaryInstWriter::visitStringEncode(StringEncode* curr) {
22442244
o << int8_t(BinaryConsts::GCPrefix);
22452245
switch (curr->op) {
22462246
case StringEncodeUTF8:
2247-
o << U32LEB(BinaryConsts::StringEncodeWTF8)
2247+
o << int8_t(BinaryConsts::StringEncodeWTF8)
22482248
<< U32LEB(BinaryConsts::StringPolicy::UTF8);
22492249
break;
22502250
case StringEncodeWTF8:
2251-
o << U32LEB(BinaryConsts::StringEncodeWTF8)
2251+
o << int8_t(BinaryConsts::StringEncodeWTF8)
22522252
<< U32LEB(BinaryConsts::StringPolicy::WTF8);
22532253
break;
22542254
case StringEncodeWTF16:
2255-
o << U32LEB(BinaryConsts::StringEncodeWTF16);
2255+
o << int8_t(BinaryConsts::StringEncodeWTF16);
22562256
break;
22572257
case StringEncodeUTF8Array:
2258-
o << U32LEB(BinaryConsts::StringEncodeWTF8Array)
2258+
o << int8_t(BinaryConsts::StringEncodeWTF8Array)
22592259
<< U32LEB(BinaryConsts::StringPolicy::UTF8);
22602260
break;
22612261
case StringEncodeWTF8Array:
2262-
o << U32LEB(BinaryConsts::StringEncodeWTF8Array)
2262+
o << int8_t(BinaryConsts::StringEncodeWTF8Array)
22632263
<< U32LEB(BinaryConsts::StringPolicy::WTF8);
22642264
break;
22652265
case StringEncodeWTF16Array:
2266-
o << U32LEB(BinaryConsts::StringEncodeWTF16Array);
2266+
o << int8_t(BinaryConsts::StringEncodeWTF16Array);
22672267
break;
22682268
default:
22692269
WASM_UNREACHABLE("invalid string.new*");
22702270
}
22712271
}
22722272

22732273
void BinaryInstWriter::visitStringConcat(StringConcat* curr) {
2274-
o << int8_t(BinaryConsts::GCPrefix) << U32LEB(BinaryConsts::StringConcat);
2274+
o << int8_t(BinaryConsts::GCPrefix) << int8_t(BinaryConsts::StringConcat);
22752275
}
22762276

22772277
void BinaryInstWriter::visitStringEq(StringEq* curr) {
2278-
o << int8_t(BinaryConsts::GCPrefix) << U32LEB(BinaryConsts::StringEq);
2278+
o << int8_t(BinaryConsts::GCPrefix) << int8_t(BinaryConsts::StringEq);
22792279
}
22802280

22812281
void BinaryInstWriter::visitStringAs(StringAs* curr) {
22822282
o << int8_t(BinaryConsts::GCPrefix);
22832283
switch (curr->op) {
22842284
case StringAsWTF8:
2285-
o << U32LEB(BinaryConsts::StringAsWTF8);
2285+
o << int8_t(BinaryConsts::StringAsWTF8);
22862286
break;
22872287
case StringAsWTF16:
2288-
o << U32LEB(BinaryConsts::StringAsWTF16);
2288+
o << int8_t(BinaryConsts::StringAsWTF16);
22892289
break;
22902290
case StringAsIter:
2291-
o << U32LEB(BinaryConsts::StringAsIter);
2291+
o << int8_t(BinaryConsts::StringAsIter);
22922292
break;
22932293
default:
22942294
WASM_UNREACHABLE("invalid string.as*");
@@ -2297,27 +2297,27 @@ void BinaryInstWriter::visitStringAs(StringAs* curr) {
22972297

22982298
void BinaryInstWriter::visitStringWTF8Advance(StringWTF8Advance* curr) {
22992299
o << int8_t(BinaryConsts::GCPrefix)
2300-
<< U32LEB(BinaryConsts::StringViewWTF8Advance);
2300+
<< int8_t(BinaryConsts::StringViewWTF8Advance);
23012301
}
23022302

23032303
void BinaryInstWriter::visitStringWTF16Get(StringWTF16Get* curr) {
23042304
o << int8_t(BinaryConsts::GCPrefix)
2305-
<< U32LEB(BinaryConsts::StringViewWTF16GetCodePoint);
2305+
<< int8_t(BinaryConsts::StringViewWTF16GetCodePoint);
23062306
}
23072307

23082308
void BinaryInstWriter::visitStringIterNext(StringIterNext* curr) {
23092309
o << int8_t(BinaryConsts::GCPrefix)
2310-
<< U32LEB(BinaryConsts::StringViewIterNext);
2310+
<< int8_t(BinaryConsts::StringViewIterNext);
23112311
}
23122312

23132313
void BinaryInstWriter::visitStringIterMove(StringIterMove* curr) {
23142314
o << int8_t(BinaryConsts::GCPrefix);
23152315
switch (curr->op) {
23162316
case StringIterMoveAdvance:
2317-
o << U32LEB(BinaryConsts::StringViewIterAdvance);
2317+
o << int8_t(BinaryConsts::StringViewIterAdvance);
23182318
break;
23192319
case StringIterMoveRewind:
2320-
o << U32LEB(BinaryConsts::StringViewIterRewind);
2320+
o << int8_t(BinaryConsts::StringViewIterRewind);
23212321
break;
23222322
default:
23232323
WASM_UNREACHABLE("invalid string.move*");
@@ -2328,10 +2328,10 @@ void BinaryInstWriter::visitStringSliceWTF(StringSliceWTF* curr) {
23282328
o << int8_t(BinaryConsts::GCPrefix);
23292329
switch (curr->op) {
23302330
case StringSliceWTF8:
2331-
o << U32LEB(BinaryConsts::StringViewWTF8Slice);
2331+
o << int8_t(BinaryConsts::StringViewWTF8Slice);
23322332
break;
23332333
case StringSliceWTF16:
2334-
o << U32LEB(BinaryConsts::StringViewWTF16Slice);
2334+
o << int8_t(BinaryConsts::StringViewWTF16Slice);
23352335
break;
23362336
default:
23372337
WASM_UNREACHABLE("invalid string.move*");
@@ -2340,7 +2340,7 @@ void BinaryInstWriter::visitStringSliceWTF(StringSliceWTF* curr) {
23402340

23412341
void BinaryInstWriter::visitStringSliceIter(StringSliceIter* curr) {
23422342
o << int8_t(BinaryConsts::GCPrefix)
2343-
<< U32LEB(BinaryConsts::StringViewIterSlice);
2343+
<< int8_t(BinaryConsts::StringViewIterSlice);
23442344
}
23452345

23462346
void BinaryInstWriter::emitScopeEnd(Expression* curr) {

0 commit comments

Comments
 (0)