| Index: src/compiler/code-stub-assembler.cc
 | 
| diff --git a/src/compiler/code-stub-assembler.cc b/src/compiler/code-stub-assembler.cc
 | 
| index 8bbf1a6f42ba48635e1345490897c70e994ddd9c..f4ecab605bc2977eda7de9d79d3fd1291cc9db29 100644
 | 
| --- a/src/compiler/code-stub-assembler.cc
 | 
| +++ b/src/compiler/code-stub-assembler.cc
 | 
| @@ -26,11 +26,14 @@ namespace compiler {
 | 
|  
 | 
|  CodeStubAssembler::CodeStubAssembler(Isolate* isolate, Zone* zone,
 | 
|                                       const CallInterfaceDescriptor& descriptor,
 | 
| -                                     Code::Flags flags, const char* name)
 | 
| +                                     Code::Flags flags, const char* name,
 | 
| +                                     size_t result_size)
 | 
|      : raw_assembler_(new RawMachineAssembler(
 | 
|            isolate, new (zone) Graph(zone),
 | 
| -          Linkage::GetStubCallDescriptor(isolate, zone, descriptor, 0,
 | 
| -                                         CallDescriptor::kNoFlags))),
 | 
| +          Linkage::GetStubCallDescriptor(
 | 
| +              isolate, zone, descriptor, descriptor.GetStackParameterCount(),
 | 
| +              CallDescriptor::kNoFlags, Operator::kNoProperties,
 | 
| +              MachineType::AnyTagged(), result_size))),
 | 
|        flags_(flags),
 | 
|        name_(name),
 | 
|        code_generated_(false),
 | 
