2 * Copyright (C) 2011 Apple Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
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.
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.
26 #ifndef DFGOperations_h
27 #define DFGOperations_h
31 #include <dfg/DFGJITCompiler.h>
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);
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
);
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.
71 DFGHandler(ExecState
* exec
, void* handler
)
80 DFGHandler
lookupExceptionHandler(ExecState
*, ReturnAddressPtr faultLocation
);
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
);
87 } } // namespace JSC::DFG