Home | History | Annotate | Download | only in builtins
      1 // Copyright 2016 the V8 project authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "src/builtins/builtins-utils.h"
      6 #include "src/builtins/builtins.h"
      7 #include "src/objects-inl.h"
      8 
      9 namespace v8 {
     10 namespace internal {
     11 
     12 Handle<Code> Builtins::InterpreterPushArgsAndCall(
     13     TailCallMode tail_call_mode, InterpreterPushArgsMode mode) {
     14   switch (mode) {
     15     case InterpreterPushArgsMode::kJSFunction:
     16       if (tail_call_mode == TailCallMode::kDisallow) {
     17         return InterpreterPushArgsAndCallFunction();
     18       } else {
     19         return InterpreterPushArgsAndTailCallFunction();
     20       }
     21     case InterpreterPushArgsMode::kWithFinalSpread:
     22       CHECK(tail_call_mode == TailCallMode::kDisallow);
     23       return InterpreterPushArgsAndCallWithFinalSpread();
     24     case InterpreterPushArgsMode::kOther:
     25       if (tail_call_mode == TailCallMode::kDisallow) {
     26         return InterpreterPushArgsAndCall();
     27       } else {
     28         return InterpreterPushArgsAndTailCall();
     29       }
     30   }
     31   UNREACHABLE();
     32   return Handle<Code>::null();
     33 }
     34 
     35 void Builtins::Generate_InterpreterPushArgsAndCall(MacroAssembler* masm) {
     36   return Generate_InterpreterPushArgsAndCallImpl(
     37       masm, TailCallMode::kDisallow, InterpreterPushArgsMode::kOther);
     38 }
     39 
     40 void Builtins::Generate_InterpreterPushArgsAndCallFunction(
     41     MacroAssembler* masm) {
     42   return Generate_InterpreterPushArgsAndCallImpl(
     43       masm, TailCallMode::kDisallow, InterpreterPushArgsMode::kJSFunction);
     44 }
     45 
     46 void Builtins::Generate_InterpreterPushArgsAndCallWithFinalSpread(
     47     MacroAssembler* masm) {
     48   return Generate_InterpreterPushArgsAndCallImpl(
     49       masm, TailCallMode::kDisallow, InterpreterPushArgsMode::kWithFinalSpread);
     50 }
     51 
     52 void Builtins::Generate_InterpreterPushArgsAndTailCall(MacroAssembler* masm) {
     53   return Generate_InterpreterPushArgsAndCallImpl(
     54       masm, TailCallMode::kAllow, InterpreterPushArgsMode::kOther);
     55 }
     56 
     57 void Builtins::Generate_InterpreterPushArgsAndTailCallFunction(
     58     MacroAssembler* masm) {
     59   return Generate_InterpreterPushArgsAndCallImpl(
     60       masm, TailCallMode::kAllow, InterpreterPushArgsMode::kJSFunction);
     61 }
     62 
     63 Handle<Code> Builtins::InterpreterPushArgsAndConstruct(
     64     InterpreterPushArgsMode mode) {
     65   switch (mode) {
     66     case InterpreterPushArgsMode::kJSFunction:
     67       return InterpreterPushArgsAndConstructFunction();
     68     case InterpreterPushArgsMode::kWithFinalSpread:
     69       return InterpreterPushArgsAndConstructWithFinalSpread();
     70     case InterpreterPushArgsMode::kOther:
     71       return InterpreterPushArgsAndConstruct();
     72   }
     73   UNREACHABLE();
     74   return Handle<Code>::null();
     75 }
     76 
     77 void Builtins::Generate_InterpreterPushArgsAndConstruct(MacroAssembler* masm) {
     78   return Generate_InterpreterPushArgsAndConstructImpl(
     79       masm, InterpreterPushArgsMode::kOther);
     80 }
     81 
     82 void Builtins::Generate_InterpreterPushArgsAndConstructWithFinalSpread(
     83     MacroAssembler* masm) {
     84   return Generate_InterpreterPushArgsAndConstructImpl(
     85       masm, InterpreterPushArgsMode::kWithFinalSpread);
     86 }
     87 
     88 void Builtins::Generate_InterpreterPushArgsAndConstructFunction(
     89     MacroAssembler* masm) {
     90   return Generate_InterpreterPushArgsAndConstructImpl(
     91       masm, InterpreterPushArgsMode::kJSFunction);
     92 }
     93 
     94 }  // namespace internal
     95 }  // namespace v8
     96