Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef V8_WASM_AST_DECODER_H_ | 5 #ifndef V8_WASM_AST_DECODER_H_ |
| 6 #define V8_WASM_AST_DECODER_H_ | 6 #define V8_WASM_AST_DECODER_H_ |
| 7 | 7 |
| 8 #include "src/signature.h" | 8 #include "src/signature.h" |
| 9 #include "src/wasm/decoder.h" | 9 #include "src/wasm/decoder.h" |
| 10 #include "src/wasm/wasm-opcodes.h" | 10 #include "src/wasm/wasm-opcodes.h" |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 90 machine_type = MachineType::None(); | 90 machine_type = MachineType::None(); |
| 91 } | 91 } |
| 92 }; | 92 }; |
| 93 | 93 |
| 94 struct Block; | 94 struct Block; |
| 95 struct BreakDepthOperand { | 95 struct BreakDepthOperand { |
| 96 uint32_t depth; | 96 uint32_t depth; |
| 97 Block* target; | 97 Block* target; |
| 98 int length; | 98 int length; |
| 99 inline BreakDepthOperand(Decoder* decoder, const byte* pc) { | 99 inline BreakDepthOperand(Decoder* decoder, const byte* pc) { |
| 100 depth = decoder->checked_read_u8(pc, 1, "break depth"); | 100 depth = decoder->checked_read_u32v(pc, 1, &length, "break depth"); |
| 101 length = 1; | |
| 102 target = nullptr; | 101 target = nullptr; |
| 103 } | 102 } |
| 104 }; | 103 }; |
| 105 | 104 |
| 106 struct BlockCountOperand { | 105 struct BlockCountOperand { |
| 107 uint32_t count; | 106 uint32_t count; |
| 108 int length; | 107 int length; |
| 109 inline BlockCountOperand(Decoder* decoder, const byte* pc) { | 108 inline BlockCountOperand(Decoder* decoder, const byte* pc) { |
| 110 count = decoder->checked_read_u8(pc, 1, "block count"); | 109 count = decoder->checked_read_u32v(pc, 1, &length, "block count"); |
| 111 length = 1; | |
| 112 } | 110 } |
| 113 }; | 111 }; |
| 114 | 112 |
| 115 struct SignatureIndexOperand { | 113 struct SignatureIndexOperand { |
| 116 uint32_t index; | 114 uint32_t index; |
| 117 FunctionSig* sig; | 115 FunctionSig* sig; |
| 118 int length; | 116 int length; |
| 119 inline SignatureIndexOperand(Decoder* decoder, const byte* pc) { | 117 inline SignatureIndexOperand(Decoder* decoder, const byte* pc) { |
| 120 index = decoder->checked_read_u32v(pc, 1, &length, "signature index"); | 118 index = decoder->checked_read_u32v(pc, 1, &length, "signature index"); |
| 121 sig = nullptr; | 119 sig = nullptr; |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 139 inline ImportIndexOperand(Decoder* decoder, const byte* pc) { | 137 inline ImportIndexOperand(Decoder* decoder, const byte* pc) { |
| 140 index = decoder->checked_read_u32v(pc, 1, &length, "import index"); | 138 index = decoder->checked_read_u32v(pc, 1, &length, "import index"); |
| 141 sig = nullptr; | 139 sig = nullptr; |
| 142 } | 140 } |
| 143 }; | 141 }; |
| 144 | 142 |
| 145 struct BranchTableOperand { | 143 struct BranchTableOperand { |
| 146 uint32_t table_count; | 144 uint32_t table_count; |
| 147 const byte* table; | 145 const byte* table; |
| 148 int length; | 146 int length; |
| 147 // Cache entry offsets, assuming we are iterating through them in order. | |
| 148 int next_entry_index; | |
| 149 const byte* next_entry; | |
| 149 inline BranchTableOperand(Decoder* decoder, const byte* pc) { | 150 inline BranchTableOperand(Decoder* decoder, const byte* pc) { |
|
titzer
2016/03/08 10:06:53
Maybe we can leave the branch table target as uint
binji
2016/03/08 16:30:15
:)
| |
| 150 table_count = decoder->checked_read_u16(pc, 1, "expected #entries"); | 151 int varint_length; |
| 151 length = 2 + table_count * 2 + 2; | 152 table_count = |
| 153 decoder->checked_read_u32v(pc, 1, &varint_length, "expected #entries"); | |
| 154 length = varint_length; | |
| 155 uint32_t table_start = 1 + length; | |
| 156 for (uint32_t i = 0; i < table_count; ++i) { | |
| 157 decoder->checked_read_u32v(pc, 1 + length, &varint_length); | |
| 158 length += varint_length; | |
| 159 } | |
| 160 // Default entry. | |
| 161 decoder->checked_read_u32v(pc, 1 + length, &varint_length); | |
| 162 length += varint_length; | |
| 152 | 163 |
| 153 if (decoder->check(pc, 3, table_count * 2 + 2, | 164 if (decoder->check(pc, 1, length, "expected <table entries>")) { |
| 154 "expected <table entries>")) { | 165 table = pc + table_start; |
| 155 table = pc + 3; | |
| 156 } else { | 166 } else { |
| 157 table = nullptr; | 167 table = nullptr; |
| 158 } | 168 } |
| 169 next_entry_index = 0; | |
| 170 next_entry = table; | |
| 159 } | 171 } |
| 160 inline uint16_t read_entry(Decoder* decoder, int i) { | 172 inline uint32_t read_entry(Decoder* decoder, int i) { |
| 161 DCHECK(i >= 0 && static_cast<uint32_t>(i) <= table_count); | 173 DCHECK(i >= 0 && static_cast<uint32_t>(i) <= table_count); |
| 162 return table ? decoder->read_u16(table + i * sizeof(uint16_t)) : 0; | 174 if (!table) return 0; |
| 175 if (next_entry_index > i) { | |
| 176 // Reset to zero and iterate. | |
| 177 next_entry_index = 0; | |
| 178 next_entry = table; | |
| 179 } | |
| 180 uint32_t result; | |
| 181 while (next_entry_index <= i) { | |
|
titzer
2016/03/08 10:06:53
Linear search; that's no good. Definitely gotta go
binji
2016/03/08 16:30:15
It shouldn't actually end up being linear here. In
| |
| 182 int varint_length; | |
| 183 result = decoder->checked_read_u32v(next_entry, 0, &varint_length); | |
| 184 next_entry_index++; | |
| 185 next_entry += varint_length; | |
| 186 } | |
| 187 return result; | |
| 163 } | 188 } |
| 164 }; | 189 }; |
| 165 | 190 |
| 166 struct MemoryAccessOperand { | 191 struct MemoryAccessOperand { |
| 167 bool aligned; | 192 bool aligned; |
| 168 uint32_t offset; | 193 uint32_t offset; |
| 169 int length; | 194 int length; |
| 170 inline MemoryAccessOperand(Decoder* decoder, const byte* pc) { | 195 inline MemoryAccessOperand(Decoder* decoder, const byte* pc) { |
| 171 byte bitfield = decoder->checked_read_u8(pc, 1, "memory access byte"); | 196 byte bitfield = decoder->checked_read_u8(pc, 1, "memory access byte"); |
| 172 aligned = MemoryAccess::AlignmentField::decode(bitfield); | 197 aligned = MemoryAccess::AlignmentField::decode(bitfield); |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 228 int OpcodeLength(const byte* pc, const byte* end); | 253 int OpcodeLength(const byte* pc, const byte* end); |
| 229 | 254 |
| 230 // Computes the arity (number of sub-nodes) of the opcode at the given address. | 255 // Computes the arity (number of sub-nodes) of the opcode at the given address. |
| 231 int OpcodeArity(ModuleEnv* module, FunctionSig* sig, const byte* pc, | 256 int OpcodeArity(ModuleEnv* module, FunctionSig* sig, const byte* pc, |
| 232 const byte* end); | 257 const byte* end); |
| 233 } // namespace wasm | 258 } // namespace wasm |
| 234 } // namespace internal | 259 } // namespace internal |
| 235 } // namespace v8 | 260 } // namespace v8 |
| 236 | 261 |
| 237 #endif // V8_WASM_AST_DECODER_H_ | 262 #endif // V8_WASM_AST_DECODER_H_ |
| OLD | NEW |