| @@ -38,6 +41,9 @@ CodeStubAssembler::CodeStubAssembler(Isolate* isolate, Zone* zone,
 | 
|  
 | 
|  CodeStubAssembler::~CodeStubAssembler() {}
 | 
|  
 | 
| +void CodeStubAssembler::CallPrologue() {}
 | 
| +
 | 
| +void CodeStubAssembler::CallEpilogue() {}
 | 
|  
 | 
|  Handle<Code> CodeStubAssembler::GenerateCode() {
 | 
|    DCHECK(!code_generated_);
 | 
| @@ -97,6 +103,10 @@ Node* CodeStubAssembler::LoadFramePointer() {
 | 
|    return raw_assembler_->LoadFramePointer();
 | 
|  }
 | 
|  
 | 
| +Node* CodeStubAssembler::LoadStackPointer() {
 | 
| +  return raw_assembler_->LoadStackPointer();
 | 
| +}
 | 
| +
 | 
|  Node* CodeStubAssembler::SmiShiftBitsConstant() {
 | 
|    return Int32Constant(kSmiShiftSize + kSmiTagSize);
 | 
|  }
 | 
| @@ -118,6 +128,10 @@ Node* CodeStubAssembler::SmiUntag(Node* value) {
 | 
|  CODE_STUB_ASSEMBLER_BINARY_OP_LIST(DEFINE_CODE_STUB_ASSEMBER_BINARY_OP)
 | 
|  #undef DEFINE_CODE_STUB_ASSEMBER_BINARY_OP
 | 
|  
 | 
| +Node* CodeStubAssembler::ChangeInt32ToInt64(Node* value) {
 | 
| +  return raw_assembler_->ChangeInt32ToInt64(value);
 | 
| +}
 | 
| +
 | 
|  Node* CodeStubAssembler::WordShl(Node* value, int shift) {
 | 
|    return raw_assembler_->WordShl(value, Int32Constant(shift));
 | 
|  }
 | 
| @@ -179,9 +193,45 @@ Node* CodeStubAssembler::LoadRoot(Heap::RootListIndex root_index) {
 | 
|    return nullptr;
 | 
|  }
 | 
|  
 | 
| +Node* CodeStubAssembler::Load(MachineType rep, Node* base) {
 | 
| +  return raw_assembler_->Load(rep, base);
 | 
| +}
 | 
| +
 | 
| +Node* CodeStubAssembler::Load(MachineType rep, Node* base, Node* index) {
 | 
| +  return raw_assembler_->Load(rep, base, index);
 | 
| +}
 | 
| +
 | 
| +Node* CodeStubAssembler::Store(MachineRepresentation rep, Node* base,
 | 
| +                               Node* value) {
 | 
| +  return raw_assembler_->Store(rep, base, value, kFullWriteBarrier);
 | 
| +}
 | 
| +
 | 
| +Node* CodeStubAssembler::Store(MachineRepresentation rep, Node* base,
 | 
| +                               Node* index, Node* value) {
 | 
| +  return raw_assembler_->Store(rep, base, index, value, kFullWriteBarrier);
 | 
| +}
 | 
| +
 | 
| +Node* CodeStubAssembler::StoreNoWriteBarrier(MachineRepresentation rep,
 | 
| +                                             Node* base, Node* value) {
 | 
| +  return raw_assembler_->Store(rep, base, value, kNoWriteBarrier);
 | 
| +}
 | 
| +
 | 
| +Node* CodeStubAssembler::StoreNoWriteBarrier(MachineRepresentation rep,
 | 
| +                                             Node* base, Node* index,
 | 
| +                                             Node* value) {
 | 
| +  return raw_assembler_->Store(rep, base, index, value, kNoWriteBarrier);
 | 
| +}
 | 
| +
 | 
| +Node* CodeStubAssembler::Projection(int index, Node* value) {
 | 
| +  return raw_assembler_->Projection(index, value);
 | 
| +}
 | 
| +
 | 
|  Node* CodeStubAssembler::CallN(CallDescriptor* descriptor, Node* code_target,
 | 
|                                 Node** args) {
 | 
| -  return raw_assembler_->CallN(descriptor, code_target, args);
 | 
| +  CallPrologue();
 | 
| +  Node* return_value = raw_assembler_->CallN(descriptor, code_target, args);
 | 
| +  CallEpilogue();
 | 
| +  return return_value;
 | 
|  }
 | 
|  
 | 
|  
 | 
| @@ -190,16 +240,49 @@ Node* CodeStubAssembler::TailCallN(CallDescriptor* descriptor,
 | 
|    return raw_assembler_->TailCallN(descriptor, code_target, args);
 | 
|  }
 | 
|  
 | 
| +Node* CodeStubAssembler::CallRuntime(Runtime::FunctionId function_id,
 | 
| +                                     Node* context) {
 | 
| +  CallPrologue();
 | 
| +  Node* return_value = raw_assembler_->CallRuntime0(function_id, context);
 | 
| +  CallEpilogue();
 | 
| +  return return_value;
 | 
| +}
 | 
|  
 | 
|  Node* CodeStubAssembler::CallRuntime(Runtime::FunctionId function_id,
 | 
|                                       Node* context, Node* arg1) {
 | 
| -  return raw_assembler_->CallRuntime1(function_id, arg1, context);
 | 
| +  CallPrologue();
 | 
| +  Node* return_value = raw_assembler_->CallRuntime1(function_id, arg1, context);
 | 
| +  CallEpilogue();
 | 
| +  return return_value;
 | 
|  }
 | 
|  
 | 
| -
 | 
|  Node* CodeStubAssembler::CallRuntime(Runtime::FunctionId function_id,
 | 
|                                       Node* context, Node* arg1, Node* arg2) {
 | 
| -  return raw_assembler_->CallRuntime2(function_id, arg1, arg2, context);
 | 
| +  CallPrologue();
 | 
| +  Node* return_value =
 | 
| +      raw_assembler_->CallRuntime2(function_id, arg1, arg2, context);
 | 
| +  CallEpilogue();
 | 
| +  return return_value;
 | 
| +}
 | 
| +
 | 
| +Node* CodeStubAssembler::CallRuntime(Runtime::FunctionId function_id,
 | 
| +                                     Node* context, Node* arg1, Node* arg2,
 | 
| +                                     Node* arg3) {
 | 
| +  CallPrologue();
 | 
| +  Node* return_value =
 | 
| +      raw_assembler_->CallRuntime3(function_id, arg1, arg2, arg3, context);
 | 
| +  CallEpilogue();
 | 
| +  return return_value;
 | 
| +}
 | 
| +
 | 
| +Node* CodeStubAssembler::CallRuntime(Runtime::FunctionId function_id,
 | 
| +                                     Node* context, Node* arg1, Node* arg2,
 | 
| +                                     Node* arg3, Node* arg4) {
 | 
| +  CallPrologue();
 | 
| +  Node* return_value = raw_assembler_->CallRuntime4(function_id, arg1, arg2,
 | 
| +                                                    arg3, arg4, context);
 | 
| +  CallEpilogue();
 | 
| +  return return_value;
 | 
|  }
 | 
|  
 | 
|  Node* CodeStubAssembler::TailCallRuntime(Runtime::FunctionId function_id,
 | 
| @@ -227,6 +310,93 @@ Node* CodeStubAssembler::TailCallRuntime(Runtime::FunctionId function_id,
 | 
|                                            context);
 | 
|  }
 | 
|  
 | 
| +Node* CodeStubAssembler::CallStub(const CallInterfaceDescriptor& descriptor,
 | 
| +                                  Node* target, Node* context, Node* arg1,
 | 
| +                                  size_t result_size) {
 | 
| +  CallDescriptor* call_descriptor = Linkage::GetStubCallDescriptor(
 | 
| +      isolate(), zone(), descriptor, descriptor.GetStackParameterCount(),
 | 
| +      CallDescriptor::kNoFlags, Operator::kNoProperties,
 | 
| +      MachineType::AnyTagged(), result_size);
 | 
| +
 | 
| +  Node** args = zone()->NewArray<Node*>(2);
 | 
| +  args[0] = arg1;
 | 
| +  args[1] = context;
 | 
| +
 | 
| +  return CallN(call_descriptor, target, args);
 | 
| +}
 | 
| +
 | 
| +Node* CodeStubAssembler::CallStub(const CallInterfaceDescriptor& descriptor,
 | 
| +                                  Node* target, Node* context, Node* arg1,
 | 
| +                                  Node* arg2, size_t result_size) {
 | 
| +  CallDescriptor* call_descriptor = Linkage::GetStubCallDescriptor(
 | 
| +      isolate(), zone(), descriptor, descriptor.GetStackParameterCount(),
 | 
| +      CallDescriptor::kNoFlags, Operator::kNoProperties,
 | 
| +      MachineType::AnyTagged(), result_size);
 | 
| +
 | 
| +  Node** args = zone()->NewArray<Node*>(3);
 | 
| +  args[0] = arg1;
 | 
| +  args[1] = arg2;
 | 
| +  args[2] = context;
 | 
| +
 | 
| +  return CallN(call_descriptor, target, args);
 | 
| +}
 | 
| +
 | 
| +Node* CodeStubAssembler::CallStub(const CallInterfaceDescriptor& descriptor,
 | 
| +                                  Node* target, Node* context, Node* arg1,
 | 
| +                                  Node* arg2, Node* arg3, size_t result_size) {
 | 
| +  CallDescriptor* call_descriptor = Linkage::GetStubCallDescriptor(
 | 
| +      isolate(), zone(), descriptor, descriptor.GetStackParameterCount(),
 | 
| +      CallDescriptor::kNoFlags, Operator::kNoProperties,
 | 
| +      MachineType::AnyTagged(), result_size);
 | 
| +
 | 
| +  Node** args = zone()->NewArray<Node*>(4);
 | 
| +  args[0] = arg1;
 | 
| +  args[1] = arg2;
 | 
| +  args[2] = arg3;
 | 
| +  args[3] = context;
 | 
| +
 | 
| +  return CallN(call_descriptor, target, args);
 | 
| +}
 | 
| +
 | 
| +Node* CodeStubAssembler::CallStub(const CallInterfaceDescriptor& descriptor,
 | 
| +                                  Node* target, Node* context, Node* arg1,
 | 
| +                                  Node* arg2, Node* arg3, Node* arg4,
 | 
| +                                  size_t result_size) {
 | 
| +  CallDescriptor* call_descriptor = Linkage::GetStubCallDescriptor(
 | 
| +      isolate(), zone(), descriptor, descriptor.GetStackParameterCount(),
 | 
| +      CallDescriptor::kNoFlags, Operator::kNoProperties,
 | 
| +      MachineType::AnyTagged(), result_size);
 | 
| +
 | 
| +  Node** args = zone()->NewArray<Node*>(5);
 | 
| +  args[0] = arg1;
 | 
| +  args[1] = arg2;
 | 
| +  args[2] = arg3;
 | 
| +  args[3] = arg4;
 | 
| +  args[4] = context;
 | 
| +
 | 
| +  return CallN(call_descriptor, target, args);
 | 
| +}
 | 
| +
 | 
| +Node* CodeStubAssembler::CallStub(const CallInterfaceDescriptor& descriptor,
 | 
| +                                  Node* target, Node* context, Node* arg1,
 | 
| +                                  Node* arg2, Node* arg3, Node* arg4,
 | 
| +                                  Node* arg5, size_t result_size) {
 | 
| +  CallDescriptor* call_descriptor = Linkage::GetStubCallDescriptor(
 | 
| +      isolate(), zone(), descriptor, descriptor.GetStackParameterCount(),
 | 
| +      CallDescriptor::kNoFlags, Operator::kNoProperties,
 | 
| +      MachineType::AnyTagged(), result_size);
 | 
| +
 | 
| +  Node** args = zone()->NewArray<Node*>(6);
 | 
| +  args[0] = arg1;
 | 
| +  args[1] = arg2;
 | 
| +  args[2] = arg3;
 | 
| +  args[3] = arg4;
 | 
| +  args[4] = arg5;
 | 
| +  args[5] = context;
 | 
| +
 | 
| +  return CallN(call_descriptor, target, args);
 | 
| +}
 | 
| +
 | 
|  Node* CodeStubAssembler::TailCallStub(CodeStub& stub, Node** args) {
 | 
|    Node* code_target = HeapConstant(stub.GetCode());
 | 
|    CallDescriptor* descriptor = Linkage::GetStubCallDescriptor(
 | 
| @@ -237,11 +407,12 @@ Node* CodeStubAssembler::TailCallStub(CodeStub& stub, Node** args) {
 | 
|  
 | 
|  Node* CodeStubAssembler::TailCall(
 | 
|      const CallInterfaceDescriptor& interface_descriptor, Node* code_target,
 | 
| -    Node** args) {
 | 
| +    Node** args, size_t result_size) {
 | 
|    CallDescriptor* descriptor = Linkage::GetStubCallDescriptor(
 | 
|        isolate(), zone(), interface_descriptor,
 | 
|        interface_descriptor.GetStackParameterCount(),
 | 
| -      CallDescriptor::kSupportsTailCalls);
 | 
| +      CallDescriptor::kSupportsTailCalls, Operator::kNoProperties,
 | 
| +      MachineType::AnyTagged(), result_size);
 | 
|    return raw_assembler_->TailCallN(descriptor, code_target, args);
 | 
|  }
 | 
|  
 | 
| @@ -277,10 +448,8 @@ void CodeStubAssembler::Switch(Node* index, Label* default_label,
 | 
|  // RawMachineAssembler delegate helpers:
 | 
|  Isolate* CodeStubAssembler::isolate() { return raw_assembler_->isolate(); }
 | 
|  
 | 
| -
 | 
|  Graph* CodeStubAssembler::graph() { return raw_assembler_->graph(); }
 | 
|  
 | 
| -
 | 
|  Zone* CodeStubAssembler::zone() { return raw_assembler_->zone(); }
 | 
|  
 | 
|  // The core implementation of Variable is stored through an indirection so
 | 
| 
 |