Chromium Code Reviews| Index: src/compiler/wasm-compiler.cc |
| diff --git a/src/compiler/wasm-compiler.cc b/src/compiler/wasm-compiler.cc |
| index 300547a31add6284d64c51dacbd9f7761351b962..5d037d904dc7c1fcc0d5410c334f97222a09ac8c 100644 |
| --- a/src/compiler/wasm-compiler.cc |
| +++ b/src/compiler/wasm-compiler.cc |
| @@ -276,7 +276,7 @@ WasmGraphBuilder::WasmGraphBuilder( |
| module_(nullptr), |
| mem_buffer_(nullptr), |
| mem_size_(nullptr), |
| - function_table_(nullptr), |
| + function_table_(zone), |
| control_(nullptr), |
| effect_(nullptr), |
| cur_buffer_(def_buffer_), |
| @@ -2058,10 +2058,12 @@ Node* WasmGraphBuilder::CallIndirect(uint32_t index, Node** args, |
| Node* key = args[0]; |
| // Bounds check the index. |
| - int table_size = static_cast<int>(module_->FunctionTableSize()); |
| - if (table_size > 0) { |
| + int table_size = 0; |
| + // Assume only one table for now. |
|
ahaas
2016/07/25 19:23:44
Could you add a DCHECK for this assumption?
ddchen
2016/07/25 22:17:36
Done.
|
| + if (module_->IsValidTable(0) && |
| + ((table_size = module_->GetTable(0)->max_size) > 0)) { |
|
ahaas
2016/07/25 19:23:44
I personally don't like assignments in conditions.
ddchen
2016/07/25 22:17:36
Done.
|
| // Bounds check against the table size. |
| - Node* size = Int32Constant(static_cast<int>(table_size)); |
| + Node* size = Int32Constant(table_size); |
| Node* in_bounds = graph()->NewNode(machine->Uint32LessThan(), key, size); |
| trap_->AddTrapIfFalse(wasm::kTrapFuncInvalid, in_bounds, position); |
| } else { |
| @@ -2069,7 +2071,7 @@ Node* WasmGraphBuilder::CallIndirect(uint32_t index, Node** args, |
| trap_->AddTrapIfFalse(wasm::kTrapFuncInvalid, Int32Constant(0), position); |
| return trap_->GetTrapValue(module_->GetSignature(index)); |
| } |
| - Node* table = FunctionTable(); |
| + Node* table = FunctionTable(0); |
| // Load signature from the table and check. |
| // The table is a FixedArray; signatures are encoded as SMIs. |
| @@ -2129,10 +2131,12 @@ Node* WasmGraphBuilder::JITSingleFunction(Node* const base, Node* const length, |
| // Bounds check the index. |
| { |
| - int table_size = static_cast<int>(module_->FunctionTableSize()); |
| - if (table_size > 0) { |
| + int table_size = 0; |
| + // Assume only one table for now. |
|
ahaas
2016/07/25 19:23:44
same here.
ddchen
2016/07/25 22:17:36
Done.
|
| + if (module_->IsValidTable(0) && |
| + ((table_size = module_->GetTable(0)->max_size) > 0)) { |
| // Bounds check against the table size. |
| - Node* size = Int32Constant(static_cast<int>(table_size)); |
| + Node* size = Int32Constant(table_size); |
| Node* in_bounds = |
| graph()->NewNode(machine->Uint32LessThan(), index, size); |
| trap_->AddTrapIfFalse(wasm::kTrapInvalidIndex, in_bounds, position); |
| @@ -2162,7 +2166,7 @@ Node* WasmGraphBuilder::JITSingleFunction(Node* const base, Node* const length, |
| inputs[1] = BuildChangeUint32ToSmi(base); |
| inputs[2] = BuildChangeUint32ToSmi(length); |
| inputs[3] = BuildChangeUint32ToSmi(index); |
| - inputs[4] = FunctionTable(); |
| + inputs[4] = FunctionTable(0); |
| inputs[5] = Uint32Constant(sig_index); |
| inputs[6] = BuildChangeUint32ToSmi(Uint32Constant(return_count)); |
| @@ -2804,13 +2808,20 @@ Node* WasmGraphBuilder::DefaultS128Value() { |
| zero, zero); |
| } |
| -Node* WasmGraphBuilder::FunctionTable() { |
| +Node* WasmGraphBuilder::FunctionTable(uint32_t index) { |
| DCHECK(module_ && module_->instance && |
| - !module_->instance->function_table.is_null()); |
| - if (!function_table_) { |
| - function_table_ = HeapConstant(module_->instance->function_table); |
| + index < module_->instance->function_table.size()); |
| + if (index >= function_table_.size()) { |
| + for (uint32_t i = 0; i <= index; i++) { |
| + if (i < function_table_.size() && function_table_[i]) { |
| + continue; |
| + } |
| + DCHECK(!module_->instance->function_table[index].is_null()); |
|
ahaas
2016/07/25 19:23:44
Shouldn't this be {i} instead of {index}? If you r
|
| + function_table_.push_back( |
|
ahaas
2016/07/25 19:23:44
Does {push_back} actually add the element at the r
ddchen
2016/07/25 22:17:36
This code was incorrect, it should be fixed now.
|
| + HeapConstant(module_->instance->function_table[index])); |
| + } |
| } |
| - return function_table_; |
| + return function_table_[index]; |
| } |
| Node* WasmGraphBuilder::ChangeToRuntimeCall(Node* node, |