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 |