17d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// Copyright 2013 the V8 project authors. All rights reserved. 27d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// Use of this source code is governed by a BSD-style license that can be 37d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// found in the LICENSE file. 47d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 57d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#ifndef V8_COMPILER_JS_OPERATOR_H_ 67d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#define V8_COMPILER_JS_OPERATOR_H_ 77d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 831c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org#include "src/compiler/linkage.h" 97d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/opcodes.h" 107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/operator.h" 117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/unique.h" 127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/zone.h" 137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgnamespace v8 { 157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgnamespace internal { 167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgnamespace compiler { 177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// Defines the location of a context slot relative to a specific scope. This is 197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// used as a parameter by JSLoadContext and JSStoreContext operators and allows 207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// accessing a context-allocated variable without keeping track of the scope. 217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgclass ContextAccess { 227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org public: 237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ContextAccess(int depth, int index, bool immutable) 247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org : immutable_(immutable), depth_(depth), index_(index) { 25e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(0 <= depth && depth <= kMaxUInt16); 26e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(0 <= index && static_cast<uint32_t>(index) <= kMaxUInt32); 277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org int depth() const { return depth_; } 297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org int index() const { return index_; } 307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org bool immutable() const { return immutable_; } 317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org private: 337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // For space reasons, we keep this tightly packed, otherwise we could just use 347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // a simple int/int/bool POD. 357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org const bool immutable_; 367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org const uint16_t depth_; 377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org const uint32_t index_; 387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}; 397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 409d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org// Defines the property being loaded from an object by a named load. This is 419d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org// used as a parameter by JSLoadNamed operators. 429d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.orgstruct LoadNamedParameters { 431af4d9551ad496a28c342004b1a4e2a3840228f7machenbach@chromium.org Unique<Name> name; 449d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org ContextualMode contextual_mode; 459d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org}; 469d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org 477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// Defines the arity and the call flags for a JavaScript function call. This is 487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// used as a parameter by JSCall operators. 497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgstruct CallParameters { 507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org int arity; 517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CallFunctionFlags flags; 527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}; 537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 54c714f377950c6a8a80b90ddca93ad8bd23ce362amachenbach@chromium.org// Defines the property being stored to an object by a named store. This is 55c714f377950c6a8a80b90ddca93ad8bd23ce362amachenbach@chromium.org// used as a parameter by JSStoreNamed operators. 56c714f377950c6a8a80b90ddca93ad8bd23ce362amachenbach@chromium.orgstruct StoreNamedParameters { 57c714f377950c6a8a80b90ddca93ad8bd23ce362amachenbach@chromium.org StrictMode strict_mode; 581af4d9551ad496a28c342004b1a4e2a3840228f7machenbach@chromium.org Unique<Name> name; 59c714f377950c6a8a80b90ddca93ad8bd23ce362amachenbach@chromium.org}; 60c714f377950c6a8a80b90ddca93ad8bd23ce362amachenbach@chromium.org 617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// Interface for building JavaScript-level operators, e.g. directly from the 627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// AST. Most operators have no parameters, thus can be globally shared for all 637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// graphs. 647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgclass JSOperatorBuilder { 657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org public: 667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org explicit JSOperatorBuilder(Zone* zone) : zone_(zone) {} 677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#define SIMPLE(name, properties, inputs, outputs) \ 697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return new (zone_) \ 707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org SimpleOperator(IrOpcode::k##name, properties, inputs, outputs, #name); 717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#define NOPROPS(name, inputs, outputs) \ 737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org SIMPLE(name, Operator::kNoProperties, inputs, outputs) 747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#define OP1(name, ptype, pname, properties, inputs, outputs) \ 767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return new (zone_) Operator1<ptype>(IrOpcode::k##name, properties, inputs, \ 777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org outputs, #name, pname) 787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#define BINOP(name) NOPROPS(name, 2, 1) 807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#define UNOP(name) NOPROPS(name, 1, 1) 817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#define PURE_BINOP(name) SIMPLE(name, Operator::kPure, 2, 1) 837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 842c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org const Operator* Equal() { BINOP(JSEqual); } 852c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org const Operator* NotEqual() { BINOP(JSNotEqual); } 862c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org const Operator* StrictEqual() { PURE_BINOP(JSStrictEqual); } 872c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org const Operator* StrictNotEqual() { PURE_BINOP(JSStrictNotEqual); } 882c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org const Operator* LessThan() { BINOP(JSLessThan); } 892c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org const Operator* GreaterThan() { BINOP(JSGreaterThan); } 902c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org const Operator* LessThanOrEqual() { BINOP(JSLessThanOrEqual); } 912c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org const Operator* GreaterThanOrEqual() { BINOP(JSGreaterThanOrEqual); } 922c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org const Operator* BitwiseOr() { BINOP(JSBitwiseOr); } 932c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org const Operator* BitwiseXor() { BINOP(JSBitwiseXor); } 942c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org const Operator* BitwiseAnd() { BINOP(JSBitwiseAnd); } 952c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org const Operator* ShiftLeft() { BINOP(JSShiftLeft); } 962c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org const Operator* ShiftRight() { BINOP(JSShiftRight); } 972c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org const Operator* ShiftRightLogical() { BINOP(JSShiftRightLogical); } 982c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org const Operator* Add() { BINOP(JSAdd); } 992c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org const Operator* Subtract() { BINOP(JSSubtract); } 1002c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org const Operator* Multiply() { BINOP(JSMultiply); } 1012c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org const Operator* Divide() { BINOP(JSDivide); } 1022c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org const Operator* Modulus() { BINOP(JSModulus); } 1032c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org 1042c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org const Operator* UnaryNot() { UNOP(JSUnaryNot); } 1052c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org const Operator* ToBoolean() { UNOP(JSToBoolean); } 1062c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org const Operator* ToNumber() { UNOP(JSToNumber); } 1072c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org const Operator* ToString() { UNOP(JSToString); } 1082c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org const Operator* ToName() { UNOP(JSToName); } 1092c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org const Operator* ToObject() { UNOP(JSToObject); } 1102c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org const Operator* Yield() { UNOP(JSYield); } 1112c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org 1122c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org const Operator* Create() { SIMPLE(JSCreate, Operator::kEliminatable, 0, 1); } 1132c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org 1142c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org const Operator* Call(int arguments, CallFunctionFlags flags) { 1157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CallParameters parameters = {arguments, flags}; 1167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org OP1(JSCallFunction, CallParameters, parameters, Operator::kNoProperties, 1177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org arguments, 1); 1187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 1197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1202c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org const Operator* CallNew(int arguments) { 1217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return new (zone_) 1227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Operator1<int>(IrOpcode::kJSCallConstruct, Operator::kNoProperties, 1237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org arguments, 1, "JSCallConstruct", arguments); 1247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 1257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1262c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org const Operator* LoadProperty() { BINOP(JSLoadProperty); } 1272c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org const Operator* LoadNamed(Unique<Name> name, 1282c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org ContextualMode contextual_mode = NOT_CONTEXTUAL) { 1299d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org LoadNamedParameters parameters = {name, contextual_mode}; 1309d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org OP1(JSLoadNamed, LoadNamedParameters, parameters, Operator::kNoProperties, 1319d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org 1, 1); 1327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 1337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1342c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org const Operator* StoreProperty(StrictMode strict_mode) { 135c714f377950c6a8a80b90ddca93ad8bd23ce362amachenbach@chromium.org OP1(JSStoreProperty, StrictMode, strict_mode, Operator::kNoProperties, 3, 1367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 0); 1377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 1387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1392c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org const Operator* StoreNamed(StrictMode strict_mode, Unique<Name> name) { 140c714f377950c6a8a80b90ddca93ad8bd23ce362amachenbach@chromium.org StoreNamedParameters parameters = {strict_mode, name}; 141c714f377950c6a8a80b90ddca93ad8bd23ce362amachenbach@chromium.org OP1(JSStoreNamed, StoreNamedParameters, parameters, Operator::kNoProperties, 142c714f377950c6a8a80b90ddca93ad8bd23ce362amachenbach@chromium.org 2, 0); 143c714f377950c6a8a80b90ddca93ad8bd23ce362amachenbach@chromium.org } 144c714f377950c6a8a80b90ddca93ad8bd23ce362amachenbach@chromium.org 1452c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org const Operator* DeleteProperty(StrictMode strict_mode) { 1467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org OP1(JSDeleteProperty, StrictMode, strict_mode, Operator::kNoProperties, 2, 1477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1); 1487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 1497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1502c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org const Operator* HasProperty() { NOPROPS(JSHasProperty, 2, 1); } 1517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1522c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org const Operator* LoadContext(uint16_t depth, uint32_t index, bool immutable) { 1537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ContextAccess access(depth, index, immutable); 1547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org OP1(JSLoadContext, ContextAccess, access, 1557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Operator::kEliminatable | Operator::kNoWrite, 1, 1); 1567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 1572c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org const Operator* StoreContext(uint16_t depth, uint32_t index) { 1587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ContextAccess access(depth, index, false); 1592c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org OP1(JSStoreContext, ContextAccess, access, Operator::kNoProperties, 2, 0); 1607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 1617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1622c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org const Operator* TypeOf() { SIMPLE(JSTypeOf, Operator::kPure, 1, 1); } 1632c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org const Operator* InstanceOf() { NOPROPS(JSInstanceOf, 2, 1); } 1642c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org const Operator* Debugger() { NOPROPS(JSDebugger, 0, 0); } 1657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // TODO(titzer): nail down the static parts of each of these context flavors. 1672c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org const Operator* CreateFunctionContext() { 1682c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org NOPROPS(JSCreateFunctionContext, 1, 1); 1692c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org } 1702c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org const Operator* CreateCatchContext(Unique<String> name) { 1711af4d9551ad496a28c342004b1a4e2a3840228f7machenbach@chromium.org OP1(JSCreateCatchContext, Unique<String>, name, Operator::kNoProperties, 1, 1721af4d9551ad496a28c342004b1a4e2a3840228f7machenbach@chromium.org 1); 1737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 1742c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org const Operator* CreateWithContext() { NOPROPS(JSCreateWithContext, 2, 1); } 1752c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org const Operator* CreateBlockContext() { NOPROPS(JSCreateBlockContext, 2, 1); } 1762c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org const Operator* CreateModuleContext() { 1772c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org NOPROPS(JSCreateModuleContext, 2, 1); 1782c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org } 1792c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org const Operator* CreateGlobalContext() { 1802c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org NOPROPS(JSCreateGlobalContext, 2, 1); 1812c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org } 1827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1832c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org const Operator* Runtime(Runtime::FunctionId function, int arguments) { 1847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org const Runtime::Function* f = Runtime::FunctionForId(function); 185e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(f->nargs == -1 || f->nargs == arguments); 1867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org OP1(JSCallRuntime, Runtime::FunctionId, function, Operator::kNoProperties, 1877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org arguments, f->result_size); 1887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 1897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#undef SIMPLE 1917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#undef NOPROPS 1927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#undef OP1 1937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#undef BINOP 1947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#undef UNOP 1957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org private: 1977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Zone* zone_; 1987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}; 1997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 2007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// Specialization for static parameters of type {ContextAccess}. 2017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgtemplate <> 2027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgstruct StaticParameterTraits<ContextAccess> { 2037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org static OStream& PrintTo(OStream& os, ContextAccess val) { // NOLINT 2047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return os << val.depth() << "," << val.index() 2057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org << (val.immutable() ? ",imm" : ""); 2067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 2077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org static int HashCode(ContextAccess val) { 2087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return (val.depth() << 16) | (val.index() & 0xffff); 2097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 2107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org static bool Equals(ContextAccess a, ContextAccess b) { 2117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return a.immutable() == b.immutable() && a.depth() == b.depth() && 2127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org a.index() == b.index(); 2137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 2147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}; 2157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 2167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// Specialization for static parameters of type {Runtime::FunctionId}. 2177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgtemplate <> 2187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgstruct StaticParameterTraits<Runtime::FunctionId> { 2197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org static OStream& PrintTo(OStream& os, Runtime::FunctionId val) { // NOLINT 2207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org const Runtime::Function* f = Runtime::FunctionForId(val); 2217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return os << (f->name ? f->name : "?Runtime?"); 2227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 2237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org static int HashCode(Runtime::FunctionId val) { return static_cast<int>(val); } 2247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org static bool Equals(Runtime::FunctionId a, Runtime::FunctionId b) { 2257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return a == b; 2267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 2277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}; 2282c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org 2292c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org} // namespace compiler 2302c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org} // namespace internal 2312c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org} // namespace v8 2327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 2337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#endif // V8_COMPILER_JS_OPERATOR_H_ 234