| 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};
|
|
|