| Index: src/compiler/wasm-compiler.cc | 
| diff --git a/src/compiler/wasm-compiler.cc b/src/compiler/wasm-compiler.cc | 
| index b457efec4ec3e0e34ddd7305b16f1539a29fc631..07df3857d3df057fdf3a9b3be4549c5296b240af 100644 | 
| --- a/src/compiler/wasm-compiler.cc | 
| +++ b/src/compiler/wasm-compiler.cc | 
| @@ -63,6 +63,39 @@ void MergeControlToEnd(JSGraph* jsgraph, Node* node) { | 
| } | 
| } | 
|  | 
| +Node* BuildCallToRuntime(Runtime::FunctionId f, JSGraph* jsgraph, | 
| +                         Handle<Context> context, Node** parameters, | 
| +                         int parameter_count, Node** effect_ptr, | 
| +                         Node** control_ptr) { | 
| +  // At the moment we only allow 2 parameters. If more parameters are needed, | 
| +  // then the size of {inputs} below has to be increased accordingly. | 
| +  DCHECK(parameter_count <= 2); | 
| +  const Runtime::Function* fun = Runtime::FunctionForId(f); | 
| +  CallDescriptor* desc = Linkage::GetRuntimeCallDescriptor( | 
| +      jsgraph->zone(), f, fun->nargs, Operator::kNoProperties, | 
| +      CallDescriptor::kNoFlags); | 
| +  // CEntryStubConstant nodes have to be created and cached in the main | 
| +  // thread. At the moment this is only done for CEntryStubConstant(1). | 
| +  DCHECK_EQ(1, fun->result_size); | 
| +  Node* inputs[8]; | 
| +  int count = 0; | 
| +  inputs[count++] = jsgraph->CEntryStubConstant(fun->result_size); | 
| +  for (int i = 0; i < parameter_count; i++) { | 
| +    inputs[count++] = parameters[i]; | 
| +  } | 
| +  inputs[count++] = jsgraph->ExternalConstant( | 
| +      ExternalReference(f, jsgraph->isolate()));         // ref | 
| +  inputs[count++] = jsgraph->Int32Constant(fun->nargs);  // arity | 
| +  inputs[count++] = jsgraph->HeapConstant(context);      // context | 
| +  inputs[count++] = *effect_ptr; | 
| +  inputs[count++] = *control_ptr; | 
| + | 
| +  Node* node = | 
| +      jsgraph->graph()->NewNode(jsgraph->common()->Call(desc), count, inputs); | 
| +  *effect_ptr = node; | 
| +  return node; | 
| +} | 
| + | 
| }  // namespace | 
|  | 
| // A helper that handles building graph fragments for trapping. | 
| @@ -226,30 +259,11 @@ class WasmTrapHelper : public ZoneObject { | 
| Node* trap_position_smi = builder_->BuildChangeInt32ToSmi(trap_position_); | 
|  | 
| if (module && !module->instance->context.is_null()) { | 
| -      // Use the module context to call the runtime to throw an exception. | 
| -      Runtime::FunctionId f = Runtime::kThrowWasmError; | 
| -      const Runtime::Function* fun = Runtime::FunctionForId(f); | 
| -      CallDescriptor* desc = Linkage::GetRuntimeCallDescriptor( | 
| -          jsgraph()->zone(), f, fun->nargs, Operator::kNoProperties, | 
| -          CallDescriptor::kNoFlags); | 
| -      // CEntryStubConstant nodes have to be created and cached in the main | 
| -      // thread. At the moment this is only done for CEntryStubConstant(1). | 
| -      DCHECK_EQ(1, fun->result_size); | 
| -      Node* inputs[] = { | 
| -          jsgraph()->CEntryStubConstant(fun->result_size),  // C entry | 
| -          trap_reason_smi,                                  // message id | 
| -          trap_position_smi,                                // byte position | 
| -          jsgraph()->ExternalConstant( | 
| -              ExternalReference(f, jsgraph()->isolate())),    // ref | 
| -          jsgraph()->Int32Constant(fun->nargs),               // arity | 
| -          builder_->HeapConstant(module->instance->context),  // context | 
| -          *effect_ptr, | 
| -          *control_ptr}; | 
| - | 
| -      Node* node = graph()->NewNode( | 
| -          common()->Call(desc), static_cast<int>(arraysize(inputs)), inputs); | 
| -      *effect_ptr = node; | 
| -      *control_ptr = graph()->NewNode(common()->IfSuccess(), node); | 
| +      Node* parameters[] = {trap_reason_smi,     // message id | 
| +                            trap_position_smi};  // byte position | 
| +      BuildCallToRuntime(Runtime::kThrowWasmError, jsgraph(), | 
| +                         module->instance->context, parameters, | 
| +                         arraysize(parameters), effect_ptr, control_ptr); | 
| } | 
| if (false) { | 
| // End the control flow with a throw | 
| @@ -2187,15 +2201,11 @@ Node* WasmGraphBuilder::ToJS(Node* node, wasm::LocalType type) { | 
| case wasm::kAstI32: | 
| return BuildChangeInt32ToTagged(node); | 
| case wasm::kAstI64: | 
| -      // TODO(titzer): i64->JS has no good solution right now. Using lower 32 | 
| -      // bits. | 
| -      if (jsgraph()->machine()->Is64()) { | 
| -        // On 32 bit platforms we do not have to do the truncation because the | 
| -        // node we get in as a parameter only contains the low word anyways. | 
| -        node = graph()->NewNode(jsgraph()->machine()->TruncateInt64ToInt32(), | 
| -                                node); | 
| -      } | 
| -      return BuildChangeInt32ToTagged(node); | 
| +      DCHECK(module_ && !module_->instance->context.is_null()); | 
| +      // Throw a TypeError. | 
| +      return BuildCallToRuntime(Runtime::kWasmThrowTypeError, jsgraph(), | 
| +                                module_->instance->context, nullptr, 0, effect_, | 
| +                                control_); | 
| case wasm::kAstF32: | 
| node = graph()->NewNode(jsgraph()->machine()->ChangeFloat32ToFloat64(), | 
| node); | 
| @@ -2222,7 +2232,6 @@ Node* WasmGraphBuilder::BuildJavaScriptToNumber(Node* node, Node* context, | 
| node, context, effect, control); | 
|  | 
| *effect_ = result; | 
| -  *control_ = graph()->NewNode(jsgraph()->common()->IfSuccess(), result); | 
|  | 
| return result; | 
| } | 
|  |