Index: test/unittests/wasm/encoder-unittest.cc |
diff --git a/test/unittests/wasm/encoder-unittest.cc b/test/unittests/wasm/encoder-unittest.cc |
index 69677c2478f1bf7025b87fcaca7aac6865761f90..f7c54591f9392026c29e059dbb028ed0f63fb0fa 100644 |
--- a/test/unittests/wasm/encoder-unittest.cc |
+++ b/test/unittests/wasm/encoder-unittest.cc |
@@ -108,6 +108,80 @@ TEST_F(EncoderTest, Function_Builder_Indexing_Variable_Width) { |
body = buffer + f->HeaderSize(); |
} |
+TEST_F(EncoderTest, Function_Builder_Block_Variable_Width) { |
+ Zone zone; |
+ WasmModuleBuilder* builder = new (&zone) WasmModuleBuilder(&zone); |
+ uint16_t f_index = builder->AddFunction(); |
+ WasmFunctionBuilder* function = builder->FunctionAt(f_index); |
+ function->EmitWithVarInt(kExprBlock, 200); |
+ for (int i = 0; i < 200; ++i) { |
+ function->Emit(kExprNop); |
+ } |
+ |
+ WasmFunctionEncoder* f = function->Build(&zone, builder); |
+ CHECK_EQ(f->BodySize(), 204); |
+} |
+ |
+TEST_F(EncoderTest, Function_Builder_EmitEditableVarIntImmediate) { |
+ Zone zone; |
+ WasmModuleBuilder* builder = new (&zone) WasmModuleBuilder(&zone); |
+ uint16_t f_index = builder->AddFunction(); |
+ WasmFunctionBuilder* function = builder->FunctionAt(f_index); |
+ function->Emit(kExprLoop); |
+ uint32_t offset = function->EmitEditableVarIntImmediate(); |
+ for (int i = 0; i < 200; ++i) { |
+ function->Emit(kExprNop); |
+ } |
+ function->EditVarIntImmediate(offset, 200); |
+ |
+ WasmFunctionEncoder* f = function->Build(&zone, builder); |
+ CHECK_EQ(f->BodySize(), 204); |
+} |
+ |
+TEST_F(EncoderTest, Function_Builder_EmitEditableVarIntImmediate_Locals) { |
+ Zone zone; |
+ WasmModuleBuilder* builder = new (&zone) WasmModuleBuilder(&zone); |
+ uint16_t f_index = builder->AddFunction(); |
+ WasmFunctionBuilder* function = builder->FunctionAt(f_index); |
+ function->Emit(kExprBlock); |
+ uint32_t offset = function->EmitEditableVarIntImmediate(); |
+ for (int i = 0; i < 200; ++i) { |
+ AddLocal(function, kAstI32); |
+ } |
+ function->EditVarIntImmediate(offset, 200); |
+ |
+ WasmFunctionEncoder* f = function->Build(&zone, builder); |
+ ZoneVector<uint8_t> buffer_vector(f->HeaderSize() + f->BodySize(), &zone); |
+ byte* buffer = &buffer_vector[0]; |
+ byte* header = buffer; |
+ byte* body = buffer + f->HeaderSize(); |
+ f->Serialize(buffer, &header, &body); |
+ body = buffer + f->HeaderSize(); |
+ |
+ CHECK_EQ(f->BodySize(), 479); |
+ const uint8_t varint200_low = (200 & 0x7f) | 0x80; |
+ const uint8_t varint200_high = (200 >> 7) & 0x7f; |
+ offset = 0; |
+ CHECK_EQ(body[offset++], 1); // Local decl count. |
+ CHECK_EQ(body[offset++], varint200_low); |
+ CHECK_EQ(body[offset++], varint200_high); |
+ CHECK_EQ(body[offset++], kLocalI32); |
+ CHECK_EQ(body[offset++], kExprBlock); |
+ CHECK_EQ(body[offset++], varint200_low); |
+ CHECK_EQ(body[offset++], varint200_high); |
+ // GetLocal with one-byte indices. |
+ for (int i = 0; i <= 127; ++i) { |
+ CHECK_EQ(body[offset++], kExprGetLocal); |
+ CHECK_EQ(body[offset++], i); |
+ } |
+ // GetLocal with two-byte indices. |
+ for (int i = 128; i < 200; ++i) { |
+ CHECK_EQ(body[offset++], kExprGetLocal); |
+ CHECK_EQ(body[offset++], (i & 0x7f) | 0x80); |
+ CHECK_EQ(body[offset++], (i >> 7) & 0x7f); |
+ } |
+ CHECK_EQ(offset, 479); |
+} |
TEST_F(EncoderTest, LEB_Functions) { |
byte leb_value[5] = {0, 0, 0, 0, 0}; |