1 /**************************************************************************** 2 ** 3 ** Copyright (C) 2016 The Qt Company Ltd. 4 ** Contact: https://www.qt.io/licensing/ 5 ** 6 ** This file is part of the QtQml module of the Qt Toolkit. 7 ** 8 ** $QT_BEGIN_LICENSE:LGPL$ 9 ** Commercial License Usage 10 ** Licensees holding valid commercial Qt licenses may use this file in 11 ** accordance with the commercial license agreement provided with the 12 ** Software or, alternatively, in accordance with the terms contained in 13 ** a written agreement between you and The Qt Company. For licensing terms 14 ** and conditions see https://www.qt.io/terms-conditions. For further 15 ** information use the contact form at https://www.qt.io/contact-us. 16 ** 17 ** GNU Lesser General Public License Usage 18 ** Alternatively, this file may be used under the terms of the GNU Lesser 19 ** General Public License version 3 as published by the Free Software 20 ** Foundation and appearing in the file LICENSE.LGPL3 included in the 21 ** packaging of this file. Please review the following information to 22 ** ensure the GNU Lesser General Public License version 3 requirements 23 ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. 24 ** 25 ** GNU General Public License Usage 26 ** Alternatively, this file may be used under the terms of the GNU 27 ** General Public License version 2.0 or (at your option) the GNU General 28 ** Public license version 3 or any later version approved by the KDE Free 29 ** Qt Foundation. The licenses are as published by the Free Software 30 ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 31 ** included in the packaging of this file. Please review the following 32 ** information to ensure the GNU General Public License requirements will 33 ** be met: https://www.gnu.org/licenses/gpl-2.0.html and 34 ** https://www.gnu.org/licenses/gpl-3.0.html. 35 ** 36 ** $QT_END_LICENSE$ 37 ** 38 ****************************************************************************/ 39 #ifndef QV4RUNTIMEAPI_P_H 40 #define QV4RUNTIMEAPI_P_H 41 42 // 43 // W A R N I N G 44 // ------------- 45 // 46 // This file is not part of the Qt API. It exists purely as an 47 // implementation detail. This header file may change from version to 48 // version without notice, or even be removed. 49 // 50 // We mean it. 51 // 52 53 #include <private/qv4global_p.h> 54 #include <private/qv4staticvalue_p.h> 55 56 QT_BEGIN_NAMESPACE 57 58 namespace QV4 { 59 60 typedef uint Bool; 61 62 struct Q_QML_PRIVATE_EXPORT Runtime { 63 typedef ReturnedValue (*UnaryOperation)(const Value &value); 64 typedef ReturnedValue (*BinaryOperation)(const Value &left, const Value &right); 65 typedef ReturnedValue (*BinaryOperationContext)(ExecutionEngine *, const Value &left, const Value &right); 66 67 enum class Throws { No, Yes }; 68 enum class ChangesContext { No, Yes }; 69 enum class Pure { No, Yes }; 70 enum class LastArgumentIsOutputValue { No, Yes }; 71 72 template<Throws t, ChangesContext c = ChangesContext::No, Pure p = Pure::No, 73 LastArgumentIsOutputValue out = LastArgumentIsOutputValue::No> 74 struct Method 75 { 76 static constexpr bool throws = t == Throws::Yes; 77 static constexpr bool changesContext = c == ChangesContext::Yes; 78 static constexpr bool pure = p == Pure::Yes; 79 static constexpr bool lastArgumentIsOutputValue = out == LastArgumentIsOutputValue::Yes; 80 }; 81 using PureMethod = Method<Throws::No, ChangesContext::No, Pure::Yes>; 82 using IteratorMethod = Method<Throws::Yes, ChangesContext::No, Pure::No, 83 LastArgumentIsOutputValue::Yes>; 84 85 /* call */ 86 struct Q_QML_PRIVATE_EXPORT CallGlobalLookup : Method<Throws::Yes> 87 { 88 static ReturnedValue call(ExecutionEngine *, uint, Value[], int); 89 }; 90 struct Q_QML_PRIVATE_EXPORT CallQmlContextPropertyLookup : Method<Throws::Yes> 91 { 92 static ReturnedValue call(ExecutionEngine *, uint, Value[], int); 93 }; 94 struct Q_QML_PRIVATE_EXPORT CallName : Method<Throws::Yes> 95 { 96 static ReturnedValue call(ExecutionEngine *, int, Value[], int); 97 }; 98 struct Q_QML_PRIVATE_EXPORT CallProperty : Method<Throws::Yes> 99 { 100 static ReturnedValue call(ExecutionEngine *, const Value &, int, Value[], int); 101 }; 102 struct Q_QML_PRIVATE_EXPORT CallPropertyLookup : Method<Throws::Yes> 103 { 104 static ReturnedValue call(ExecutionEngine *, const Value &, uint, Value[], int); 105 }; 106 struct Q_QML_PRIVATE_EXPORT CallElement : Method<Throws::Yes> 107 { 108 static ReturnedValue call(ExecutionEngine *, const Value &, const Value &, Value[], int); 109 }; 110 struct Q_QML_PRIVATE_EXPORT CallValue : Method<Throws::Yes> 111 { 112 static ReturnedValue call(ExecutionEngine *, const Value &, Value[], int); 113 }; 114 struct Q_QML_PRIVATE_EXPORT CallWithReceiver : Method<Throws::Yes> 115 { 116 static ReturnedValue call(ExecutionEngine *, const Value &, const Value &, Value[], int); 117 }; 118 struct Q_QML_PRIVATE_EXPORT CallPossiblyDirectEval : Method<Throws::Yes> 119 { 120 static ReturnedValue call(ExecutionEngine *, Value[], int); 121 }; 122 struct Q_QML_PRIVATE_EXPORT CallWithSpread : Method<Throws::Yes> 123 { 124 static ReturnedValue call(ExecutionEngine *, const Value &, const Value &, Value[], int); 125 }; 126 struct Q_QML_PRIVATE_EXPORT TailCall : Method<Throws::Yes> 127 { 128 static ReturnedValue call(CppStackFrame *, ExecutionEngine *); 129 }; 130 131 /* construct */ 132 struct Q_QML_PRIVATE_EXPORT Construct : Method<Throws::Yes> 133 { 134 static ReturnedValue call(ExecutionEngine *, const Value &, const Value &, Value[], int); 135 }; 136 struct Q_QML_PRIVATE_EXPORT ConstructWithSpread : Method<Throws::Yes> 137 { 138 static ReturnedValue call(ExecutionEngine *, const Value &, const Value &, Value[], int); 139 }; 140 141 /* load & store */ 142 struct Q_QML_PRIVATE_EXPORT StoreNameStrict : Method<Throws::Yes> 143 { 144 static void call(ExecutionEngine *, int, const Value &); 145 }; 146 struct Q_QML_PRIVATE_EXPORT StoreNameSloppy : Method<Throws::Yes> 147 { 148 static void call(ExecutionEngine *, int, const Value &); 149 }; 150 struct Q_QML_PRIVATE_EXPORT StoreProperty : Method<Throws::Yes> 151 { 152 static void call(ExecutionEngine *, const Value &, int, const Value &); 153 }; 154 struct Q_QML_PRIVATE_EXPORT StoreElement : Method<Throws::Yes> 155 { 156 static void call(ExecutionEngine *, const Value &, const Value &, const Value &); 157 }; 158 struct Q_QML_PRIVATE_EXPORT LoadProperty : Method<Throws::Yes> 159 { 160 static ReturnedValue call(ExecutionEngine *, const Value &, int); 161 }; 162 struct Q_QML_PRIVATE_EXPORT LoadName : Method<Throws::Yes> 163 { 164 static ReturnedValue call(ExecutionEngine *, int); 165 }; 166 struct Q_QML_PRIVATE_EXPORT LoadElement : Method<Throws::Yes> 167 { 168 static ReturnedValue call(ExecutionEngine *, const Value &, const Value &); 169 }; 170 struct Q_QML_PRIVATE_EXPORT LoadSuperProperty : Method<Throws::Yes> 171 { 172 static ReturnedValue call(ExecutionEngine *, const Value &); 173 }; 174 struct Q_QML_PRIVATE_EXPORT StoreSuperProperty : Method<Throws::Yes> 175 { 176 static void call(ExecutionEngine *, const Value &, const Value &); 177 }; 178 struct Q_QML_PRIVATE_EXPORT LoadSuperConstructor : Method<Throws::Yes> 179 { 180 static ReturnedValue call(ExecutionEngine *, const Value &); 181 }; 182 struct Q_QML_PRIVATE_EXPORT LoadGlobalLookup : Method<Throws::Yes> 183 { 184 static ReturnedValue call(ExecutionEngine *, Function *, int); 185 }; 186 struct Q_QML_PRIVATE_EXPORT LoadQmlContextPropertyLookup : Method<Throws::Yes> 187 { 188 static ReturnedValue call(ExecutionEngine *, uint); 189 }; 190 struct Q_QML_PRIVATE_EXPORT GetLookup : Method<Throws::Yes> 191 { 192 static ReturnedValue call(ExecutionEngine *, Function *, const Value &, int); 193 }; 194 struct Q_QML_PRIVATE_EXPORT SetLookupStrict : Method<Throws::Yes> 195 { 196 static void call(Function *, const Value &, int, const Value &); 197 }; 198 struct Q_QML_PRIVATE_EXPORT SetLookupSloppy : Method<Throws::Yes> 199 { 200 static void call(Function *, const Value &, int, const Value &); 201 }; 202 203 /* typeof */ 204 struct Q_QML_PRIVATE_EXPORT TypeofValue : PureMethod 205 { 206 static ReturnedValue call(ExecutionEngine *, const Value &); 207 }; 208 struct Q_QML_PRIVATE_EXPORT TypeofName : Method<Throws::No> 209 { 210 static ReturnedValue call(ExecutionEngine *, int); 211 }; 212 213 /* delete */ 214 struct Q_QML_PRIVATE_EXPORT DeleteProperty_NoThrow : Method<Throws::No> 215 { 216 static Bool call(ExecutionEngine *, const Value &, const Value &); 217 }; 218 struct Q_QML_PRIVATE_EXPORT DeleteProperty : Method<Throws::Yes> 219 { 220 static ReturnedValue call(ExecutionEngine *, Function *, const Value &, const Value &); 221 }; 222 struct Q_QML_PRIVATE_EXPORT DeleteName_NoThrow : Method<Throws::No> 223 { 224 static Bool call(ExecutionEngine *, int); 225 }; 226 struct Q_QML_PRIVATE_EXPORT DeleteName : Method<Throws::Yes> 227 { 228 static ReturnedValue call(ExecutionEngine *, Function *, int); 229 }; 230 231 /* exceptions & scopes */ 232 struct Q_QML_PRIVATE_EXPORT ThrowException : Method<Throws::Yes> 233 { 234 static void call(ExecutionEngine *, const Value &); 235 }; 236 struct Q_QML_PRIVATE_EXPORT PushCallContext : Method<Throws::No, ChangesContext::Yes> 237 { 238 static void call(CppStackFrame *); 239 }; 240 struct Q_QML_PRIVATE_EXPORT PushWithContext : Method<Throws::Yes, ChangesContext::Yes> 241 { 242 static ReturnedValue call(ExecutionEngine *, const Value &); 243 }; 244 struct Q_QML_PRIVATE_EXPORT PushCatchContext : Method<Throws::No, ChangesContext::Yes> 245 { 246 static void call(ExecutionEngine *, int, int); 247 }; 248 struct Q_QML_PRIVATE_EXPORT PushBlockContext : Method<Throws::No, ChangesContext::Yes> 249 { 250 static void call(ExecutionEngine *, int); 251 }; 252 struct Q_QML_PRIVATE_EXPORT CloneBlockContext : Method<Throws::No, ChangesContext::Yes> 253 { 254 static void call(ExecutionEngine *); 255 }; 256 struct Q_QML_PRIVATE_EXPORT PushScriptContext : Method<Throws::No, ChangesContext::Yes> 257 { 258 static void call(ExecutionEngine *, int); 259 }; 260 struct Q_QML_PRIVATE_EXPORT PopScriptContext : Method<Throws::No, ChangesContext::Yes> 261 { 262 static void call(ExecutionEngine *); 263 }; 264 struct Q_QML_PRIVATE_EXPORT ThrowReferenceError : Method<Throws::Yes> 265 { 266 static void call(ExecutionEngine *, int); 267 }; 268 struct Q_QML_PRIVATE_EXPORT ThrowOnNullOrUndefined : Method<Throws::Yes> 269 { 270 static void call(ExecutionEngine *, const Value &); 271 }; 272 273 /* closures */ 274 struct Q_QML_PRIVATE_EXPORT Closure : Method<Throws::No> 275 { 276 static ReturnedValue call(ExecutionEngine *, int); 277 }; 278 279 /* Function header */ 280 struct Q_QML_PRIVATE_EXPORT ConvertThisToObject : Method<Throws::Yes> 281 { 282 static ReturnedValue call(ExecutionEngine *, const Value &); 283 }; 284 struct Q_QML_PRIVATE_EXPORT DeclareVar : Method<Throws::Yes> 285 { 286 static void call(ExecutionEngine *, Bool, int); 287 }; 288 struct Q_QML_PRIVATE_EXPORT CreateMappedArgumentsObject : Method<Throws::No> 289 { 290 static ReturnedValue call(ExecutionEngine *); 291 }; 292 struct Q_QML_PRIVATE_EXPORT CreateUnmappedArgumentsObject : Method<Throws::No> 293 { 294 static ReturnedValue call(ExecutionEngine *); 295 }; 296 struct Q_QML_PRIVATE_EXPORT CreateRestParameter : PureMethod 297 { 298 static ReturnedValue call(ExecutionEngine *, int); 299 }; 300 301 /* literals */ 302 struct Q_QML_PRIVATE_EXPORT ArrayLiteral : Method<Throws::Yes> 303 { 304 static ReturnedValue call(ExecutionEngine *, Value[], uint); 305 }; 306 struct Q_QML_PRIVATE_EXPORT ObjectLiteral : Method<Throws::Yes> 307 { 308 static ReturnedValue call(ExecutionEngine *, int, Value[], int); 309 }; 310 struct Q_QML_PRIVATE_EXPORT CreateClass : Method<Throws::Yes> 311 { 312 static ReturnedValue call(ExecutionEngine *, int, const Value &, Value[]); 313 }; 314 315 /* for-in, for-of and array destructuring */ 316 struct Q_QML_PRIVATE_EXPORT GetIterator : Method<Throws::Yes> 317 { 318 static ReturnedValue call(ExecutionEngine *, const Value &, int); 319 }; 320 struct Q_QML_PRIVATE_EXPORT IteratorNext : IteratorMethod 321 { 322 static ReturnedValue call(ExecutionEngine *, const Value &, Value *); 323 }; 324 struct Q_QML_PRIVATE_EXPORT IteratorNextForYieldStar : IteratorMethod 325 { 326 static ReturnedValue call(ExecutionEngine *, const Value &, const Value &, Value *); 327 }; 328 struct Q_QML_PRIVATE_EXPORT IteratorClose : Method<Throws::Yes> 329 { 330 static ReturnedValue call(ExecutionEngine *, const Value &, const Value &); 331 }; 332 struct Q_QML_PRIVATE_EXPORT DestructureRestElement : Method<Throws::Yes> 333 { 334 static ReturnedValue call(ExecutionEngine *, const Value &); 335 }; 336 337 /* conversions */ 338 struct Q_QML_PRIVATE_EXPORT ToObject : Method<Throws::Yes> 339 { 340 static ReturnedValue call(ExecutionEngine *, const Value &); 341 }; 342 struct Q_QML_PRIVATE_EXPORT ToBoolean : PureMethod 343 { 344 static Bool call(const Value &); 345 }; 346 struct Q_QML_PRIVATE_EXPORT ToNumber : Method<Throws::Yes> 347 { 348 static ReturnedValue call(ExecutionEngine *, const Value &); 349 }; 350 /* unary operators */ 351 struct Q_QML_PRIVATE_EXPORT UMinus : Method<Throws::Yes> 352 { 353 static ReturnedValue call(const Value &); 354 }; 355 356 /* binary operators */ 357 struct Q_QML_PRIVATE_EXPORT Instanceof : Method<Throws::Yes> 358 { 359 static ReturnedValue call(ExecutionEngine *, const Value &, const Value &); 360 }; 361 struct Q_QML_PRIVATE_EXPORT In : Method<Throws::Yes> 362 { 363 static ReturnedValue call(ExecutionEngine *, const Value &, const Value &); 364 }; 365 struct Q_QML_PRIVATE_EXPORT Add : Method<Throws::Yes> 366 { 367 static ReturnedValue call(ExecutionEngine *, const Value &, const Value &); 368 }; 369 struct Q_QML_PRIVATE_EXPORT Sub : Method<Throws::Yes> 370 { 371 static ReturnedValue call(const Value &, const Value &); 372 }; 373 struct Q_QML_PRIVATE_EXPORT Mul : Method<Throws::Yes> 374 { 375 static ReturnedValue call(const Value &, const Value &); 376 }; 377 struct Q_QML_PRIVATE_EXPORT Div : Method<Throws::Yes> 378 { 379 static ReturnedValue call(const Value &, const Value &); 380 }; 381 struct Q_QML_PRIVATE_EXPORT Mod : Method<Throws::Yes> 382 { 383 static ReturnedValue call(const Value &, const Value &); 384 }; 385 struct Q_QML_PRIVATE_EXPORT Exp : Method<Throws::Yes> 386 { 387 static ReturnedValue call(const Value &, const Value &); 388 }; 389 struct Q_QML_PRIVATE_EXPORT BitAnd : Method<Throws::Yes> 390 { 391 static ReturnedValue call(const Value &, const Value &); 392 }; 393 struct Q_QML_PRIVATE_EXPORT BitOr : Method<Throws::Yes> 394 { 395 static ReturnedValue call(const Value &, const Value &); 396 }; 397 struct Q_QML_PRIVATE_EXPORT BitXor : Method<Throws::Yes> 398 { 399 static ReturnedValue call(const Value &, const Value &); 400 }; 401 struct Q_QML_PRIVATE_EXPORT Shl : Method<Throws::Yes> 402 { 403 static ReturnedValue call(const Value &, const Value &); 404 }; 405 struct Q_QML_PRIVATE_EXPORT Shr : Method<Throws::Yes> 406 { 407 static ReturnedValue call(const Value &, const Value &); 408 }; 409 struct Q_QML_PRIVATE_EXPORT UShr : Method<Throws::Yes> 410 { 411 static ReturnedValue call(const Value &, const Value &); 412 }; 413 struct Q_QML_PRIVATE_EXPORT GreaterThan : Method<Throws::Yes> 414 { 415 static ReturnedValue call(const Value &, const Value &); 416 }; 417 struct Q_QML_PRIVATE_EXPORT LessThan : Method<Throws::Yes> 418 { 419 static ReturnedValue call(const Value &, const Value &); 420 }; 421 struct Q_QML_PRIVATE_EXPORT GreaterEqual : Method<Throws::Yes> 422 { 423 static ReturnedValue call(const Value &, const Value &); 424 }; 425 struct Q_QML_PRIVATE_EXPORT LessEqual : Method<Throws::Yes> 426 { 427 static ReturnedValue call(const Value &, const Value &); 428 }; 429 struct Q_QML_PRIVATE_EXPORT Equal : Method<Throws::Yes> 430 { 431 static ReturnedValue call(const Value &, const Value &); 432 }; 433 struct Q_QML_PRIVATE_EXPORT NotEqual : Method<Throws::Yes> 434 { 435 static ReturnedValue call(const Value &, const Value &); 436 }; 437 struct Q_QML_PRIVATE_EXPORT StrictEqual : Method<Throws::Yes> 438 { 439 static ReturnedValue call(const Value &, const Value &); 440 }; 441 struct Q_QML_PRIVATE_EXPORT StrictNotEqual : Method<Throws::Yes> 442 { 443 static ReturnedValue call(const Value &, const Value &); 444 }; 445 446 /* comparisons */ 447 struct Q_QML_PRIVATE_EXPORT CompareGreaterThan : Method<Throws::Yes> 448 { 449 static Bool call(const Value &, const Value &); 450 }; 451 struct Q_QML_PRIVATE_EXPORT CompareLessThan : Method<Throws::Yes> 452 { 453 static Bool call(const Value &, const Value &); 454 }; 455 struct Q_QML_PRIVATE_EXPORT CompareGreaterEqual : Method<Throws::Yes> 456 { 457 static Bool call(const Value &, const Value &); 458 }; 459 struct Q_QML_PRIVATE_EXPORT CompareLessEqual : Method<Throws::Yes> 460 { 461 static Bool call(const Value &, const Value &); 462 }; 463 struct Q_QML_PRIVATE_EXPORT CompareEqual : Method<Throws::Yes> 464 { 465 static Bool call(const Value &, const Value &); 466 }; 467 struct Q_QML_PRIVATE_EXPORT CompareNotEqual : Method<Throws::Yes> 468 { 469 static Bool call(const Value &, const Value &); 470 }; 471 struct Q_QML_PRIVATE_EXPORT CompareStrictEqual : Method<Throws::Yes> 472 { 473 static Bool call(const Value &, const Value &); 474 }; 475 struct Q_QML_PRIVATE_EXPORT CompareStrictNotEqual : Method<Throws::Yes> 476 { 477 static Bool call(const Value &, const Value &); 478 }; 479 480 struct Q_QML_PRIVATE_EXPORT CompareInstanceof : Method<Throws::Yes> 481 { 482 static Bool call(ExecutionEngine *, const Value &, const Value &); 483 }; 484 struct Q_QML_PRIVATE_EXPORT CompareIn : Method<Throws::Yes> 485 { 486 static Bool call(ExecutionEngine *, const Value &, const Value &); 487 }; 488 489 struct Q_QML_PRIVATE_EXPORT RegexpLiteral : PureMethod 490 { 491 static ReturnedValue call(ExecutionEngine *, int); 492 }; 493 struct Q_QML_PRIVATE_EXPORT GetTemplateObject : PureMethod 494 { 495 static ReturnedValue call(Function *, int); 496 }; 497 498 struct StackOffsets { 499 static const int tailCall_function = -1; 500 static const int tailCall_thisObject = -2; 501 static const int tailCall_argv = -3; 502 static const int tailCall_argc = -4; 503 }; 504 505 static QHash<const void *, const char *> symbolTable(); 506 }; 507 508 static_assert(std::is_standard_layout<Runtime>::value, "Runtime needs to be standard layout in order for us to be able to use offsetof"); 509 static_assert(sizeof(Runtime::BinaryOperation) == sizeof(void*), "JIT expects a function pointer to fit into a regular pointer, for cross-compilation offset translation"); 510 511 } // namespace QV4 512 513 QT_END_NAMESPACE 514 515 #endif // QV4RUNTIMEAPI_P_H 516