Home | History | Annotate | Download | only in dfg
      1 /*
      2  * Copyright (C) 2011 Apple Inc. All rights reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions
      6  * are met:
      7  * 1. Redistributions of source code must retain the above copyright
      8  *    notice, this list of conditions and the following disclaimer.
      9  * 2. Redistributions in binary form must reproduce the above copyright
     10  *    notice, this list of conditions and the following disclaimer in the
     11  *    documentation and/or other materials provided with the distribution.
     12  *
     13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
     14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
     17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
     21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     24  */
     25 
     26 #ifndef DFGOperations_h
     27 #define DFGOperations_h
     28 
     29 #if ENABLE(DFG_JIT)
     30 
     31 #include <dfg/DFGJITCompiler.h>
     32 
     33 namespace JSC {
     34 
     35 class Identifier;
     36 
     37 namespace DFG {
     38 
     39 // These typedefs provide typechecking when generating calls out to helper routines;
     40 // this helps prevent calling a helper routine with the wrong arguments!
     41 typedef EncodedJSValue (*J_DFGOperation_EJJ)(ExecState*, EncodedJSValue, EncodedJSValue);
     42 typedef EncodedJSValue (*J_DFGOperation_EJ)(ExecState*, EncodedJSValue);
     43 typedef EncodedJSValue (*J_DFGOperation_EJP)(ExecState*, EncodedJSValue, void*);
     44 typedef EncodedJSValue (*J_DFGOperation_EJI)(ExecState*, EncodedJSValue, Identifier*);
     45 typedef bool (*Z_DFGOperation_EJ)(ExecState*, EncodedJSValue);
     46 typedef bool (*Z_DFGOperation_EJJ)(ExecState*, EncodedJSValue, EncodedJSValue);
     47 typedef void (*V_DFGOperation_EJJJ)(ExecState*, EncodedJSValue, EncodedJSValue, EncodedJSValue);
     48 typedef void (*V_DFGOperation_EJJP)(ExecState*, EncodedJSValue, EncodedJSValue, void*);
     49 typedef void (*V_DFGOperation_EJJI)(ExecState*, EncodedJSValue, EncodedJSValue, Identifier*);
     50 typedef double (*D_DFGOperation_DD)(double, double);
     51 
     52 // These routines are provide callbacks out to C++ implementations of operations too complex to JIT.
     53 EncodedJSValue operationConvertThis(ExecState*, EncodedJSValue encodedOp1);
     54 EncodedJSValue operationValueAdd(ExecState*, EncodedJSValue encodedOp1, EncodedJSValue encodedOp2);
     55 EncodedJSValue operationGetByVal(ExecState*, EncodedJSValue encodedBase, EncodedJSValue encodedProperty);
     56 EncodedJSValue operationGetById(ExecState*, EncodedJSValue encodedBase, Identifier*);
     57 void operationPutByValStrict(ExecState*, EncodedJSValue encodedBase, EncodedJSValue encodedProperty, EncodedJSValue encodedValue);
     58 void operationPutByValNonStrict(ExecState*, EncodedJSValue encodedBase, EncodedJSValue encodedProperty, EncodedJSValue encodedValue);
     59 void operationPutByIdStrict(ExecState*, EncodedJSValue encodedValue, EncodedJSValue encodedBase, Identifier*);
     60 void operationPutByIdNonStrict(ExecState*, EncodedJSValue encodedValue, EncodedJSValue encodedBase, Identifier*);
     61 void operationPutByIdDirectStrict(ExecState*, EncodedJSValue encodedValue, EncodedJSValue encodedBase, Identifier*);
     62 void operationPutByIdDirectNonStrict(ExecState*, EncodedJSValue encodedValue, EncodedJSValue encodedBase, Identifier*);
     63 bool operationCompareLess(ExecState*, EncodedJSValue encodedOp1, EncodedJSValue encodedOp2);
     64 bool operationCompareLessEq(ExecState*, EncodedJSValue encodedOp1, EncodedJSValue encodedOp2);
     65 bool operationCompareEq(ExecState*, EncodedJSValue encodedOp1, EncodedJSValue encodedOp2);
     66 bool operationCompareStrictEq(ExecState*, EncodedJSValue encodedOp1, EncodedJSValue encodedOp2);
     67 
     68 // This method is used to lookup an exception hander, keyed by faultLocation, which is
     69 // the return location from one of the calls out to one of the helper operations above.
     70 struct DFGHandler {
     71     DFGHandler(ExecState* exec, void* handler)
     72         : exec(exec)
     73         , handler(handler)
     74     {
     75     }
     76 
     77     ExecState* exec;
     78     void* handler;
     79 };
     80 DFGHandler lookupExceptionHandler(ExecState*, ReturnAddressPtr faultLocation);
     81 
     82 // These operations implement the implicitly called ToInt32, ToNumber, and ToBoolean conversions from ES5.
     83 double dfgConvertJSValueToNumber(ExecState*, EncodedJSValue);
     84 int32_t dfgConvertJSValueToInt32(ExecState*, EncodedJSValue);
     85 bool dfgConvertJSValueToBoolean(ExecState*, EncodedJSValue);
     86 
     87 } } // namespace JSC::DFG
     88 
     89 #endif
     90 #endif
     91