11cb0ef41Sopenharmony_ci// Copyright 2014 the V8 project authors. All rights reserved. 21cb0ef41Sopenharmony_ci// Use of this source code is governed by a BSD-style license that can be 31cb0ef41Sopenharmony_ci// found in the LICENSE file. 41cb0ef41Sopenharmony_ci 51cb0ef41Sopenharmony_ci#include "src/compiler/js-operator.h" 61cb0ef41Sopenharmony_ci 71cb0ef41Sopenharmony_ci#include <limits> 81cb0ef41Sopenharmony_ci 91cb0ef41Sopenharmony_ci#include "src/base/lazy-instance.h" 101cb0ef41Sopenharmony_ci#include "src/compiler/js-graph.h" 111cb0ef41Sopenharmony_ci#include "src/compiler/js-heap-broker.h" 121cb0ef41Sopenharmony_ci#include "src/compiler/node-matchers.h" 131cb0ef41Sopenharmony_ci#include "src/compiler/operator.h" 141cb0ef41Sopenharmony_ci#include "src/handles/handles-inl.h" 151cb0ef41Sopenharmony_ci#include "src/objects/objects-inl.h" 161cb0ef41Sopenharmony_ci#include "src/objects/template-objects.h" 171cb0ef41Sopenharmony_ci 181cb0ef41Sopenharmony_cinamespace v8 { 191cb0ef41Sopenharmony_cinamespace internal { 201cb0ef41Sopenharmony_cinamespace compiler { 211cb0ef41Sopenharmony_ci 221cb0ef41Sopenharmony_cinamespace { 231cb0ef41Sopenharmony_ci 241cb0ef41Sopenharmony_ci// Returns properties for the given binary op. 251cb0ef41Sopenharmony_ciconstexpr Operator::Properties BinopProperties(Operator::Opcode opcode) { 261cb0ef41Sopenharmony_ci DCHECK(JSOperator::IsBinaryWithFeedback(opcode)); 271cb0ef41Sopenharmony_ci return opcode == IrOpcode::kJSStrictEqual ? Operator::kPure 281cb0ef41Sopenharmony_ci : Operator::kNoProperties; 291cb0ef41Sopenharmony_ci} 301cb0ef41Sopenharmony_ci 311cb0ef41Sopenharmony_citemplate <class T> 321cb0ef41Sopenharmony_ciAddress AddressOrNull(base::Optional<T> ref) { 331cb0ef41Sopenharmony_ci if (!ref.has_value()) return kNullAddress; 341cb0ef41Sopenharmony_ci return ref->object().address(); 351cb0ef41Sopenharmony_ci} 361cb0ef41Sopenharmony_ci 371cb0ef41Sopenharmony_ci} // namespace 381cb0ef41Sopenharmony_ci 391cb0ef41Sopenharmony_cinamespace js_node_wrapper_utils { 401cb0ef41Sopenharmony_ci 411cb0ef41Sopenharmony_ciTNode<Oddball> UndefinedConstant(JSGraph* jsgraph) { 421cb0ef41Sopenharmony_ci return TNode<Oddball>::UncheckedCast(jsgraph->UndefinedConstant()); 431cb0ef41Sopenharmony_ci} 441cb0ef41Sopenharmony_ci 451cb0ef41Sopenharmony_ci} // namespace js_node_wrapper_utils 461cb0ef41Sopenharmony_ci 471cb0ef41Sopenharmony_ciFeedbackCellRef JSCreateClosureNode::GetFeedbackCellRefChecked( 481cb0ef41Sopenharmony_ci JSHeapBroker* broker) const { 491cb0ef41Sopenharmony_ci HeapObjectMatcher m(feedback_cell()); 501cb0ef41Sopenharmony_ci CHECK(m.HasResolvedValue()); 511cb0ef41Sopenharmony_ci return MakeRef(broker, Handle<FeedbackCell>::cast(m.ResolvedValue())); 521cb0ef41Sopenharmony_ci} 531cb0ef41Sopenharmony_ci 541cb0ef41Sopenharmony_cistd::ostream& operator<<(std::ostream& os, CallFrequency const& f) { 551cb0ef41Sopenharmony_ci if (f.IsUnknown()) return os << "unknown"; 561cb0ef41Sopenharmony_ci return os << f.value(); 571cb0ef41Sopenharmony_ci} 581cb0ef41Sopenharmony_ci 591cb0ef41Sopenharmony_cistd::ostream& operator<<(std::ostream& os, 601cb0ef41Sopenharmony_ci ConstructForwardVarargsParameters const& p) { 611cb0ef41Sopenharmony_ci return os << p.arity() << ", " << p.start_index(); 621cb0ef41Sopenharmony_ci} 631cb0ef41Sopenharmony_ci 641cb0ef41Sopenharmony_ciConstructForwardVarargsParameters const& ConstructForwardVarargsParametersOf( 651cb0ef41Sopenharmony_ci Operator const* op) { 661cb0ef41Sopenharmony_ci DCHECK_EQ(IrOpcode::kJSConstructForwardVarargs, op->opcode()); 671cb0ef41Sopenharmony_ci return OpParameter<ConstructForwardVarargsParameters>(op); 681cb0ef41Sopenharmony_ci} 691cb0ef41Sopenharmony_ci 701cb0ef41Sopenharmony_cibool operator==(ConstructParameters const& lhs, 711cb0ef41Sopenharmony_ci ConstructParameters const& rhs) { 721cb0ef41Sopenharmony_ci return lhs.arity() == rhs.arity() && lhs.frequency() == rhs.frequency() && 731cb0ef41Sopenharmony_ci lhs.feedback() == rhs.feedback(); 741cb0ef41Sopenharmony_ci} 751cb0ef41Sopenharmony_ci 761cb0ef41Sopenharmony_cibool operator!=(ConstructParameters const& lhs, 771cb0ef41Sopenharmony_ci ConstructParameters const& rhs) { 781cb0ef41Sopenharmony_ci return !(lhs == rhs); 791cb0ef41Sopenharmony_ci} 801cb0ef41Sopenharmony_ci 811cb0ef41Sopenharmony_cisize_t hash_value(ConstructParameters const& p) { 821cb0ef41Sopenharmony_ci return base::hash_combine(p.arity(), p.frequency(), 831cb0ef41Sopenharmony_ci FeedbackSource::Hash()(p.feedback())); 841cb0ef41Sopenharmony_ci} 851cb0ef41Sopenharmony_ci 861cb0ef41Sopenharmony_cistd::ostream& operator<<(std::ostream& os, ConstructParameters const& p) { 871cb0ef41Sopenharmony_ci return os << p.arity() << ", " << p.frequency(); 881cb0ef41Sopenharmony_ci} 891cb0ef41Sopenharmony_ci 901cb0ef41Sopenharmony_ciConstructParameters const& ConstructParametersOf(Operator const* op) { 911cb0ef41Sopenharmony_ci DCHECK(op->opcode() == IrOpcode::kJSConstruct || 921cb0ef41Sopenharmony_ci op->opcode() == IrOpcode::kJSConstructWithArrayLike || 931cb0ef41Sopenharmony_ci op->opcode() == IrOpcode::kJSConstructWithSpread); 941cb0ef41Sopenharmony_ci return OpParameter<ConstructParameters>(op); 951cb0ef41Sopenharmony_ci} 961cb0ef41Sopenharmony_ci 971cb0ef41Sopenharmony_cistd::ostream& operator<<(std::ostream& os, CallParameters const& p) { 981cb0ef41Sopenharmony_ci return os << p.arity() << ", " << p.frequency() << ", " << p.convert_mode() 991cb0ef41Sopenharmony_ci << ", " << p.speculation_mode() << ", " << p.feedback_relation(); 1001cb0ef41Sopenharmony_ci} 1011cb0ef41Sopenharmony_ci 1021cb0ef41Sopenharmony_ciconst CallParameters& CallParametersOf(const Operator* op) { 1031cb0ef41Sopenharmony_ci DCHECK(op->opcode() == IrOpcode::kJSCall || 1041cb0ef41Sopenharmony_ci op->opcode() == IrOpcode::kJSCallWithArrayLike || 1051cb0ef41Sopenharmony_ci op->opcode() == IrOpcode::kJSCallWithSpread); 1061cb0ef41Sopenharmony_ci return OpParameter<CallParameters>(op); 1071cb0ef41Sopenharmony_ci} 1081cb0ef41Sopenharmony_ci 1091cb0ef41Sopenharmony_cistd::ostream& operator<<(std::ostream& os, 1101cb0ef41Sopenharmony_ci CallForwardVarargsParameters const& p) { 1111cb0ef41Sopenharmony_ci return os << p.arity() << ", " << p.start_index(); 1121cb0ef41Sopenharmony_ci} 1131cb0ef41Sopenharmony_ci 1141cb0ef41Sopenharmony_ciCallForwardVarargsParameters const& CallForwardVarargsParametersOf( 1151cb0ef41Sopenharmony_ci Operator const* op) { 1161cb0ef41Sopenharmony_ci DCHECK_EQ(IrOpcode::kJSCallForwardVarargs, op->opcode()); 1171cb0ef41Sopenharmony_ci return OpParameter<CallForwardVarargsParameters>(op); 1181cb0ef41Sopenharmony_ci} 1191cb0ef41Sopenharmony_ci 1201cb0ef41Sopenharmony_ci 1211cb0ef41Sopenharmony_cibool operator==(CallRuntimeParameters const& lhs, 1221cb0ef41Sopenharmony_ci CallRuntimeParameters const& rhs) { 1231cb0ef41Sopenharmony_ci return lhs.id() == rhs.id() && lhs.arity() == rhs.arity(); 1241cb0ef41Sopenharmony_ci} 1251cb0ef41Sopenharmony_ci 1261cb0ef41Sopenharmony_ci 1271cb0ef41Sopenharmony_cibool operator!=(CallRuntimeParameters const& lhs, 1281cb0ef41Sopenharmony_ci CallRuntimeParameters const& rhs) { 1291cb0ef41Sopenharmony_ci return !(lhs == rhs); 1301cb0ef41Sopenharmony_ci} 1311cb0ef41Sopenharmony_ci 1321cb0ef41Sopenharmony_ci 1331cb0ef41Sopenharmony_cisize_t hash_value(CallRuntimeParameters const& p) { 1341cb0ef41Sopenharmony_ci return base::hash_combine(p.id(), p.arity()); 1351cb0ef41Sopenharmony_ci} 1361cb0ef41Sopenharmony_ci 1371cb0ef41Sopenharmony_ci 1381cb0ef41Sopenharmony_cistd::ostream& operator<<(std::ostream& os, CallRuntimeParameters const& p) { 1391cb0ef41Sopenharmony_ci return os << p.id() << ", " << p.arity(); 1401cb0ef41Sopenharmony_ci} 1411cb0ef41Sopenharmony_ci 1421cb0ef41Sopenharmony_ci 1431cb0ef41Sopenharmony_ciconst CallRuntimeParameters& CallRuntimeParametersOf(const Operator* op) { 1441cb0ef41Sopenharmony_ci DCHECK_EQ(IrOpcode::kJSCallRuntime, op->opcode()); 1451cb0ef41Sopenharmony_ci return OpParameter<CallRuntimeParameters>(op); 1461cb0ef41Sopenharmony_ci} 1471cb0ef41Sopenharmony_ci 1481cb0ef41Sopenharmony_ci 1491cb0ef41Sopenharmony_ciContextAccess::ContextAccess(size_t depth, size_t index, bool immutable) 1501cb0ef41Sopenharmony_ci : immutable_(immutable), 1511cb0ef41Sopenharmony_ci depth_(static_cast<uint16_t>(depth)), 1521cb0ef41Sopenharmony_ci index_(static_cast<uint32_t>(index)) { 1531cb0ef41Sopenharmony_ci DCHECK(depth <= std::numeric_limits<uint16_t>::max()); 1541cb0ef41Sopenharmony_ci DCHECK(index <= std::numeric_limits<uint32_t>::max()); 1551cb0ef41Sopenharmony_ci} 1561cb0ef41Sopenharmony_ci 1571cb0ef41Sopenharmony_ci 1581cb0ef41Sopenharmony_cibool operator==(ContextAccess const& lhs, ContextAccess const& rhs) { 1591cb0ef41Sopenharmony_ci return lhs.depth() == rhs.depth() && lhs.index() == rhs.index() && 1601cb0ef41Sopenharmony_ci lhs.immutable() == rhs.immutable(); 1611cb0ef41Sopenharmony_ci} 1621cb0ef41Sopenharmony_ci 1631cb0ef41Sopenharmony_ci 1641cb0ef41Sopenharmony_cibool operator!=(ContextAccess const& lhs, ContextAccess const& rhs) { 1651cb0ef41Sopenharmony_ci return !(lhs == rhs); 1661cb0ef41Sopenharmony_ci} 1671cb0ef41Sopenharmony_ci 1681cb0ef41Sopenharmony_ci 1691cb0ef41Sopenharmony_cisize_t hash_value(ContextAccess const& access) { 1701cb0ef41Sopenharmony_ci return base::hash_combine(access.depth(), access.index(), access.immutable()); 1711cb0ef41Sopenharmony_ci} 1721cb0ef41Sopenharmony_ci 1731cb0ef41Sopenharmony_ci 1741cb0ef41Sopenharmony_cistd::ostream& operator<<(std::ostream& os, ContextAccess const& access) { 1751cb0ef41Sopenharmony_ci return os << access.depth() << ", " << access.index() << ", " 1761cb0ef41Sopenharmony_ci << access.immutable(); 1771cb0ef41Sopenharmony_ci} 1781cb0ef41Sopenharmony_ci 1791cb0ef41Sopenharmony_ci 1801cb0ef41Sopenharmony_ciContextAccess const& ContextAccessOf(Operator const* op) { 1811cb0ef41Sopenharmony_ci DCHECK(op->opcode() == IrOpcode::kJSLoadContext || 1821cb0ef41Sopenharmony_ci op->opcode() == IrOpcode::kJSStoreContext); 1831cb0ef41Sopenharmony_ci return OpParameter<ContextAccess>(op); 1841cb0ef41Sopenharmony_ci} 1851cb0ef41Sopenharmony_ci 1861cb0ef41Sopenharmony_cibool operator==(CreateFunctionContextParameters const& lhs, 1871cb0ef41Sopenharmony_ci CreateFunctionContextParameters const& rhs) { 1881cb0ef41Sopenharmony_ci return lhs.scope_info_.object().location() == 1891cb0ef41Sopenharmony_ci rhs.scope_info_.object().location() && 1901cb0ef41Sopenharmony_ci lhs.slot_count() == rhs.slot_count() && 1911cb0ef41Sopenharmony_ci lhs.scope_type() == rhs.scope_type(); 1921cb0ef41Sopenharmony_ci} 1931cb0ef41Sopenharmony_ci 1941cb0ef41Sopenharmony_cibool operator!=(CreateFunctionContextParameters const& lhs, 1951cb0ef41Sopenharmony_ci CreateFunctionContextParameters const& rhs) { 1961cb0ef41Sopenharmony_ci return !(lhs == rhs); 1971cb0ef41Sopenharmony_ci} 1981cb0ef41Sopenharmony_ci 1991cb0ef41Sopenharmony_cisize_t hash_value(CreateFunctionContextParameters const& parameters) { 2001cb0ef41Sopenharmony_ci return base::hash_combine(parameters.scope_info_.object().location(), 2011cb0ef41Sopenharmony_ci parameters.slot_count(), 2021cb0ef41Sopenharmony_ci static_cast<int>(parameters.scope_type())); 2031cb0ef41Sopenharmony_ci} 2041cb0ef41Sopenharmony_ci 2051cb0ef41Sopenharmony_cistd::ostream& operator<<(std::ostream& os, 2061cb0ef41Sopenharmony_ci CreateFunctionContextParameters const& parameters) { 2071cb0ef41Sopenharmony_ci return os << parameters.slot_count() << ", " << parameters.scope_type(); 2081cb0ef41Sopenharmony_ci} 2091cb0ef41Sopenharmony_ci 2101cb0ef41Sopenharmony_ciCreateFunctionContextParameters const& CreateFunctionContextParametersOf( 2111cb0ef41Sopenharmony_ci Operator const* op) { 2121cb0ef41Sopenharmony_ci DCHECK_EQ(IrOpcode::kJSCreateFunctionContext, op->opcode()); 2131cb0ef41Sopenharmony_ci return OpParameter<CreateFunctionContextParameters>(op); 2141cb0ef41Sopenharmony_ci} 2151cb0ef41Sopenharmony_ci 2161cb0ef41Sopenharmony_cibool operator==(DefineNamedOwnPropertyParameters const& lhs, 2171cb0ef41Sopenharmony_ci DefineNamedOwnPropertyParameters const& rhs) { 2181cb0ef41Sopenharmony_ci return lhs.name_.object().location() == rhs.name_.object().location() && 2191cb0ef41Sopenharmony_ci lhs.feedback() == rhs.feedback(); 2201cb0ef41Sopenharmony_ci} 2211cb0ef41Sopenharmony_ci 2221cb0ef41Sopenharmony_cibool operator!=(DefineNamedOwnPropertyParameters const& lhs, 2231cb0ef41Sopenharmony_ci DefineNamedOwnPropertyParameters const& rhs) { 2241cb0ef41Sopenharmony_ci return !(lhs == rhs); 2251cb0ef41Sopenharmony_ci} 2261cb0ef41Sopenharmony_ci 2271cb0ef41Sopenharmony_cisize_t hash_value(DefineNamedOwnPropertyParameters const& p) { 2281cb0ef41Sopenharmony_ci return base::hash_combine(p.name_.object().location(), 2291cb0ef41Sopenharmony_ci FeedbackSource::Hash()(p.feedback())); 2301cb0ef41Sopenharmony_ci} 2311cb0ef41Sopenharmony_ci 2321cb0ef41Sopenharmony_cistd::ostream& operator<<(std::ostream& os, 2331cb0ef41Sopenharmony_ci DefineNamedOwnPropertyParameters const& p) { 2341cb0ef41Sopenharmony_ci return os << Brief(*p.name_.object()); 2351cb0ef41Sopenharmony_ci} 2361cb0ef41Sopenharmony_ci 2371cb0ef41Sopenharmony_ciDefineNamedOwnPropertyParameters const& DefineNamedOwnPropertyParametersOf( 2381cb0ef41Sopenharmony_ci const Operator* op) { 2391cb0ef41Sopenharmony_ci DCHECK_EQ(IrOpcode::kJSDefineNamedOwnProperty, op->opcode()); 2401cb0ef41Sopenharmony_ci return OpParameter<DefineNamedOwnPropertyParameters>(op); 2411cb0ef41Sopenharmony_ci} 2421cb0ef41Sopenharmony_ci 2431cb0ef41Sopenharmony_cibool operator==(FeedbackParameter const& lhs, FeedbackParameter const& rhs) { 2441cb0ef41Sopenharmony_ci return lhs.feedback() == rhs.feedback(); 2451cb0ef41Sopenharmony_ci} 2461cb0ef41Sopenharmony_ci 2471cb0ef41Sopenharmony_cibool operator!=(FeedbackParameter const& lhs, FeedbackParameter const& rhs) { 2481cb0ef41Sopenharmony_ci return !(lhs == rhs); 2491cb0ef41Sopenharmony_ci} 2501cb0ef41Sopenharmony_ci 2511cb0ef41Sopenharmony_cisize_t hash_value(FeedbackParameter const& p) { 2521cb0ef41Sopenharmony_ci return FeedbackSource::Hash()(p.feedback()); 2531cb0ef41Sopenharmony_ci} 2541cb0ef41Sopenharmony_ci 2551cb0ef41Sopenharmony_cistd::ostream& operator<<(std::ostream& os, FeedbackParameter const& p) { 2561cb0ef41Sopenharmony_ci return os << p.feedback(); 2571cb0ef41Sopenharmony_ci} 2581cb0ef41Sopenharmony_ci 2591cb0ef41Sopenharmony_ciFeedbackParameter const& FeedbackParameterOf(const Operator* op) { 2601cb0ef41Sopenharmony_ci DCHECK(JSOperator::IsUnaryWithFeedback(op->opcode()) || 2611cb0ef41Sopenharmony_ci JSOperator::IsBinaryWithFeedback(op->opcode()) || 2621cb0ef41Sopenharmony_ci op->opcode() == IrOpcode::kJSCreateEmptyLiteralArray || 2631cb0ef41Sopenharmony_ci op->opcode() == IrOpcode::kJSInstanceOf || 2641cb0ef41Sopenharmony_ci op->opcode() == IrOpcode::kJSDefineKeyedOwnPropertyInLiteral || 2651cb0ef41Sopenharmony_ci op->opcode() == IrOpcode::kJSStoreInArrayLiteral); 2661cb0ef41Sopenharmony_ci return OpParameter<FeedbackParameter>(op); 2671cb0ef41Sopenharmony_ci} 2681cb0ef41Sopenharmony_ci 2691cb0ef41Sopenharmony_cibool operator==(NamedAccess const& lhs, NamedAccess const& rhs) { 2701cb0ef41Sopenharmony_ci return lhs.name_.object().location() == rhs.name_.object().location() && 2711cb0ef41Sopenharmony_ci lhs.language_mode() == rhs.language_mode() && 2721cb0ef41Sopenharmony_ci lhs.feedback() == rhs.feedback(); 2731cb0ef41Sopenharmony_ci} 2741cb0ef41Sopenharmony_ci 2751cb0ef41Sopenharmony_ci 2761cb0ef41Sopenharmony_cibool operator!=(NamedAccess const& lhs, NamedAccess const& rhs) { 2771cb0ef41Sopenharmony_ci return !(lhs == rhs); 2781cb0ef41Sopenharmony_ci} 2791cb0ef41Sopenharmony_ci 2801cb0ef41Sopenharmony_ci 2811cb0ef41Sopenharmony_cisize_t hash_value(NamedAccess const& p) { 2821cb0ef41Sopenharmony_ci return base::hash_combine(p.name_.object().location(), p.language_mode(), 2831cb0ef41Sopenharmony_ci FeedbackSource::Hash()(p.feedback())); 2841cb0ef41Sopenharmony_ci} 2851cb0ef41Sopenharmony_ci 2861cb0ef41Sopenharmony_ci 2871cb0ef41Sopenharmony_cistd::ostream& operator<<(std::ostream& os, NamedAccess const& p) { 2881cb0ef41Sopenharmony_ci return os << Brief(*p.name_.object()) << ", " << p.language_mode(); 2891cb0ef41Sopenharmony_ci} 2901cb0ef41Sopenharmony_ci 2911cb0ef41Sopenharmony_ci 2921cb0ef41Sopenharmony_ciNamedAccess const& NamedAccessOf(const Operator* op) { 2931cb0ef41Sopenharmony_ci DCHECK(op->opcode() == IrOpcode::kJSLoadNamed || 2941cb0ef41Sopenharmony_ci op->opcode() == IrOpcode::kJSLoadNamedFromSuper || 2951cb0ef41Sopenharmony_ci op->opcode() == IrOpcode::kJSSetNamedProperty); 2961cb0ef41Sopenharmony_ci return OpParameter<NamedAccess>(op); 2971cb0ef41Sopenharmony_ci} 2981cb0ef41Sopenharmony_ci 2991cb0ef41Sopenharmony_ci 3001cb0ef41Sopenharmony_cistd::ostream& operator<<(std::ostream& os, PropertyAccess const& p) { 3011cb0ef41Sopenharmony_ci return os << p.language_mode() << ", " << p.feedback(); 3021cb0ef41Sopenharmony_ci} 3031cb0ef41Sopenharmony_ci 3041cb0ef41Sopenharmony_ci 3051cb0ef41Sopenharmony_cibool operator==(PropertyAccess const& lhs, PropertyAccess const& rhs) { 3061cb0ef41Sopenharmony_ci return lhs.language_mode() == rhs.language_mode() && 3071cb0ef41Sopenharmony_ci lhs.feedback() == rhs.feedback(); 3081cb0ef41Sopenharmony_ci} 3091cb0ef41Sopenharmony_ci 3101cb0ef41Sopenharmony_ci 3111cb0ef41Sopenharmony_cibool operator!=(PropertyAccess const& lhs, PropertyAccess const& rhs) { 3121cb0ef41Sopenharmony_ci return !(lhs == rhs); 3131cb0ef41Sopenharmony_ci} 3141cb0ef41Sopenharmony_ci 3151cb0ef41Sopenharmony_ci 3161cb0ef41Sopenharmony_ciPropertyAccess const& PropertyAccessOf(const Operator* op) { 3171cb0ef41Sopenharmony_ci DCHECK(op->opcode() == IrOpcode::kJSHasProperty || 3181cb0ef41Sopenharmony_ci op->opcode() == IrOpcode::kJSLoadProperty || 3191cb0ef41Sopenharmony_ci op->opcode() == IrOpcode::kJSSetKeyedProperty || 3201cb0ef41Sopenharmony_ci op->opcode() == IrOpcode::kJSDefineKeyedOwnProperty); 3211cb0ef41Sopenharmony_ci return OpParameter<PropertyAccess>(op); 3221cb0ef41Sopenharmony_ci} 3231cb0ef41Sopenharmony_ci 3241cb0ef41Sopenharmony_ci 3251cb0ef41Sopenharmony_cisize_t hash_value(PropertyAccess const& p) { 3261cb0ef41Sopenharmony_ci return base::hash_combine(p.language_mode(), 3271cb0ef41Sopenharmony_ci FeedbackSource::Hash()(p.feedback())); 3281cb0ef41Sopenharmony_ci} 3291cb0ef41Sopenharmony_ci 3301cb0ef41Sopenharmony_ci 3311cb0ef41Sopenharmony_cibool operator==(LoadGlobalParameters const& lhs, 3321cb0ef41Sopenharmony_ci LoadGlobalParameters const& rhs) { 3331cb0ef41Sopenharmony_ci return lhs.name_.object().location() == rhs.name_.object().location() && 3341cb0ef41Sopenharmony_ci lhs.feedback() == rhs.feedback() && 3351cb0ef41Sopenharmony_ci lhs.typeof_mode() == rhs.typeof_mode(); 3361cb0ef41Sopenharmony_ci} 3371cb0ef41Sopenharmony_ci 3381cb0ef41Sopenharmony_ci 3391cb0ef41Sopenharmony_cibool operator!=(LoadGlobalParameters const& lhs, 3401cb0ef41Sopenharmony_ci LoadGlobalParameters const& rhs) { 3411cb0ef41Sopenharmony_ci return !(lhs == rhs); 3421cb0ef41Sopenharmony_ci} 3431cb0ef41Sopenharmony_ci 3441cb0ef41Sopenharmony_ci 3451cb0ef41Sopenharmony_cisize_t hash_value(LoadGlobalParameters const& p) { 3461cb0ef41Sopenharmony_ci return base::hash_combine(p.name_.object().location(), 3471cb0ef41Sopenharmony_ci static_cast<int>(p.typeof_mode())); 3481cb0ef41Sopenharmony_ci} 3491cb0ef41Sopenharmony_ci 3501cb0ef41Sopenharmony_ci 3511cb0ef41Sopenharmony_cistd::ostream& operator<<(std::ostream& os, LoadGlobalParameters const& p) { 3521cb0ef41Sopenharmony_ci return os << Brief(*p.name_.object()) << ", " 3531cb0ef41Sopenharmony_ci << static_cast<int>(p.typeof_mode()); 3541cb0ef41Sopenharmony_ci} 3551cb0ef41Sopenharmony_ci 3561cb0ef41Sopenharmony_ci 3571cb0ef41Sopenharmony_ciconst LoadGlobalParameters& LoadGlobalParametersOf(const Operator* op) { 3581cb0ef41Sopenharmony_ci DCHECK_EQ(IrOpcode::kJSLoadGlobal, op->opcode()); 3591cb0ef41Sopenharmony_ci return OpParameter<LoadGlobalParameters>(op); 3601cb0ef41Sopenharmony_ci} 3611cb0ef41Sopenharmony_ci 3621cb0ef41Sopenharmony_ci 3631cb0ef41Sopenharmony_cibool operator==(StoreGlobalParameters const& lhs, 3641cb0ef41Sopenharmony_ci StoreGlobalParameters const& rhs) { 3651cb0ef41Sopenharmony_ci return lhs.language_mode() == rhs.language_mode() && 3661cb0ef41Sopenharmony_ci lhs.name_.object().location() == rhs.name_.object().location() && 3671cb0ef41Sopenharmony_ci lhs.feedback() == rhs.feedback(); 3681cb0ef41Sopenharmony_ci} 3691cb0ef41Sopenharmony_ci 3701cb0ef41Sopenharmony_ci 3711cb0ef41Sopenharmony_cibool operator!=(StoreGlobalParameters const& lhs, 3721cb0ef41Sopenharmony_ci StoreGlobalParameters const& rhs) { 3731cb0ef41Sopenharmony_ci return !(lhs == rhs); 3741cb0ef41Sopenharmony_ci} 3751cb0ef41Sopenharmony_ci 3761cb0ef41Sopenharmony_ci 3771cb0ef41Sopenharmony_cisize_t hash_value(StoreGlobalParameters const& p) { 3781cb0ef41Sopenharmony_ci return base::hash_combine(p.language_mode(), p.name_.object().location(), 3791cb0ef41Sopenharmony_ci FeedbackSource::Hash()(p.feedback())); 3801cb0ef41Sopenharmony_ci} 3811cb0ef41Sopenharmony_ci 3821cb0ef41Sopenharmony_ci 3831cb0ef41Sopenharmony_cistd::ostream& operator<<(std::ostream& os, StoreGlobalParameters const& p) { 3841cb0ef41Sopenharmony_ci return os << p.language_mode() << ", " << Brief(*p.name_.object()); 3851cb0ef41Sopenharmony_ci} 3861cb0ef41Sopenharmony_ci 3871cb0ef41Sopenharmony_ci 3881cb0ef41Sopenharmony_ciconst StoreGlobalParameters& StoreGlobalParametersOf(const Operator* op) { 3891cb0ef41Sopenharmony_ci DCHECK_EQ(IrOpcode::kJSStoreGlobal, op->opcode()); 3901cb0ef41Sopenharmony_ci return OpParameter<StoreGlobalParameters>(op); 3911cb0ef41Sopenharmony_ci} 3921cb0ef41Sopenharmony_ci 3931cb0ef41Sopenharmony_ci 3941cb0ef41Sopenharmony_ciCreateArgumentsType const& CreateArgumentsTypeOf(const Operator* op) { 3951cb0ef41Sopenharmony_ci DCHECK_EQ(IrOpcode::kJSCreateArguments, op->opcode()); 3961cb0ef41Sopenharmony_ci return OpParameter<CreateArgumentsType>(op); 3971cb0ef41Sopenharmony_ci} 3981cb0ef41Sopenharmony_ci 3991cb0ef41Sopenharmony_cibool operator==(CreateArrayParameters const& lhs, 4001cb0ef41Sopenharmony_ci CreateArrayParameters const& rhs) { 4011cb0ef41Sopenharmony_ci return lhs.arity() == rhs.arity() && 4021cb0ef41Sopenharmony_ci AddressOrNull(lhs.site_) == AddressOrNull(rhs.site_); 4031cb0ef41Sopenharmony_ci} 4041cb0ef41Sopenharmony_ci 4051cb0ef41Sopenharmony_ci 4061cb0ef41Sopenharmony_cibool operator!=(CreateArrayParameters const& lhs, 4071cb0ef41Sopenharmony_ci CreateArrayParameters const& rhs) { 4081cb0ef41Sopenharmony_ci return !(lhs == rhs); 4091cb0ef41Sopenharmony_ci} 4101cb0ef41Sopenharmony_ci 4111cb0ef41Sopenharmony_ci 4121cb0ef41Sopenharmony_cisize_t hash_value(CreateArrayParameters const& p) { 4131cb0ef41Sopenharmony_ci return base::hash_combine(p.arity(), AddressOrNull(p.site_)); 4141cb0ef41Sopenharmony_ci} 4151cb0ef41Sopenharmony_ci 4161cb0ef41Sopenharmony_ci 4171cb0ef41Sopenharmony_cistd::ostream& operator<<(std::ostream& os, CreateArrayParameters const& p) { 4181cb0ef41Sopenharmony_ci os << p.arity(); 4191cb0ef41Sopenharmony_ci if (p.site_.has_value()) { 4201cb0ef41Sopenharmony_ci os << ", " << Brief(*p.site_->object()); 4211cb0ef41Sopenharmony_ci } 4221cb0ef41Sopenharmony_ci return os; 4231cb0ef41Sopenharmony_ci} 4241cb0ef41Sopenharmony_ci 4251cb0ef41Sopenharmony_ciconst CreateArrayParameters& CreateArrayParametersOf(const Operator* op) { 4261cb0ef41Sopenharmony_ci DCHECK_EQ(IrOpcode::kJSCreateArray, op->opcode()); 4271cb0ef41Sopenharmony_ci return OpParameter<CreateArrayParameters>(op); 4281cb0ef41Sopenharmony_ci} 4291cb0ef41Sopenharmony_ci 4301cb0ef41Sopenharmony_cibool operator==(CreateArrayIteratorParameters const& lhs, 4311cb0ef41Sopenharmony_ci CreateArrayIteratorParameters const& rhs) { 4321cb0ef41Sopenharmony_ci return lhs.kind() == rhs.kind(); 4331cb0ef41Sopenharmony_ci} 4341cb0ef41Sopenharmony_ci 4351cb0ef41Sopenharmony_cibool operator!=(CreateArrayIteratorParameters const& lhs, 4361cb0ef41Sopenharmony_ci CreateArrayIteratorParameters const& rhs) { 4371cb0ef41Sopenharmony_ci return !(lhs == rhs); 4381cb0ef41Sopenharmony_ci} 4391cb0ef41Sopenharmony_ci 4401cb0ef41Sopenharmony_cisize_t hash_value(CreateArrayIteratorParameters const& p) { 4411cb0ef41Sopenharmony_ci return static_cast<size_t>(p.kind()); 4421cb0ef41Sopenharmony_ci} 4431cb0ef41Sopenharmony_ci 4441cb0ef41Sopenharmony_cistd::ostream& operator<<(std::ostream& os, 4451cb0ef41Sopenharmony_ci CreateArrayIteratorParameters const& p) { 4461cb0ef41Sopenharmony_ci return os << p.kind(); 4471cb0ef41Sopenharmony_ci} 4481cb0ef41Sopenharmony_ci 4491cb0ef41Sopenharmony_ciconst CreateArrayIteratorParameters& CreateArrayIteratorParametersOf( 4501cb0ef41Sopenharmony_ci const Operator* op) { 4511cb0ef41Sopenharmony_ci DCHECK_EQ(IrOpcode::kJSCreateArrayIterator, op->opcode()); 4521cb0ef41Sopenharmony_ci return OpParameter<CreateArrayIteratorParameters>(op); 4531cb0ef41Sopenharmony_ci} 4541cb0ef41Sopenharmony_ci 4551cb0ef41Sopenharmony_cibool operator==(CreateCollectionIteratorParameters const& lhs, 4561cb0ef41Sopenharmony_ci CreateCollectionIteratorParameters const& rhs) { 4571cb0ef41Sopenharmony_ci return lhs.collection_kind() == rhs.collection_kind() && 4581cb0ef41Sopenharmony_ci lhs.iteration_kind() == rhs.iteration_kind(); 4591cb0ef41Sopenharmony_ci} 4601cb0ef41Sopenharmony_ci 4611cb0ef41Sopenharmony_cibool operator!=(CreateCollectionIteratorParameters const& lhs, 4621cb0ef41Sopenharmony_ci CreateCollectionIteratorParameters const& rhs) { 4631cb0ef41Sopenharmony_ci return !(lhs == rhs); 4641cb0ef41Sopenharmony_ci} 4651cb0ef41Sopenharmony_ci 4661cb0ef41Sopenharmony_cisize_t hash_value(CreateCollectionIteratorParameters const& p) { 4671cb0ef41Sopenharmony_ci return base::hash_combine(static_cast<size_t>(p.collection_kind()), 4681cb0ef41Sopenharmony_ci static_cast<size_t>(p.iteration_kind())); 4691cb0ef41Sopenharmony_ci} 4701cb0ef41Sopenharmony_ci 4711cb0ef41Sopenharmony_cistd::ostream& operator<<(std::ostream& os, 4721cb0ef41Sopenharmony_ci CreateCollectionIteratorParameters const& p) { 4731cb0ef41Sopenharmony_ci return os << p.collection_kind() << ", " << p.iteration_kind(); 4741cb0ef41Sopenharmony_ci} 4751cb0ef41Sopenharmony_ci 4761cb0ef41Sopenharmony_ciconst CreateCollectionIteratorParameters& CreateCollectionIteratorParametersOf( 4771cb0ef41Sopenharmony_ci const Operator* op) { 4781cb0ef41Sopenharmony_ci DCHECK_EQ(IrOpcode::kJSCreateCollectionIterator, op->opcode()); 4791cb0ef41Sopenharmony_ci return OpParameter<CreateCollectionIteratorParameters>(op); 4801cb0ef41Sopenharmony_ci} 4811cb0ef41Sopenharmony_ci 4821cb0ef41Sopenharmony_cibool operator==(CreateBoundFunctionParameters const& lhs, 4831cb0ef41Sopenharmony_ci CreateBoundFunctionParameters const& rhs) { 4841cb0ef41Sopenharmony_ci return lhs.arity() == rhs.arity() && 4851cb0ef41Sopenharmony_ci lhs.map_.object().location() == rhs.map_.object().location(); 4861cb0ef41Sopenharmony_ci} 4871cb0ef41Sopenharmony_ci 4881cb0ef41Sopenharmony_cibool operator!=(CreateBoundFunctionParameters const& lhs, 4891cb0ef41Sopenharmony_ci CreateBoundFunctionParameters const& rhs) { 4901cb0ef41Sopenharmony_ci return !(lhs == rhs); 4911cb0ef41Sopenharmony_ci} 4921cb0ef41Sopenharmony_ci 4931cb0ef41Sopenharmony_cisize_t hash_value(CreateBoundFunctionParameters const& p) { 4941cb0ef41Sopenharmony_ci return base::hash_combine(p.arity(), p.map_.object().location()); 4951cb0ef41Sopenharmony_ci} 4961cb0ef41Sopenharmony_ci 4971cb0ef41Sopenharmony_cistd::ostream& operator<<(std::ostream& os, 4981cb0ef41Sopenharmony_ci CreateBoundFunctionParameters const& p) { 4991cb0ef41Sopenharmony_ci os << p.arity(); 5001cb0ef41Sopenharmony_ci if (!p.map_.object().is_null()) os << ", " << Brief(*p.map_.object()); 5011cb0ef41Sopenharmony_ci return os; 5021cb0ef41Sopenharmony_ci} 5031cb0ef41Sopenharmony_ci 5041cb0ef41Sopenharmony_ciconst CreateBoundFunctionParameters& CreateBoundFunctionParametersOf( 5051cb0ef41Sopenharmony_ci const Operator* op) { 5061cb0ef41Sopenharmony_ci DCHECK_EQ(IrOpcode::kJSCreateBoundFunction, op->opcode()); 5071cb0ef41Sopenharmony_ci return OpParameter<CreateBoundFunctionParameters>(op); 5081cb0ef41Sopenharmony_ci} 5091cb0ef41Sopenharmony_ci 5101cb0ef41Sopenharmony_cibool operator==(GetTemplateObjectParameters const& lhs, 5111cb0ef41Sopenharmony_ci GetTemplateObjectParameters const& rhs) { 5121cb0ef41Sopenharmony_ci return lhs.description_.object().location() == 5131cb0ef41Sopenharmony_ci rhs.description_.object().location() && 5141cb0ef41Sopenharmony_ci lhs.shared_.object().location() == rhs.shared_.object().location() && 5151cb0ef41Sopenharmony_ci lhs.feedback() == rhs.feedback(); 5161cb0ef41Sopenharmony_ci} 5171cb0ef41Sopenharmony_ci 5181cb0ef41Sopenharmony_cibool operator!=(GetTemplateObjectParameters const& lhs, 5191cb0ef41Sopenharmony_ci GetTemplateObjectParameters const& rhs) { 5201cb0ef41Sopenharmony_ci return !(lhs == rhs); 5211cb0ef41Sopenharmony_ci} 5221cb0ef41Sopenharmony_ci 5231cb0ef41Sopenharmony_cisize_t hash_value(GetTemplateObjectParameters const& p) { 5241cb0ef41Sopenharmony_ci return base::hash_combine(p.description_.object().location(), 5251cb0ef41Sopenharmony_ci p.shared_.object().location(), 5261cb0ef41Sopenharmony_ci FeedbackSource::Hash()(p.feedback())); 5271cb0ef41Sopenharmony_ci} 5281cb0ef41Sopenharmony_ci 5291cb0ef41Sopenharmony_cistd::ostream& operator<<(std::ostream& os, 5301cb0ef41Sopenharmony_ci GetTemplateObjectParameters const& p) { 5311cb0ef41Sopenharmony_ci return os << Brief(*p.description_.object()) << ", " 5321cb0ef41Sopenharmony_ci << Brief(*p.shared_.object()); 5331cb0ef41Sopenharmony_ci} 5341cb0ef41Sopenharmony_ci 5351cb0ef41Sopenharmony_ciconst GetTemplateObjectParameters& GetTemplateObjectParametersOf( 5361cb0ef41Sopenharmony_ci const Operator* op) { 5371cb0ef41Sopenharmony_ci DCHECK(op->opcode() == IrOpcode::kJSGetTemplateObject); 5381cb0ef41Sopenharmony_ci return OpParameter<GetTemplateObjectParameters>(op); 5391cb0ef41Sopenharmony_ci} 5401cb0ef41Sopenharmony_ci 5411cb0ef41Sopenharmony_cibool operator==(CreateClosureParameters const& lhs, 5421cb0ef41Sopenharmony_ci CreateClosureParameters const& rhs) { 5431cb0ef41Sopenharmony_ci return lhs.allocation() == rhs.allocation() && 5441cb0ef41Sopenharmony_ci lhs.code_.object().location() == rhs.code_.object().location() && 5451cb0ef41Sopenharmony_ci lhs.shared_info_.object().location() == 5461cb0ef41Sopenharmony_ci rhs.shared_info_.object().location(); 5471cb0ef41Sopenharmony_ci} 5481cb0ef41Sopenharmony_ci 5491cb0ef41Sopenharmony_ci 5501cb0ef41Sopenharmony_cibool operator!=(CreateClosureParameters const& lhs, 5511cb0ef41Sopenharmony_ci CreateClosureParameters const& rhs) { 5521cb0ef41Sopenharmony_ci return !(lhs == rhs); 5531cb0ef41Sopenharmony_ci} 5541cb0ef41Sopenharmony_ci 5551cb0ef41Sopenharmony_ci 5561cb0ef41Sopenharmony_cisize_t hash_value(CreateClosureParameters const& p) { 5571cb0ef41Sopenharmony_ci return base::hash_combine(p.allocation(), p.code_.object().location(), 5581cb0ef41Sopenharmony_ci p.shared_info_.object().location()); 5591cb0ef41Sopenharmony_ci} 5601cb0ef41Sopenharmony_ci 5611cb0ef41Sopenharmony_ci 5621cb0ef41Sopenharmony_cistd::ostream& operator<<(std::ostream& os, CreateClosureParameters const& p) { 5631cb0ef41Sopenharmony_ci return os << p.allocation() << ", " << Brief(*p.shared_info_.object()) << ", " 5641cb0ef41Sopenharmony_ci << Brief(*p.code_.object()); 5651cb0ef41Sopenharmony_ci} 5661cb0ef41Sopenharmony_ci 5671cb0ef41Sopenharmony_ci 5681cb0ef41Sopenharmony_ciconst CreateClosureParameters& CreateClosureParametersOf(const Operator* op) { 5691cb0ef41Sopenharmony_ci DCHECK_EQ(IrOpcode::kJSCreateClosure, op->opcode()); 5701cb0ef41Sopenharmony_ci return OpParameter<CreateClosureParameters>(op); 5711cb0ef41Sopenharmony_ci} 5721cb0ef41Sopenharmony_ci 5731cb0ef41Sopenharmony_ci 5741cb0ef41Sopenharmony_cibool operator==(CreateLiteralParameters const& lhs, 5751cb0ef41Sopenharmony_ci CreateLiteralParameters const& rhs) { 5761cb0ef41Sopenharmony_ci return lhs.constant_.object().location() == 5771cb0ef41Sopenharmony_ci rhs.constant_.object().location() && 5781cb0ef41Sopenharmony_ci lhs.feedback() == rhs.feedback() && lhs.length() == rhs.length() && 5791cb0ef41Sopenharmony_ci lhs.flags() == rhs.flags(); 5801cb0ef41Sopenharmony_ci} 5811cb0ef41Sopenharmony_ci 5821cb0ef41Sopenharmony_ci 5831cb0ef41Sopenharmony_cibool operator!=(CreateLiteralParameters const& lhs, 5841cb0ef41Sopenharmony_ci CreateLiteralParameters const& rhs) { 5851cb0ef41Sopenharmony_ci return !(lhs == rhs); 5861cb0ef41Sopenharmony_ci} 5871cb0ef41Sopenharmony_ci 5881cb0ef41Sopenharmony_ci 5891cb0ef41Sopenharmony_cisize_t hash_value(CreateLiteralParameters const& p) { 5901cb0ef41Sopenharmony_ci return base::hash_combine(p.constant_.object().location(), 5911cb0ef41Sopenharmony_ci FeedbackSource::Hash()(p.feedback()), p.length(), 5921cb0ef41Sopenharmony_ci p.flags()); 5931cb0ef41Sopenharmony_ci} 5941cb0ef41Sopenharmony_ci 5951cb0ef41Sopenharmony_ci 5961cb0ef41Sopenharmony_cistd::ostream& operator<<(std::ostream& os, CreateLiteralParameters const& p) { 5971cb0ef41Sopenharmony_ci return os << Brief(*p.constant_.object()) << ", " << p.length() << ", " 5981cb0ef41Sopenharmony_ci << p.flags(); 5991cb0ef41Sopenharmony_ci} 6001cb0ef41Sopenharmony_ci 6011cb0ef41Sopenharmony_ci 6021cb0ef41Sopenharmony_ciconst CreateLiteralParameters& CreateLiteralParametersOf(const Operator* op) { 6031cb0ef41Sopenharmony_ci DCHECK(op->opcode() == IrOpcode::kJSCreateLiteralArray || 6041cb0ef41Sopenharmony_ci op->opcode() == IrOpcode::kJSCreateLiteralObject || 6051cb0ef41Sopenharmony_ci op->opcode() == IrOpcode::kJSCreateLiteralRegExp); 6061cb0ef41Sopenharmony_ci return OpParameter<CreateLiteralParameters>(op); 6071cb0ef41Sopenharmony_ci} 6081cb0ef41Sopenharmony_ci 6091cb0ef41Sopenharmony_cibool operator==(CloneObjectParameters const& lhs, 6101cb0ef41Sopenharmony_ci CloneObjectParameters const& rhs) { 6111cb0ef41Sopenharmony_ci return lhs.feedback() == rhs.feedback() && lhs.flags() == rhs.flags(); 6121cb0ef41Sopenharmony_ci} 6131cb0ef41Sopenharmony_ci 6141cb0ef41Sopenharmony_cibool operator!=(CloneObjectParameters const& lhs, 6151cb0ef41Sopenharmony_ci CloneObjectParameters const& rhs) { 6161cb0ef41Sopenharmony_ci return !(lhs == rhs); 6171cb0ef41Sopenharmony_ci} 6181cb0ef41Sopenharmony_ci 6191cb0ef41Sopenharmony_cisize_t hash_value(CloneObjectParameters const& p) { 6201cb0ef41Sopenharmony_ci return base::hash_combine(FeedbackSource::Hash()(p.feedback()), p.flags()); 6211cb0ef41Sopenharmony_ci} 6221cb0ef41Sopenharmony_ci 6231cb0ef41Sopenharmony_cistd::ostream& operator<<(std::ostream& os, CloneObjectParameters const& p) { 6241cb0ef41Sopenharmony_ci return os << p.flags(); 6251cb0ef41Sopenharmony_ci} 6261cb0ef41Sopenharmony_ci 6271cb0ef41Sopenharmony_ciconst CloneObjectParameters& CloneObjectParametersOf(const Operator* op) { 6281cb0ef41Sopenharmony_ci DCHECK(op->opcode() == IrOpcode::kJSCloneObject); 6291cb0ef41Sopenharmony_ci return OpParameter<CloneObjectParameters>(op); 6301cb0ef41Sopenharmony_ci} 6311cb0ef41Sopenharmony_ci 6321cb0ef41Sopenharmony_cistd::ostream& operator<<(std::ostream& os, GetIteratorParameters const& p) { 6331cb0ef41Sopenharmony_ci return os << p.loadFeedback() << ", " << p.callFeedback(); 6341cb0ef41Sopenharmony_ci} 6351cb0ef41Sopenharmony_ci 6361cb0ef41Sopenharmony_cibool operator==(GetIteratorParameters const& lhs, 6371cb0ef41Sopenharmony_ci GetIteratorParameters const& rhs) { 6381cb0ef41Sopenharmony_ci return lhs.loadFeedback() == rhs.loadFeedback() && 6391cb0ef41Sopenharmony_ci lhs.callFeedback() == rhs.callFeedback(); 6401cb0ef41Sopenharmony_ci} 6411cb0ef41Sopenharmony_ci 6421cb0ef41Sopenharmony_cibool operator!=(GetIteratorParameters const& lhs, 6431cb0ef41Sopenharmony_ci GetIteratorParameters const& rhs) { 6441cb0ef41Sopenharmony_ci return !(lhs == rhs); 6451cb0ef41Sopenharmony_ci} 6461cb0ef41Sopenharmony_ci 6471cb0ef41Sopenharmony_ciGetIteratorParameters const& GetIteratorParametersOf(const Operator* op) { 6481cb0ef41Sopenharmony_ci DCHECK(op->opcode() == IrOpcode::kJSGetIterator); 6491cb0ef41Sopenharmony_ci return OpParameter<GetIteratorParameters>(op); 6501cb0ef41Sopenharmony_ci} 6511cb0ef41Sopenharmony_ci 6521cb0ef41Sopenharmony_cisize_t hash_value(GetIteratorParameters const& p) { 6531cb0ef41Sopenharmony_ci return base::hash_combine(FeedbackSource::Hash()(p.loadFeedback()), 6541cb0ef41Sopenharmony_ci FeedbackSource::Hash()(p.callFeedback())); 6551cb0ef41Sopenharmony_ci} 6561cb0ef41Sopenharmony_ci 6571cb0ef41Sopenharmony_cisize_t hash_value(ForInMode const& mode) { return static_cast<uint8_t>(mode); } 6581cb0ef41Sopenharmony_ci 6591cb0ef41Sopenharmony_cistd::ostream& operator<<(std::ostream& os, ForInMode const& mode) { 6601cb0ef41Sopenharmony_ci switch (mode) { 6611cb0ef41Sopenharmony_ci case ForInMode::kUseEnumCacheKeysAndIndices: 6621cb0ef41Sopenharmony_ci return os << "UseEnumCacheKeysAndIndices"; 6631cb0ef41Sopenharmony_ci case ForInMode::kUseEnumCacheKeys: 6641cb0ef41Sopenharmony_ci return os << "UseEnumCacheKeys"; 6651cb0ef41Sopenharmony_ci case ForInMode::kGeneric: 6661cb0ef41Sopenharmony_ci return os << "Generic"; 6671cb0ef41Sopenharmony_ci } 6681cb0ef41Sopenharmony_ci UNREACHABLE(); 6691cb0ef41Sopenharmony_ci} 6701cb0ef41Sopenharmony_ci 6711cb0ef41Sopenharmony_cibool operator==(ForInParameters const& lhs, ForInParameters const& rhs) { 6721cb0ef41Sopenharmony_ci return lhs.feedback() == rhs.feedback() && lhs.mode() == rhs.mode(); 6731cb0ef41Sopenharmony_ci} 6741cb0ef41Sopenharmony_ci 6751cb0ef41Sopenharmony_cibool operator!=(ForInParameters const& lhs, ForInParameters const& rhs) { 6761cb0ef41Sopenharmony_ci return !(lhs == rhs); 6771cb0ef41Sopenharmony_ci} 6781cb0ef41Sopenharmony_ci 6791cb0ef41Sopenharmony_cisize_t hash_value(ForInParameters const& p) { 6801cb0ef41Sopenharmony_ci return base::hash_combine(FeedbackSource::Hash()(p.feedback()), p.mode()); 6811cb0ef41Sopenharmony_ci} 6821cb0ef41Sopenharmony_ci 6831cb0ef41Sopenharmony_cistd::ostream& operator<<(std::ostream& os, ForInParameters const& p) { 6841cb0ef41Sopenharmony_ci return os << p.feedback() << ", " << p.mode(); 6851cb0ef41Sopenharmony_ci} 6861cb0ef41Sopenharmony_ci 6871cb0ef41Sopenharmony_ciForInParameters const& ForInParametersOf(const Operator* op) { 6881cb0ef41Sopenharmony_ci DCHECK(op->opcode() == IrOpcode::kJSForInNext || 6891cb0ef41Sopenharmony_ci op->opcode() == IrOpcode::kJSForInPrepare); 6901cb0ef41Sopenharmony_ci return OpParameter<ForInParameters>(op); 6911cb0ef41Sopenharmony_ci} 6921cb0ef41Sopenharmony_ci 6931cb0ef41Sopenharmony_ci#if V8_ENABLE_WEBASSEMBLY 6941cb0ef41Sopenharmony_ciJSWasmCallParameters const& JSWasmCallParametersOf(const Operator* op) { 6951cb0ef41Sopenharmony_ci DCHECK_EQ(IrOpcode::kJSWasmCall, op->opcode()); 6961cb0ef41Sopenharmony_ci return OpParameter<JSWasmCallParameters>(op); 6971cb0ef41Sopenharmony_ci} 6981cb0ef41Sopenharmony_ci 6991cb0ef41Sopenharmony_cistd::ostream& operator<<(std::ostream& os, JSWasmCallParameters const& p) { 7001cb0ef41Sopenharmony_ci return os << p.module() << ", " << p.signature() << ", " << p.feedback(); 7011cb0ef41Sopenharmony_ci} 7021cb0ef41Sopenharmony_ci 7031cb0ef41Sopenharmony_cisize_t hash_value(JSWasmCallParameters const& p) { 7041cb0ef41Sopenharmony_ci return base::hash_combine(p.module(), p.signature(), 7051cb0ef41Sopenharmony_ci FeedbackSource::Hash()(p.feedback())); 7061cb0ef41Sopenharmony_ci} 7071cb0ef41Sopenharmony_ci 7081cb0ef41Sopenharmony_cibool operator==(JSWasmCallParameters const& lhs, 7091cb0ef41Sopenharmony_ci JSWasmCallParameters const& rhs) { 7101cb0ef41Sopenharmony_ci return lhs.module() == rhs.module() && lhs.signature() == rhs.signature() && 7111cb0ef41Sopenharmony_ci lhs.feedback() == rhs.feedback(); 7121cb0ef41Sopenharmony_ci} 7131cb0ef41Sopenharmony_ci 7141cb0ef41Sopenharmony_ciint JSWasmCallParameters::arity_without_implicit_args() const { 7151cb0ef41Sopenharmony_ci return static_cast<int>(signature_->parameter_count()); 7161cb0ef41Sopenharmony_ci} 7171cb0ef41Sopenharmony_ci 7181cb0ef41Sopenharmony_ciint JSWasmCallParameters::input_count() const { 7191cb0ef41Sopenharmony_ci return static_cast<int>(signature_->parameter_count()) + 7201cb0ef41Sopenharmony_ci JSWasmCallNode::kExtraInputCount; 7211cb0ef41Sopenharmony_ci} 7221cb0ef41Sopenharmony_ci 7231cb0ef41Sopenharmony_ci// static 7241cb0ef41Sopenharmony_ciType JSWasmCallNode::TypeForWasmReturnType(const wasm::ValueType& type) { 7251cb0ef41Sopenharmony_ci switch (type.kind()) { 7261cb0ef41Sopenharmony_ci case wasm::kI32: 7271cb0ef41Sopenharmony_ci return Type::Signed32(); 7281cb0ef41Sopenharmony_ci case wasm::kI64: 7291cb0ef41Sopenharmony_ci return Type::BigInt(); 7301cb0ef41Sopenharmony_ci case wasm::kF32: 7311cb0ef41Sopenharmony_ci case wasm::kF64: 7321cb0ef41Sopenharmony_ci return Type::Number(); 7331cb0ef41Sopenharmony_ci default: 7341cb0ef41Sopenharmony_ci UNREACHABLE(); 7351cb0ef41Sopenharmony_ci } 7361cb0ef41Sopenharmony_ci} 7371cb0ef41Sopenharmony_ci#endif // V8_ENABLE_WEBASSEMBLY 7381cb0ef41Sopenharmony_ci 7391cb0ef41Sopenharmony_ci#define CACHED_OP_LIST(V) \ 7401cb0ef41Sopenharmony_ci V(ToLength, Operator::kNoProperties, 1, 1) \ 7411cb0ef41Sopenharmony_ci V(ToName, Operator::kNoProperties, 1, 1) \ 7421cb0ef41Sopenharmony_ci V(ToNumber, Operator::kNoProperties, 1, 1) \ 7431cb0ef41Sopenharmony_ci V(ToNumberConvertBigInt, Operator::kNoProperties, 1, 1) \ 7441cb0ef41Sopenharmony_ci V(ToNumeric, Operator::kNoProperties, 1, 1) \ 7451cb0ef41Sopenharmony_ci V(ToObject, Operator::kFoldable, 1, 1) \ 7461cb0ef41Sopenharmony_ci V(ToString, Operator::kNoProperties, 1, 1) \ 7471cb0ef41Sopenharmony_ci V(Create, Operator::kNoProperties, 2, 1) \ 7481cb0ef41Sopenharmony_ci V(CreateIterResultObject, Operator::kEliminatable, 2, 1) \ 7491cb0ef41Sopenharmony_ci V(CreateStringIterator, Operator::kEliminatable, 1, 1) \ 7501cb0ef41Sopenharmony_ci V(CreateKeyValueArray, Operator::kEliminatable, 2, 1) \ 7511cb0ef41Sopenharmony_ci V(CreatePromise, Operator::kEliminatable, 0, 1) \ 7521cb0ef41Sopenharmony_ci V(CreateTypedArray, Operator::kNoProperties, 5, 1) \ 7531cb0ef41Sopenharmony_ci V(CreateObject, Operator::kNoProperties, 1, 1) \ 7541cb0ef41Sopenharmony_ci V(ObjectIsArray, Operator::kNoProperties, 1, 1) \ 7551cb0ef41Sopenharmony_ci V(HasInPrototypeChain, Operator::kNoProperties, 2, 1) \ 7561cb0ef41Sopenharmony_ci V(OrdinaryHasInstance, Operator::kNoProperties, 2, 1) \ 7571cb0ef41Sopenharmony_ci V(ForInEnumerate, Operator::kNoProperties, 1, 1) \ 7581cb0ef41Sopenharmony_ci V(AsyncFunctionEnter, Operator::kNoProperties, 2, 1) \ 7591cb0ef41Sopenharmony_ci V(AsyncFunctionReject, Operator::kNoDeopt | Operator::kNoThrow, 2, 1) \ 7601cb0ef41Sopenharmony_ci V(AsyncFunctionResolve, Operator::kNoDeopt | Operator::kNoThrow, 2, 1) \ 7611cb0ef41Sopenharmony_ci V(LoadMessage, Operator::kNoThrow | Operator::kNoWrite, 0, 1) \ 7621cb0ef41Sopenharmony_ci V(StoreMessage, Operator::kNoRead | Operator::kNoThrow, 1, 0) \ 7631cb0ef41Sopenharmony_ci V(GeneratorRestoreContinuation, Operator::kNoThrow, 1, 1) \ 7641cb0ef41Sopenharmony_ci V(GeneratorRestoreContext, Operator::kNoThrow, 1, 1) \ 7651cb0ef41Sopenharmony_ci V(GeneratorRestoreInputOrDebugPos, Operator::kNoThrow, 1, 1) \ 7661cb0ef41Sopenharmony_ci V(Debugger, Operator::kNoProperties, 0, 0) \ 7671cb0ef41Sopenharmony_ci V(FulfillPromise, Operator::kNoDeopt | Operator::kNoThrow, 2, 1) \ 7681cb0ef41Sopenharmony_ci V(PerformPromiseThen, Operator::kNoDeopt | Operator::kNoThrow, 4, 1) \ 7691cb0ef41Sopenharmony_ci V(PromiseResolve, Operator::kNoProperties, 2, 1) \ 7701cb0ef41Sopenharmony_ci V(RejectPromise, Operator::kNoDeopt | Operator::kNoThrow, 3, 1) \ 7711cb0ef41Sopenharmony_ci V(ResolvePromise, Operator::kNoDeopt | Operator::kNoThrow, 2, 1) \ 7721cb0ef41Sopenharmony_ci V(GetSuperConstructor, Operator::kNoWrite | Operator::kNoThrow, 1, 1) \ 7731cb0ef41Sopenharmony_ci V(ParseInt, Operator::kNoProperties, 2, 1) \ 7741cb0ef41Sopenharmony_ci V(RegExpTest, Operator::kNoProperties, 2, 1) 7751cb0ef41Sopenharmony_ci 7761cb0ef41Sopenharmony_cistruct JSOperatorGlobalCache final { 7771cb0ef41Sopenharmony_ci#define CACHED_OP(Name, properties, value_input_count, value_output_count) \ 7781cb0ef41Sopenharmony_ci struct Name##Operator final : public Operator { \ 7791cb0ef41Sopenharmony_ci Name##Operator() \ 7801cb0ef41Sopenharmony_ci : Operator(IrOpcode::kJS##Name, properties, "JS" #Name, \ 7811cb0ef41Sopenharmony_ci value_input_count, Operator::ZeroIfPure(properties), \ 7821cb0ef41Sopenharmony_ci Operator::ZeroIfEliminatable(properties), \ 7831cb0ef41Sopenharmony_ci value_output_count, Operator::ZeroIfPure(properties), \ 7841cb0ef41Sopenharmony_ci Operator::ZeroIfNoThrow(properties)) {} \ 7851cb0ef41Sopenharmony_ci }; \ 7861cb0ef41Sopenharmony_ci Name##Operator k##Name##Operator; 7871cb0ef41Sopenharmony_ci CACHED_OP_LIST(CACHED_OP) 7881cb0ef41Sopenharmony_ci#undef CACHED_OP 7891cb0ef41Sopenharmony_ci}; 7901cb0ef41Sopenharmony_ci 7911cb0ef41Sopenharmony_cinamespace { 7921cb0ef41Sopenharmony_ciDEFINE_LAZY_LEAKY_OBJECT_GETTER(JSOperatorGlobalCache, GetJSOperatorGlobalCache) 7931cb0ef41Sopenharmony_ci} // namespace 7941cb0ef41Sopenharmony_ci 7951cb0ef41Sopenharmony_ciJSOperatorBuilder::JSOperatorBuilder(Zone* zone) 7961cb0ef41Sopenharmony_ci : cache_(*GetJSOperatorGlobalCache()), zone_(zone) {} 7971cb0ef41Sopenharmony_ci 7981cb0ef41Sopenharmony_ci#define CACHED_OP(Name, properties, value_input_count, value_output_count) \ 7991cb0ef41Sopenharmony_ci const Operator* JSOperatorBuilder::Name() { \ 8001cb0ef41Sopenharmony_ci return &cache_.k##Name##Operator; \ 8011cb0ef41Sopenharmony_ci } 8021cb0ef41Sopenharmony_ciCACHED_OP_LIST(CACHED_OP) 8031cb0ef41Sopenharmony_ci#undef CACHED_OP 8041cb0ef41Sopenharmony_ci 8051cb0ef41Sopenharmony_ci#define UNARY_OP(JSName, Name) \ 8061cb0ef41Sopenharmony_ci const Operator* JSOperatorBuilder::Name(FeedbackSource const& feedback) { \ 8071cb0ef41Sopenharmony_ci FeedbackParameter parameters(feedback); \ 8081cb0ef41Sopenharmony_ci return zone()->New<Operator1<FeedbackParameter>>( \ 8091cb0ef41Sopenharmony_ci IrOpcode::k##JSName, Operator::kNoProperties, #JSName, 2, 1, 1, 1, 1, \ 8101cb0ef41Sopenharmony_ci 2, parameters); \ 8111cb0ef41Sopenharmony_ci } 8121cb0ef41Sopenharmony_ciJS_UNOP_WITH_FEEDBACK(UNARY_OP) 8131cb0ef41Sopenharmony_ci#undef UNARY_OP 8141cb0ef41Sopenharmony_ci 8151cb0ef41Sopenharmony_ci#define BINARY_OP(JSName, Name) \ 8161cb0ef41Sopenharmony_ci const Operator* JSOperatorBuilder::Name(FeedbackSource const& feedback) { \ 8171cb0ef41Sopenharmony_ci static constexpr auto kProperties = BinopProperties(IrOpcode::k##JSName); \ 8181cb0ef41Sopenharmony_ci FeedbackParameter parameters(feedback); \ 8191cb0ef41Sopenharmony_ci return zone()->New<Operator1<FeedbackParameter>>( \ 8201cb0ef41Sopenharmony_ci IrOpcode::k##JSName, kProperties, #JSName, 3, 1, 1, 1, 1, \ 8211cb0ef41Sopenharmony_ci Operator::ZeroIfNoThrow(kProperties), parameters); \ 8221cb0ef41Sopenharmony_ci } 8231cb0ef41Sopenharmony_ciJS_BINOP_WITH_FEEDBACK(BINARY_OP) 8241cb0ef41Sopenharmony_ci#undef BINARY_OP 8251cb0ef41Sopenharmony_ci 8261cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::DefineKeyedOwnPropertyInLiteral( 8271cb0ef41Sopenharmony_ci const FeedbackSource& feedback) { 8281cb0ef41Sopenharmony_ci static constexpr int kObject = 1; 8291cb0ef41Sopenharmony_ci static constexpr int kName = 1; 8301cb0ef41Sopenharmony_ci static constexpr int kValue = 1; 8311cb0ef41Sopenharmony_ci static constexpr int kFlags = 1; 8321cb0ef41Sopenharmony_ci static constexpr int kFeedbackVector = 1; 8331cb0ef41Sopenharmony_ci static constexpr int kArity = 8341cb0ef41Sopenharmony_ci kObject + kName + kValue + kFlags + kFeedbackVector; 8351cb0ef41Sopenharmony_ci FeedbackParameter parameters(feedback); 8361cb0ef41Sopenharmony_ci return zone()->New<Operator1<FeedbackParameter>>( // -- 8371cb0ef41Sopenharmony_ci IrOpcode::kJSDefineKeyedOwnPropertyInLiteral, 8381cb0ef41Sopenharmony_ci Operator::kNoThrow, // opcode 8391cb0ef41Sopenharmony_ci "JSDefineKeyedOwnPropertyInLiteral", // name 8401cb0ef41Sopenharmony_ci kArity, 1, 1, 0, 1, 1, // counts 8411cb0ef41Sopenharmony_ci parameters); // parameter 8421cb0ef41Sopenharmony_ci} 8431cb0ef41Sopenharmony_ci 8441cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::StoreInArrayLiteral( 8451cb0ef41Sopenharmony_ci const FeedbackSource& feedback) { 8461cb0ef41Sopenharmony_ci static constexpr int kArray = 1; 8471cb0ef41Sopenharmony_ci static constexpr int kIndex = 1; 8481cb0ef41Sopenharmony_ci static constexpr int kValue = 1; 8491cb0ef41Sopenharmony_ci static constexpr int kFeedbackVector = 1; 8501cb0ef41Sopenharmony_ci static constexpr int kArity = kArray + kIndex + kValue + kFeedbackVector; 8511cb0ef41Sopenharmony_ci FeedbackParameter parameters(feedback); 8521cb0ef41Sopenharmony_ci return zone()->New<Operator1<FeedbackParameter>>( // -- 8531cb0ef41Sopenharmony_ci IrOpcode::kJSStoreInArrayLiteral, 8541cb0ef41Sopenharmony_ci Operator::kNoThrow, // opcode 8551cb0ef41Sopenharmony_ci "JSStoreInArrayLiteral", // name 8561cb0ef41Sopenharmony_ci kArity, 1, 1, 0, 1, 1, // counts 8571cb0ef41Sopenharmony_ci parameters); // parameter 8581cb0ef41Sopenharmony_ci} 8591cb0ef41Sopenharmony_ci 8601cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::CallForwardVarargs(size_t arity, 8611cb0ef41Sopenharmony_ci uint32_t start_index) { 8621cb0ef41Sopenharmony_ci CallForwardVarargsParameters parameters(arity, start_index); 8631cb0ef41Sopenharmony_ci return zone()->New<Operator1<CallForwardVarargsParameters>>( // -- 8641cb0ef41Sopenharmony_ci IrOpcode::kJSCallForwardVarargs, Operator::kNoProperties, // opcode 8651cb0ef41Sopenharmony_ci "JSCallForwardVarargs", // name 8661cb0ef41Sopenharmony_ci parameters.arity(), 1, 1, 1, 1, 2, // counts 8671cb0ef41Sopenharmony_ci parameters); // parameter 8681cb0ef41Sopenharmony_ci} 8691cb0ef41Sopenharmony_ci 8701cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::Call( 8711cb0ef41Sopenharmony_ci size_t arity, CallFrequency const& frequency, 8721cb0ef41Sopenharmony_ci FeedbackSource const& feedback, ConvertReceiverMode convert_mode, 8731cb0ef41Sopenharmony_ci SpeculationMode speculation_mode, CallFeedbackRelation feedback_relation) { 8741cb0ef41Sopenharmony_ci CallParameters parameters(arity, frequency, feedback, convert_mode, 8751cb0ef41Sopenharmony_ci speculation_mode, feedback_relation); 8761cb0ef41Sopenharmony_ci return zone()->New<Operator1<CallParameters>>( // -- 8771cb0ef41Sopenharmony_ci IrOpcode::kJSCall, Operator::kNoProperties, // opcode 8781cb0ef41Sopenharmony_ci "JSCall", // name 8791cb0ef41Sopenharmony_ci parameters.arity(), 1, 1, 1, 1, 2, // inputs/outputs 8801cb0ef41Sopenharmony_ci parameters); // parameter 8811cb0ef41Sopenharmony_ci} 8821cb0ef41Sopenharmony_ci 8831cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::CallWithArrayLike( 8841cb0ef41Sopenharmony_ci const CallFrequency& frequency, const FeedbackSource& feedback, 8851cb0ef41Sopenharmony_ci SpeculationMode speculation_mode, CallFeedbackRelation feedback_relation) { 8861cb0ef41Sopenharmony_ci static constexpr int kTheArrayLikeObject = 1; 8871cb0ef41Sopenharmony_ci CallParameters parameters( 8881cb0ef41Sopenharmony_ci JSCallWithArrayLikeNode::ArityForArgc(kTheArrayLikeObject), frequency, 8891cb0ef41Sopenharmony_ci feedback, ConvertReceiverMode::kAny, speculation_mode, feedback_relation); 8901cb0ef41Sopenharmony_ci return zone()->New<Operator1<CallParameters>>( // -- 8911cb0ef41Sopenharmony_ci IrOpcode::kJSCallWithArrayLike, Operator::kNoProperties, // opcode 8921cb0ef41Sopenharmony_ci "JSCallWithArrayLike", // name 8931cb0ef41Sopenharmony_ci parameters.arity(), 1, 1, 1, 1, 2, // counts 8941cb0ef41Sopenharmony_ci parameters); // parameter 8951cb0ef41Sopenharmony_ci} 8961cb0ef41Sopenharmony_ci 8971cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::CallWithSpread( 8981cb0ef41Sopenharmony_ci uint32_t arity, CallFrequency const& frequency, 8991cb0ef41Sopenharmony_ci FeedbackSource const& feedback, SpeculationMode speculation_mode, 9001cb0ef41Sopenharmony_ci CallFeedbackRelation feedback_relation) { 9011cb0ef41Sopenharmony_ci DCHECK_IMPLIES(speculation_mode == SpeculationMode::kAllowSpeculation, 9021cb0ef41Sopenharmony_ci feedback.IsValid()); 9031cb0ef41Sopenharmony_ci CallParameters parameters(arity, frequency, feedback, 9041cb0ef41Sopenharmony_ci ConvertReceiverMode::kAny, speculation_mode, 9051cb0ef41Sopenharmony_ci feedback_relation); 9061cb0ef41Sopenharmony_ci return zone()->New<Operator1<CallParameters>>( // -- 9071cb0ef41Sopenharmony_ci IrOpcode::kJSCallWithSpread, Operator::kNoProperties, // opcode 9081cb0ef41Sopenharmony_ci "JSCallWithSpread", // name 9091cb0ef41Sopenharmony_ci parameters.arity(), 1, 1, 1, 1, 2, // counts 9101cb0ef41Sopenharmony_ci parameters); // parameter 9111cb0ef41Sopenharmony_ci} 9121cb0ef41Sopenharmony_ci 9131cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::CallRuntime(Runtime::FunctionId id) { 9141cb0ef41Sopenharmony_ci const Runtime::Function* f = Runtime::FunctionForId(id); 9151cb0ef41Sopenharmony_ci return CallRuntime(f, f->nargs); 9161cb0ef41Sopenharmony_ci} 9171cb0ef41Sopenharmony_ci 9181cb0ef41Sopenharmony_ci 9191cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::CallRuntime(Runtime::FunctionId id, 9201cb0ef41Sopenharmony_ci size_t arity) { 9211cb0ef41Sopenharmony_ci const Runtime::Function* f = Runtime::FunctionForId(id); 9221cb0ef41Sopenharmony_ci return CallRuntime(f, arity); 9231cb0ef41Sopenharmony_ci} 9241cb0ef41Sopenharmony_ci 9251cb0ef41Sopenharmony_ci 9261cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::CallRuntime(const Runtime::Function* f, 9271cb0ef41Sopenharmony_ci size_t arity) { 9281cb0ef41Sopenharmony_ci CallRuntimeParameters parameters(f->function_id, arity); 9291cb0ef41Sopenharmony_ci DCHECK(f->nargs == -1 || f->nargs == static_cast<int>(parameters.arity())); 9301cb0ef41Sopenharmony_ci return zone()->New<Operator1<CallRuntimeParameters>>( // -- 9311cb0ef41Sopenharmony_ci IrOpcode::kJSCallRuntime, Operator::kNoProperties, // opcode 9321cb0ef41Sopenharmony_ci "JSCallRuntime", // name 9331cb0ef41Sopenharmony_ci parameters.arity(), 1, 1, f->result_size, 1, 2, // inputs/outputs 9341cb0ef41Sopenharmony_ci parameters); // parameter 9351cb0ef41Sopenharmony_ci} 9361cb0ef41Sopenharmony_ci 9371cb0ef41Sopenharmony_ci#if V8_ENABLE_WEBASSEMBLY 9381cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::CallWasm( 9391cb0ef41Sopenharmony_ci const wasm::WasmModule* wasm_module, 9401cb0ef41Sopenharmony_ci const wasm::FunctionSig* wasm_signature, FeedbackSource const& feedback) { 9411cb0ef41Sopenharmony_ci JSWasmCallParameters parameters(wasm_module, wasm_signature, feedback); 9421cb0ef41Sopenharmony_ci return zone()->New<Operator1<JSWasmCallParameters>>( 9431cb0ef41Sopenharmony_ci IrOpcode::kJSWasmCall, Operator::kNoProperties, // opcode 9441cb0ef41Sopenharmony_ci "JSWasmCall", // name 9451cb0ef41Sopenharmony_ci parameters.input_count(), 1, 1, 1, 1, 2, // inputs/outputs 9461cb0ef41Sopenharmony_ci parameters); // parameter 9471cb0ef41Sopenharmony_ci} 9481cb0ef41Sopenharmony_ci#endif // V8_ENABLE_WEBASSEMBLY 9491cb0ef41Sopenharmony_ci 9501cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::ConstructForwardVarargs( 9511cb0ef41Sopenharmony_ci size_t arity, uint32_t start_index) { 9521cb0ef41Sopenharmony_ci ConstructForwardVarargsParameters parameters(arity, start_index); 9531cb0ef41Sopenharmony_ci return zone()->New<Operator1<ConstructForwardVarargsParameters>>( // -- 9541cb0ef41Sopenharmony_ci IrOpcode::kJSConstructForwardVarargs, Operator::kNoProperties, // opcode 9551cb0ef41Sopenharmony_ci "JSConstructForwardVarargs", // name 9561cb0ef41Sopenharmony_ci parameters.arity(), 1, 1, 1, 1, 2, // counts 9571cb0ef41Sopenharmony_ci parameters); // parameter 9581cb0ef41Sopenharmony_ci} 9591cb0ef41Sopenharmony_ci 9601cb0ef41Sopenharmony_ci// Note: frequency is taken by reference to work around a GCC bug 9611cb0ef41Sopenharmony_ci// on AIX (v8:8193). 9621cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::Construct(uint32_t arity, 9631cb0ef41Sopenharmony_ci CallFrequency const& frequency, 9641cb0ef41Sopenharmony_ci FeedbackSource const& feedback) { 9651cb0ef41Sopenharmony_ci ConstructParameters parameters(arity, frequency, feedback); 9661cb0ef41Sopenharmony_ci return zone()->New<Operator1<ConstructParameters>>( // -- 9671cb0ef41Sopenharmony_ci IrOpcode::kJSConstruct, Operator::kNoProperties, // opcode 9681cb0ef41Sopenharmony_ci "JSConstruct", // name 9691cb0ef41Sopenharmony_ci parameters.arity(), 1, 1, 1, 1, 2, // counts 9701cb0ef41Sopenharmony_ci parameters); // parameter 9711cb0ef41Sopenharmony_ci} 9721cb0ef41Sopenharmony_ci 9731cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::ConstructWithArrayLike( 9741cb0ef41Sopenharmony_ci CallFrequency const& frequency, FeedbackSource const& feedback) { 9751cb0ef41Sopenharmony_ci static constexpr int kTheArrayLikeObject = 1; 9761cb0ef41Sopenharmony_ci ConstructParameters parameters( 9771cb0ef41Sopenharmony_ci JSConstructWithArrayLikeNode::ArityForArgc(kTheArrayLikeObject), 9781cb0ef41Sopenharmony_ci frequency, feedback); 9791cb0ef41Sopenharmony_ci return zone()->New<Operator1<ConstructParameters>>( // -- 9801cb0ef41Sopenharmony_ci IrOpcode::kJSConstructWithArrayLike, // opcode 9811cb0ef41Sopenharmony_ci Operator::kNoProperties, // properties 9821cb0ef41Sopenharmony_ci "JSConstructWithArrayLike", // name 9831cb0ef41Sopenharmony_ci parameters.arity(), 1, 1, 1, 1, 2, // counts 9841cb0ef41Sopenharmony_ci parameters); // parameter 9851cb0ef41Sopenharmony_ci} 9861cb0ef41Sopenharmony_ci 9871cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::ConstructWithSpread( 9881cb0ef41Sopenharmony_ci uint32_t arity, CallFrequency const& frequency, 9891cb0ef41Sopenharmony_ci FeedbackSource const& feedback) { 9901cb0ef41Sopenharmony_ci ConstructParameters parameters(arity, frequency, feedback); 9911cb0ef41Sopenharmony_ci return zone()->New<Operator1<ConstructParameters>>( // -- 9921cb0ef41Sopenharmony_ci IrOpcode::kJSConstructWithSpread, Operator::kNoProperties, // opcode 9931cb0ef41Sopenharmony_ci "JSConstructWithSpread", // name 9941cb0ef41Sopenharmony_ci parameters.arity(), 1, 1, 1, 1, 2, // counts 9951cb0ef41Sopenharmony_ci parameters); // parameter 9961cb0ef41Sopenharmony_ci} 9971cb0ef41Sopenharmony_ci 9981cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::LoadNamed(const NameRef& name, 9991cb0ef41Sopenharmony_ci const FeedbackSource& feedback) { 10001cb0ef41Sopenharmony_ci static constexpr int kObject = 1; 10011cb0ef41Sopenharmony_ci static constexpr int kFeedbackVector = 1; 10021cb0ef41Sopenharmony_ci static constexpr int kArity = kObject + kFeedbackVector; 10031cb0ef41Sopenharmony_ci NamedAccess access(LanguageMode::kSloppy, name, feedback); 10041cb0ef41Sopenharmony_ci return zone()->New<Operator1<NamedAccess>>( // -- 10051cb0ef41Sopenharmony_ci IrOpcode::kJSLoadNamed, Operator::kNoProperties, // opcode 10061cb0ef41Sopenharmony_ci "JSLoadNamed", // name 10071cb0ef41Sopenharmony_ci kArity, 1, 1, 1, 1, 2, // counts 10081cb0ef41Sopenharmony_ci access); // parameter 10091cb0ef41Sopenharmony_ci} 10101cb0ef41Sopenharmony_ci 10111cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::LoadNamedFromSuper( 10121cb0ef41Sopenharmony_ci const NameRef& name, const FeedbackSource& feedback) { 10131cb0ef41Sopenharmony_ci static constexpr int kReceiver = 1; 10141cb0ef41Sopenharmony_ci static constexpr int kHomeObject = 1; 10151cb0ef41Sopenharmony_ci static constexpr int kFeedbackVector = 1; 10161cb0ef41Sopenharmony_ci static constexpr int kArity = kReceiver + kHomeObject + kFeedbackVector; 10171cb0ef41Sopenharmony_ci NamedAccess access(LanguageMode::kSloppy, name, feedback); 10181cb0ef41Sopenharmony_ci return zone()->New<Operator1<NamedAccess>>( // -- 10191cb0ef41Sopenharmony_ci IrOpcode::kJSLoadNamedFromSuper, Operator::kNoProperties, // opcode 10201cb0ef41Sopenharmony_ci "JSLoadNamedFromSuper", // name 10211cb0ef41Sopenharmony_ci kArity, 1, 1, 1, 1, 2, // counts 10221cb0ef41Sopenharmony_ci access); // parameter 10231cb0ef41Sopenharmony_ci} 10241cb0ef41Sopenharmony_ci 10251cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::LoadProperty( 10261cb0ef41Sopenharmony_ci FeedbackSource const& feedback) { 10271cb0ef41Sopenharmony_ci PropertyAccess access(LanguageMode::kSloppy, feedback); 10281cb0ef41Sopenharmony_ci return zone()->New<Operator1<PropertyAccess>>( // -- 10291cb0ef41Sopenharmony_ci IrOpcode::kJSLoadProperty, Operator::kNoProperties, // opcode 10301cb0ef41Sopenharmony_ci "JSLoadProperty", // name 10311cb0ef41Sopenharmony_ci 3, 1, 1, 1, 1, 2, // counts 10321cb0ef41Sopenharmony_ci access); // parameter 10331cb0ef41Sopenharmony_ci} 10341cb0ef41Sopenharmony_ci 10351cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::GetIterator( 10361cb0ef41Sopenharmony_ci FeedbackSource const& load_feedback, FeedbackSource const& call_feedback) { 10371cb0ef41Sopenharmony_ci GetIteratorParameters access(load_feedback, call_feedback); 10381cb0ef41Sopenharmony_ci return zone()->New<Operator1<GetIteratorParameters>>( // -- 10391cb0ef41Sopenharmony_ci IrOpcode::kJSGetIterator, Operator::kNoProperties, // opcode 10401cb0ef41Sopenharmony_ci "JSGetIterator", // name 10411cb0ef41Sopenharmony_ci 2, 1, 1, 1, 1, 2, // counts 10421cb0ef41Sopenharmony_ci access); // parameter 10431cb0ef41Sopenharmony_ci} 10441cb0ef41Sopenharmony_ci 10451cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::HasProperty(FeedbackSource const& feedback) { 10461cb0ef41Sopenharmony_ci PropertyAccess access(LanguageMode::kSloppy, feedback); 10471cb0ef41Sopenharmony_ci return zone()->New<Operator1<PropertyAccess>>( // -- 10481cb0ef41Sopenharmony_ci IrOpcode::kJSHasProperty, Operator::kNoProperties, // opcode 10491cb0ef41Sopenharmony_ci "JSHasProperty", // name 10501cb0ef41Sopenharmony_ci 3, 1, 1, 1, 1, 2, // counts 10511cb0ef41Sopenharmony_ci access); // parameter 10521cb0ef41Sopenharmony_ci} 10531cb0ef41Sopenharmony_ci 10541cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::ForInNext(ForInMode mode, 10551cb0ef41Sopenharmony_ci const FeedbackSource& feedback) { 10561cb0ef41Sopenharmony_ci return zone()->New<Operator1<ForInParameters>>( // -- 10571cb0ef41Sopenharmony_ci IrOpcode::kJSForInNext, Operator::kNoProperties, // opcode 10581cb0ef41Sopenharmony_ci "JSForInNext", // name 10591cb0ef41Sopenharmony_ci 5, 1, 1, 1, 1, 2, // counts 10601cb0ef41Sopenharmony_ci ForInParameters{feedback, mode}); // parameter 10611cb0ef41Sopenharmony_ci} 10621cb0ef41Sopenharmony_ci 10631cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::ForInPrepare( 10641cb0ef41Sopenharmony_ci ForInMode mode, const FeedbackSource& feedback) { 10651cb0ef41Sopenharmony_ci return zone()->New<Operator1<ForInParameters>>( // -- 10661cb0ef41Sopenharmony_ci IrOpcode::kJSForInPrepare, // opcode 10671cb0ef41Sopenharmony_ci Operator::kNoWrite | Operator::kNoThrow, // flags 10681cb0ef41Sopenharmony_ci "JSForInPrepare", // name 10691cb0ef41Sopenharmony_ci 2, 1, 1, 3, 1, 1, // counts 10701cb0ef41Sopenharmony_ci ForInParameters{feedback, mode}); // parameter 10711cb0ef41Sopenharmony_ci} 10721cb0ef41Sopenharmony_ci 10731cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::GeneratorStore(int register_count) { 10741cb0ef41Sopenharmony_ci return zone()->New<Operator1<int>>( // -- 10751cb0ef41Sopenharmony_ci IrOpcode::kJSGeneratorStore, Operator::kNoThrow, // opcode 10761cb0ef41Sopenharmony_ci "JSGeneratorStore", // name 10771cb0ef41Sopenharmony_ci 3 + register_count, 1, 1, 0, 1, 0, // counts 10781cb0ef41Sopenharmony_ci register_count); // parameter 10791cb0ef41Sopenharmony_ci} 10801cb0ef41Sopenharmony_ci 10811cb0ef41Sopenharmony_ciint RegisterCountOf(Operator const* op) { 10821cb0ef41Sopenharmony_ci DCHECK_EQ(IrOpcode::kJSCreateAsyncFunctionObject, op->opcode()); 10831cb0ef41Sopenharmony_ci return OpParameter<int>(op); 10841cb0ef41Sopenharmony_ci} 10851cb0ef41Sopenharmony_ci 10861cb0ef41Sopenharmony_ciint GeneratorStoreValueCountOf(const Operator* op) { 10871cb0ef41Sopenharmony_ci DCHECK_EQ(IrOpcode::kJSGeneratorStore, op->opcode()); 10881cb0ef41Sopenharmony_ci return OpParameter<int>(op); 10891cb0ef41Sopenharmony_ci} 10901cb0ef41Sopenharmony_ci 10911cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::GeneratorRestoreRegister(int index) { 10921cb0ef41Sopenharmony_ci return zone()->New<Operator1<int>>( // -- 10931cb0ef41Sopenharmony_ci IrOpcode::kJSGeneratorRestoreRegister, Operator::kNoThrow, // opcode 10941cb0ef41Sopenharmony_ci "JSGeneratorRestoreRegister", // name 10951cb0ef41Sopenharmony_ci 1, 1, 1, 1, 1, 0, // counts 10961cb0ef41Sopenharmony_ci index); // parameter 10971cb0ef41Sopenharmony_ci} 10981cb0ef41Sopenharmony_ci 10991cb0ef41Sopenharmony_ciint RestoreRegisterIndexOf(const Operator* op) { 11001cb0ef41Sopenharmony_ci DCHECK_EQ(IrOpcode::kJSGeneratorRestoreRegister, op->opcode()); 11011cb0ef41Sopenharmony_ci return OpParameter<int>(op); 11021cb0ef41Sopenharmony_ci} 11031cb0ef41Sopenharmony_ci 11041cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::SetNamedProperty( 11051cb0ef41Sopenharmony_ci LanguageMode language_mode, const NameRef& name, 11061cb0ef41Sopenharmony_ci FeedbackSource const& feedback) { 11071cb0ef41Sopenharmony_ci static constexpr int kObject = 1; 11081cb0ef41Sopenharmony_ci static constexpr int kValue = 1; 11091cb0ef41Sopenharmony_ci static constexpr int kFeedbackVector = 1; 11101cb0ef41Sopenharmony_ci static constexpr int kArity = kObject + kValue + kFeedbackVector; 11111cb0ef41Sopenharmony_ci NamedAccess access(language_mode, name, feedback); 11121cb0ef41Sopenharmony_ci return zone()->New<Operator1<NamedAccess>>( // -- 11131cb0ef41Sopenharmony_ci IrOpcode::kJSSetNamedProperty, Operator::kNoProperties, // opcode 11141cb0ef41Sopenharmony_ci "JSSetNamedProperty", // name 11151cb0ef41Sopenharmony_ci kArity, 1, 1, 0, 1, 2, // counts 11161cb0ef41Sopenharmony_ci access); // parameter 11171cb0ef41Sopenharmony_ci} 11181cb0ef41Sopenharmony_ci 11191cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::SetKeyedProperty( 11201cb0ef41Sopenharmony_ci LanguageMode language_mode, FeedbackSource const& feedback) { 11211cb0ef41Sopenharmony_ci PropertyAccess access(language_mode, feedback); 11221cb0ef41Sopenharmony_ci return zone()->New<Operator1<PropertyAccess>>( // -- 11231cb0ef41Sopenharmony_ci IrOpcode::kJSSetKeyedProperty, Operator::kNoProperties, // opcode 11241cb0ef41Sopenharmony_ci "JSSetKeyedProperty", // name 11251cb0ef41Sopenharmony_ci 4, 1, 1, 0, 1, 2, // counts 11261cb0ef41Sopenharmony_ci access); // parameter 11271cb0ef41Sopenharmony_ci} 11281cb0ef41Sopenharmony_ci 11291cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::DefineKeyedOwnProperty( 11301cb0ef41Sopenharmony_ci LanguageMode language_mode, FeedbackSource const& feedback) { 11311cb0ef41Sopenharmony_ci PropertyAccess access(language_mode, feedback); 11321cb0ef41Sopenharmony_ci return zone()->New<Operator1<PropertyAccess>>( // -- 11331cb0ef41Sopenharmony_ci IrOpcode::kJSDefineKeyedOwnProperty, Operator::kNoProperties, // opcode 11341cb0ef41Sopenharmony_ci "JSDefineKeyedOwnProperty", // name 11351cb0ef41Sopenharmony_ci 4, 1, 1, 0, 1, 2, // counts 11361cb0ef41Sopenharmony_ci access); // parameter 11371cb0ef41Sopenharmony_ci} 11381cb0ef41Sopenharmony_ci 11391cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::DefineNamedOwnProperty( 11401cb0ef41Sopenharmony_ci const NameRef& name, FeedbackSource const& feedback) { 11411cb0ef41Sopenharmony_ci static constexpr int kObject = 1; 11421cb0ef41Sopenharmony_ci static constexpr int kValue = 1; 11431cb0ef41Sopenharmony_ci static constexpr int kFeedbackVector = 1; 11441cb0ef41Sopenharmony_ci static constexpr int kArity = kObject + kValue + kFeedbackVector; 11451cb0ef41Sopenharmony_ci DefineNamedOwnPropertyParameters parameters(name, feedback); 11461cb0ef41Sopenharmony_ci return zone()->New<Operator1<DefineNamedOwnPropertyParameters>>( // -- 11471cb0ef41Sopenharmony_ci IrOpcode::kJSDefineNamedOwnProperty, Operator::kNoProperties, // opcode 11481cb0ef41Sopenharmony_ci "JSDefineNamedOwnProperty", // name 11491cb0ef41Sopenharmony_ci kArity, 1, 1, 0, 1, 2, // counts 11501cb0ef41Sopenharmony_ci parameters); // parameter 11511cb0ef41Sopenharmony_ci} 11521cb0ef41Sopenharmony_ci 11531cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::DeleteProperty() { 11541cb0ef41Sopenharmony_ci return zone()->New<Operator>( // -- 11551cb0ef41Sopenharmony_ci IrOpcode::kJSDeleteProperty, Operator::kNoProperties, // opcode 11561cb0ef41Sopenharmony_ci "JSDeleteProperty", // name 11571cb0ef41Sopenharmony_ci 3, 1, 1, 1, 1, 2); // counts 11581cb0ef41Sopenharmony_ci} 11591cb0ef41Sopenharmony_ci 11601cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::CreateGeneratorObject() { 11611cb0ef41Sopenharmony_ci return zone()->New<Operator>( // -- 11621cb0ef41Sopenharmony_ci IrOpcode::kJSCreateGeneratorObject, Operator::kEliminatable, // opcode 11631cb0ef41Sopenharmony_ci "JSCreateGeneratorObject", // name 11641cb0ef41Sopenharmony_ci 2, 1, 1, 1, 1, 0); // counts 11651cb0ef41Sopenharmony_ci} 11661cb0ef41Sopenharmony_ci 11671cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::LoadGlobal(const NameRef& name, 11681cb0ef41Sopenharmony_ci const FeedbackSource& feedback, 11691cb0ef41Sopenharmony_ci TypeofMode typeof_mode) { 11701cb0ef41Sopenharmony_ci static constexpr int kFeedbackVector = 1; 11711cb0ef41Sopenharmony_ci static constexpr int kArity = kFeedbackVector; 11721cb0ef41Sopenharmony_ci LoadGlobalParameters parameters(name, feedback, typeof_mode); 11731cb0ef41Sopenharmony_ci return zone()->New<Operator1<LoadGlobalParameters>>( // -- 11741cb0ef41Sopenharmony_ci IrOpcode::kJSLoadGlobal, Operator::kNoProperties, // opcode 11751cb0ef41Sopenharmony_ci "JSLoadGlobal", // name 11761cb0ef41Sopenharmony_ci kArity, 1, 1, 1, 1, 2, // counts 11771cb0ef41Sopenharmony_ci parameters); // parameter 11781cb0ef41Sopenharmony_ci} 11791cb0ef41Sopenharmony_ci 11801cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::StoreGlobal(LanguageMode language_mode, 11811cb0ef41Sopenharmony_ci const NameRef& name, 11821cb0ef41Sopenharmony_ci const FeedbackSource& feedback) { 11831cb0ef41Sopenharmony_ci static constexpr int kValue = 1; 11841cb0ef41Sopenharmony_ci static constexpr int kFeedbackVector = 1; 11851cb0ef41Sopenharmony_ci static constexpr int kArity = kValue + kFeedbackVector; 11861cb0ef41Sopenharmony_ci StoreGlobalParameters parameters(language_mode, feedback, name); 11871cb0ef41Sopenharmony_ci return zone()->New<Operator1<StoreGlobalParameters>>( // -- 11881cb0ef41Sopenharmony_ci IrOpcode::kJSStoreGlobal, Operator::kNoProperties, // opcode 11891cb0ef41Sopenharmony_ci "JSStoreGlobal", // name 11901cb0ef41Sopenharmony_ci kArity, 1, 1, 0, 1, 2, // counts 11911cb0ef41Sopenharmony_ci parameters); // parameter 11921cb0ef41Sopenharmony_ci} 11931cb0ef41Sopenharmony_ci 11941cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::HasContextExtension(size_t depth) { 11951cb0ef41Sopenharmony_ci return zone()->New<Operator1<size_t>>( // -- 11961cb0ef41Sopenharmony_ci IrOpcode::kJSHasContextExtension, // opcode 11971cb0ef41Sopenharmony_ci Operator::kNoWrite | Operator::kNoThrow, // flags 11981cb0ef41Sopenharmony_ci "JSHasContextExtension", // name 11991cb0ef41Sopenharmony_ci 0, 1, 0, 1, 1, 0, // counts 12001cb0ef41Sopenharmony_ci depth); // parameter 12011cb0ef41Sopenharmony_ci} 12021cb0ef41Sopenharmony_ci 12031cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::LoadContext(size_t depth, size_t index, 12041cb0ef41Sopenharmony_ci bool immutable) { 12051cb0ef41Sopenharmony_ci ContextAccess access(depth, index, immutable); 12061cb0ef41Sopenharmony_ci return zone()->New<Operator1<ContextAccess>>( // -- 12071cb0ef41Sopenharmony_ci IrOpcode::kJSLoadContext, // opcode 12081cb0ef41Sopenharmony_ci Operator::kNoWrite | Operator::kNoThrow, // flags 12091cb0ef41Sopenharmony_ci "JSLoadContext", // name 12101cb0ef41Sopenharmony_ci 0, 1, 0, 1, 1, 0, // counts 12111cb0ef41Sopenharmony_ci access); // parameter 12121cb0ef41Sopenharmony_ci} 12131cb0ef41Sopenharmony_ci 12141cb0ef41Sopenharmony_ci 12151cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::StoreContext(size_t depth, size_t index) { 12161cb0ef41Sopenharmony_ci ContextAccess access(depth, index, false); 12171cb0ef41Sopenharmony_ci return zone()->New<Operator1<ContextAccess>>( // -- 12181cb0ef41Sopenharmony_ci IrOpcode::kJSStoreContext, // opcode 12191cb0ef41Sopenharmony_ci Operator::kNoRead | Operator::kNoThrow, // flags 12201cb0ef41Sopenharmony_ci "JSStoreContext", // name 12211cb0ef41Sopenharmony_ci 1, 1, 1, 0, 1, 0, // counts 12221cb0ef41Sopenharmony_ci access); // parameter 12231cb0ef41Sopenharmony_ci} 12241cb0ef41Sopenharmony_ci 12251cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::LoadModule(int32_t cell_index) { 12261cb0ef41Sopenharmony_ci return zone()->New<Operator1<int32_t>>( // -- 12271cb0ef41Sopenharmony_ci IrOpcode::kJSLoadModule, // opcode 12281cb0ef41Sopenharmony_ci Operator::kNoWrite | Operator::kNoThrow, // flags 12291cb0ef41Sopenharmony_ci "JSLoadModule", // name 12301cb0ef41Sopenharmony_ci 1, 1, 1, 1, 1, 0, // counts 12311cb0ef41Sopenharmony_ci cell_index); // parameter 12321cb0ef41Sopenharmony_ci} 12331cb0ef41Sopenharmony_ci 12341cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::GetImportMeta() { 12351cb0ef41Sopenharmony_ci return zone()->New<Operator>( // -- 12361cb0ef41Sopenharmony_ci IrOpcode::kJSGetImportMeta, // opcode 12371cb0ef41Sopenharmony_ci Operator::kNoProperties, // flags 12381cb0ef41Sopenharmony_ci "JSGetImportMeta", // name 12391cb0ef41Sopenharmony_ci 0, 1, 1, 1, 1, 2); // counts 12401cb0ef41Sopenharmony_ci} 12411cb0ef41Sopenharmony_ci 12421cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::StoreModule(int32_t cell_index) { 12431cb0ef41Sopenharmony_ci return zone()->New<Operator1<int32_t>>( // -- 12441cb0ef41Sopenharmony_ci IrOpcode::kJSStoreModule, // opcode 12451cb0ef41Sopenharmony_ci Operator::kNoRead | Operator::kNoThrow, // flags 12461cb0ef41Sopenharmony_ci "JSStoreModule", // name 12471cb0ef41Sopenharmony_ci 2, 1, 1, 0, 1, 0, // counts 12481cb0ef41Sopenharmony_ci cell_index); // parameter 12491cb0ef41Sopenharmony_ci} 12501cb0ef41Sopenharmony_ci 12511cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::CreateArguments(CreateArgumentsType type) { 12521cb0ef41Sopenharmony_ci return zone()->New<Operator1<CreateArgumentsType>>( // -- 12531cb0ef41Sopenharmony_ci IrOpcode::kJSCreateArguments, Operator::kEliminatable, // opcode 12541cb0ef41Sopenharmony_ci "JSCreateArguments", // name 12551cb0ef41Sopenharmony_ci 1, 1, 0, 1, 1, 0, // counts 12561cb0ef41Sopenharmony_ci type); // parameter 12571cb0ef41Sopenharmony_ci} 12581cb0ef41Sopenharmony_ci 12591cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::CreateArray( 12601cb0ef41Sopenharmony_ci size_t arity, base::Optional<AllocationSiteRef> site) { 12611cb0ef41Sopenharmony_ci // constructor, new_target, arg1, ..., argN 12621cb0ef41Sopenharmony_ci int const value_input_count = static_cast<int>(arity) + 2; 12631cb0ef41Sopenharmony_ci CreateArrayParameters parameters(arity, site); 12641cb0ef41Sopenharmony_ci return zone()->New<Operator1<CreateArrayParameters>>( // -- 12651cb0ef41Sopenharmony_ci IrOpcode::kJSCreateArray, Operator::kNoProperties, // opcode 12661cb0ef41Sopenharmony_ci "JSCreateArray", // name 12671cb0ef41Sopenharmony_ci value_input_count, 1, 1, 1, 1, 2, // counts 12681cb0ef41Sopenharmony_ci parameters); // parameter 12691cb0ef41Sopenharmony_ci} 12701cb0ef41Sopenharmony_ci 12711cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::CreateArrayIterator(IterationKind kind) { 12721cb0ef41Sopenharmony_ci CreateArrayIteratorParameters parameters(kind); 12731cb0ef41Sopenharmony_ci return zone()->New<Operator1<CreateArrayIteratorParameters>>( // -- 12741cb0ef41Sopenharmony_ci IrOpcode::kJSCreateArrayIterator, Operator::kEliminatable, // opcode 12751cb0ef41Sopenharmony_ci "JSCreateArrayIterator", // name 12761cb0ef41Sopenharmony_ci 1, 1, 1, 1, 1, 0, // counts 12771cb0ef41Sopenharmony_ci parameters); // parameter 12781cb0ef41Sopenharmony_ci} 12791cb0ef41Sopenharmony_ci 12801cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::CreateAsyncFunctionObject( 12811cb0ef41Sopenharmony_ci int register_count) { 12821cb0ef41Sopenharmony_ci return zone()->New<Operator1<int>>( // -- 12831cb0ef41Sopenharmony_ci IrOpcode::kJSCreateAsyncFunctionObject, // opcode 12841cb0ef41Sopenharmony_ci Operator::kEliminatable, // flags 12851cb0ef41Sopenharmony_ci "JSCreateAsyncFunctionObject", // name 12861cb0ef41Sopenharmony_ci 3, 1, 1, 1, 1, 0, // counts 12871cb0ef41Sopenharmony_ci register_count); // parameter 12881cb0ef41Sopenharmony_ci} 12891cb0ef41Sopenharmony_ci 12901cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::CreateCollectionIterator( 12911cb0ef41Sopenharmony_ci CollectionKind collection_kind, IterationKind iteration_kind) { 12921cb0ef41Sopenharmony_ci CreateCollectionIteratorParameters parameters(collection_kind, 12931cb0ef41Sopenharmony_ci iteration_kind); 12941cb0ef41Sopenharmony_ci return zone()->New<Operator1<CreateCollectionIteratorParameters>>( 12951cb0ef41Sopenharmony_ci IrOpcode::kJSCreateCollectionIterator, Operator::kEliminatable, 12961cb0ef41Sopenharmony_ci "JSCreateCollectionIterator", 1, 1, 1, 1, 1, 0, parameters); 12971cb0ef41Sopenharmony_ci} 12981cb0ef41Sopenharmony_ci 12991cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::CreateBoundFunction(size_t arity, 13001cb0ef41Sopenharmony_ci const MapRef& map) { 13011cb0ef41Sopenharmony_ci // bound_target_function, bound_this, arg1, ..., argN 13021cb0ef41Sopenharmony_ci int const value_input_count = static_cast<int>(arity) + 2; 13031cb0ef41Sopenharmony_ci CreateBoundFunctionParameters parameters(arity, map); 13041cb0ef41Sopenharmony_ci return zone()->New<Operator1<CreateBoundFunctionParameters>>( // -- 13051cb0ef41Sopenharmony_ci IrOpcode::kJSCreateBoundFunction, Operator::kEliminatable, // opcode 13061cb0ef41Sopenharmony_ci "JSCreateBoundFunction", // name 13071cb0ef41Sopenharmony_ci value_input_count, 1, 1, 1, 1, 0, // counts 13081cb0ef41Sopenharmony_ci parameters); // parameter 13091cb0ef41Sopenharmony_ci} 13101cb0ef41Sopenharmony_ci 13111cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::CreateClosure( 13121cb0ef41Sopenharmony_ci const SharedFunctionInfoRef& shared_info, const CodeTRef& code, 13131cb0ef41Sopenharmony_ci AllocationType allocation) { 13141cb0ef41Sopenharmony_ci static constexpr int kFeedbackCell = 1; 13151cb0ef41Sopenharmony_ci static constexpr int kArity = kFeedbackCell; 13161cb0ef41Sopenharmony_ci CreateClosureParameters parameters(shared_info, code, allocation); 13171cb0ef41Sopenharmony_ci return zone()->New<Operator1<CreateClosureParameters>>( // -- 13181cb0ef41Sopenharmony_ci IrOpcode::kJSCreateClosure, Operator::kEliminatable, // opcode 13191cb0ef41Sopenharmony_ci "JSCreateClosure", // name 13201cb0ef41Sopenharmony_ci kArity, 1, 1, 1, 1, 0, // counts 13211cb0ef41Sopenharmony_ci parameters); // parameter 13221cb0ef41Sopenharmony_ci} 13231cb0ef41Sopenharmony_ci 13241cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::CreateLiteralArray( 13251cb0ef41Sopenharmony_ci const ArrayBoilerplateDescriptionRef& description, 13261cb0ef41Sopenharmony_ci FeedbackSource const& feedback, int literal_flags, int number_of_elements) { 13271cb0ef41Sopenharmony_ci CreateLiteralParameters parameters(description, feedback, number_of_elements, 13281cb0ef41Sopenharmony_ci literal_flags); 13291cb0ef41Sopenharmony_ci return zone()->New<Operator1<CreateLiteralParameters>>( // -- 13301cb0ef41Sopenharmony_ci IrOpcode::kJSCreateLiteralArray, // opcode 13311cb0ef41Sopenharmony_ci Operator::kNoProperties, // properties 13321cb0ef41Sopenharmony_ci "JSCreateLiteralArray", // name 13331cb0ef41Sopenharmony_ci 1, 1, 1, 1, 1, 2, // counts 13341cb0ef41Sopenharmony_ci parameters); // parameter 13351cb0ef41Sopenharmony_ci} 13361cb0ef41Sopenharmony_ci 13371cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::CreateEmptyLiteralArray( 13381cb0ef41Sopenharmony_ci FeedbackSource const& feedback) { 13391cb0ef41Sopenharmony_ci static constexpr int kFeedbackVector = 1; 13401cb0ef41Sopenharmony_ci static constexpr int kArity = kFeedbackVector; 13411cb0ef41Sopenharmony_ci FeedbackParameter parameters(feedback); 13421cb0ef41Sopenharmony_ci return zone()->New<Operator1<FeedbackParameter>>( // -- 13431cb0ef41Sopenharmony_ci IrOpcode::kJSCreateEmptyLiteralArray, // opcode 13441cb0ef41Sopenharmony_ci Operator::kEliminatable, // properties 13451cb0ef41Sopenharmony_ci "JSCreateEmptyLiteralArray", // name 13461cb0ef41Sopenharmony_ci kArity, 1, 1, 1, 1, 0, // counts 13471cb0ef41Sopenharmony_ci parameters); // parameter 13481cb0ef41Sopenharmony_ci} 13491cb0ef41Sopenharmony_ci 13501cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::CreateArrayFromIterable() { 13511cb0ef41Sopenharmony_ci return zone()->New<Operator>( // -- 13521cb0ef41Sopenharmony_ci IrOpcode::kJSCreateArrayFromIterable, // opcode 13531cb0ef41Sopenharmony_ci Operator::kNoProperties, // properties 13541cb0ef41Sopenharmony_ci "JSCreateArrayFromIterable", // name 13551cb0ef41Sopenharmony_ci 1, 1, 1, 1, 1, 2); // counts 13561cb0ef41Sopenharmony_ci} 13571cb0ef41Sopenharmony_ci 13581cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::CreateLiteralObject( 13591cb0ef41Sopenharmony_ci const ObjectBoilerplateDescriptionRef& constant_properties, 13601cb0ef41Sopenharmony_ci FeedbackSource const& feedback, int literal_flags, 13611cb0ef41Sopenharmony_ci int number_of_properties) { 13621cb0ef41Sopenharmony_ci CreateLiteralParameters parameters(constant_properties, feedback, 13631cb0ef41Sopenharmony_ci number_of_properties, literal_flags); 13641cb0ef41Sopenharmony_ci return zone()->New<Operator1<CreateLiteralParameters>>( // -- 13651cb0ef41Sopenharmony_ci IrOpcode::kJSCreateLiteralObject, // opcode 13661cb0ef41Sopenharmony_ci Operator::kNoProperties, // properties 13671cb0ef41Sopenharmony_ci "JSCreateLiteralObject", // name 13681cb0ef41Sopenharmony_ci 1, 1, 1, 1, 1, 2, // counts 13691cb0ef41Sopenharmony_ci parameters); // parameter 13701cb0ef41Sopenharmony_ci} 13711cb0ef41Sopenharmony_ci 13721cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::GetTemplateObject( 13731cb0ef41Sopenharmony_ci const TemplateObjectDescriptionRef& description, 13741cb0ef41Sopenharmony_ci const SharedFunctionInfoRef& shared, FeedbackSource const& feedback) { 13751cb0ef41Sopenharmony_ci GetTemplateObjectParameters parameters(description, shared, feedback); 13761cb0ef41Sopenharmony_ci return zone()->New<Operator1<GetTemplateObjectParameters>>( // -- 13771cb0ef41Sopenharmony_ci IrOpcode::kJSGetTemplateObject, // opcode 13781cb0ef41Sopenharmony_ci Operator::kEliminatable, // properties 13791cb0ef41Sopenharmony_ci "JSGetTemplateObject", // name 13801cb0ef41Sopenharmony_ci 1, 1, 1, 1, 1, 0, // counts 13811cb0ef41Sopenharmony_ci parameters); // parameter 13821cb0ef41Sopenharmony_ci} 13831cb0ef41Sopenharmony_ci 13841cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::CloneObject(FeedbackSource const& feedback, 13851cb0ef41Sopenharmony_ci int literal_flags) { 13861cb0ef41Sopenharmony_ci CloneObjectParameters parameters(feedback, literal_flags); 13871cb0ef41Sopenharmony_ci return zone()->New<Operator1<CloneObjectParameters>>( // -- 13881cb0ef41Sopenharmony_ci IrOpcode::kJSCloneObject, // opcode 13891cb0ef41Sopenharmony_ci Operator::kNoProperties, // properties 13901cb0ef41Sopenharmony_ci "JSCloneObject", // name 13911cb0ef41Sopenharmony_ci 2, 1, 1, 1, 1, 2, // counts 13921cb0ef41Sopenharmony_ci parameters); // parameter 13931cb0ef41Sopenharmony_ci} 13941cb0ef41Sopenharmony_ci 13951cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::StackCheck(StackCheckKind kind) { 13961cb0ef41Sopenharmony_ci return zone()->New<Operator1<StackCheckKind>>( // -- 13971cb0ef41Sopenharmony_ci IrOpcode::kJSStackCheck, // opcode 13981cb0ef41Sopenharmony_ci Operator::kNoWrite, // properties 13991cb0ef41Sopenharmony_ci "JSStackCheck", // name 14001cb0ef41Sopenharmony_ci 0, 1, 1, 0, 1, 2, // counts 14011cb0ef41Sopenharmony_ci kind); // parameter 14021cb0ef41Sopenharmony_ci} 14031cb0ef41Sopenharmony_ci 14041cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::CreateEmptyLiteralObject() { 14051cb0ef41Sopenharmony_ci return zone()->New<Operator>( // -- 14061cb0ef41Sopenharmony_ci IrOpcode::kJSCreateEmptyLiteralObject, // opcode 14071cb0ef41Sopenharmony_ci Operator::kNoProperties, // properties 14081cb0ef41Sopenharmony_ci "JSCreateEmptyLiteralObject", // name 14091cb0ef41Sopenharmony_ci 0, 1, 1, 1, 1, 2); // counts 14101cb0ef41Sopenharmony_ci} 14111cb0ef41Sopenharmony_ci 14121cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::CreateLiteralRegExp( 14131cb0ef41Sopenharmony_ci const StringRef& constant_pattern, FeedbackSource const& feedback, 14141cb0ef41Sopenharmony_ci int literal_flags) { 14151cb0ef41Sopenharmony_ci CreateLiteralParameters parameters(constant_pattern, feedback, -1, 14161cb0ef41Sopenharmony_ci literal_flags); 14171cb0ef41Sopenharmony_ci return zone()->New<Operator1<CreateLiteralParameters>>( // -- 14181cb0ef41Sopenharmony_ci IrOpcode::kJSCreateLiteralRegExp, // opcode 14191cb0ef41Sopenharmony_ci Operator::kNoProperties, // properties 14201cb0ef41Sopenharmony_ci "JSCreateLiteralRegExp", // name 14211cb0ef41Sopenharmony_ci 1, 1, 1, 1, 1, 2, // counts 14221cb0ef41Sopenharmony_ci parameters); // parameter 14231cb0ef41Sopenharmony_ci} 14241cb0ef41Sopenharmony_ci 14251cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::CreateFunctionContext( 14261cb0ef41Sopenharmony_ci const ScopeInfoRef& scope_info, int slot_count, ScopeType scope_type) { 14271cb0ef41Sopenharmony_ci CreateFunctionContextParameters parameters(scope_info, slot_count, 14281cb0ef41Sopenharmony_ci scope_type); 14291cb0ef41Sopenharmony_ci return zone()->New<Operator1<CreateFunctionContextParameters>>( // -- 14301cb0ef41Sopenharmony_ci IrOpcode::kJSCreateFunctionContext, Operator::kNoProperties, // opcode 14311cb0ef41Sopenharmony_ci "JSCreateFunctionContext", // name 14321cb0ef41Sopenharmony_ci 0, 1, 1, 1, 1, 2, // counts 14331cb0ef41Sopenharmony_ci parameters); // parameter 14341cb0ef41Sopenharmony_ci} 14351cb0ef41Sopenharmony_ci 14361cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::CreateCatchContext( 14371cb0ef41Sopenharmony_ci const ScopeInfoRef& scope_info) { 14381cb0ef41Sopenharmony_ci return zone()->New<Operator1<ScopeInfoTinyRef>>( 14391cb0ef41Sopenharmony_ci IrOpcode::kJSCreateCatchContext, Operator::kNoProperties, // opcode 14401cb0ef41Sopenharmony_ci "JSCreateCatchContext", // name 14411cb0ef41Sopenharmony_ci 1, 1, 1, 1, 1, 2, // counts 14421cb0ef41Sopenharmony_ci ScopeInfoTinyRef{scope_info}); // parameter 14431cb0ef41Sopenharmony_ci} 14441cb0ef41Sopenharmony_ci 14451cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::CreateWithContext( 14461cb0ef41Sopenharmony_ci const ScopeInfoRef& scope_info) { 14471cb0ef41Sopenharmony_ci return zone()->New<Operator1<ScopeInfoTinyRef>>( 14481cb0ef41Sopenharmony_ci IrOpcode::kJSCreateWithContext, Operator::kNoProperties, // opcode 14491cb0ef41Sopenharmony_ci "JSCreateWithContext", // name 14501cb0ef41Sopenharmony_ci 1, 1, 1, 1, 1, 2, // counts 14511cb0ef41Sopenharmony_ci ScopeInfoTinyRef{scope_info}); // parameter 14521cb0ef41Sopenharmony_ci} 14531cb0ef41Sopenharmony_ci 14541cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::CreateBlockContext( 14551cb0ef41Sopenharmony_ci const ScopeInfoRef& scope_info) { 14561cb0ef41Sopenharmony_ci return zone()->New<Operator1<ScopeInfoTinyRef>>( // -- 14571cb0ef41Sopenharmony_ci IrOpcode::kJSCreateBlockContext, Operator::kNoProperties, // opcode 14581cb0ef41Sopenharmony_ci "JSCreateBlockContext", // name 14591cb0ef41Sopenharmony_ci 0, 1, 1, 1, 1, 2, // counts 14601cb0ef41Sopenharmony_ci ScopeInfoTinyRef{scope_info}); // parameter 14611cb0ef41Sopenharmony_ci} 14621cb0ef41Sopenharmony_ci 14631cb0ef41Sopenharmony_ciScopeInfoRef ScopeInfoOf(JSHeapBroker* broker, const Operator* op) { 14641cb0ef41Sopenharmony_ci DCHECK(IrOpcode::kJSCreateBlockContext == op->opcode() || 14651cb0ef41Sopenharmony_ci IrOpcode::kJSCreateWithContext == op->opcode() || 14661cb0ef41Sopenharmony_ci IrOpcode::kJSCreateCatchContext == op->opcode()); 14671cb0ef41Sopenharmony_ci return OpParameter<ScopeInfoTinyRef>(op).AsRef(broker); 14681cb0ef41Sopenharmony_ci} 14691cb0ef41Sopenharmony_ci 14701cb0ef41Sopenharmony_cibool operator==(ScopeInfoTinyRef const& lhs, ScopeInfoTinyRef const& rhs) { 14711cb0ef41Sopenharmony_ci return lhs.object().location() == rhs.object().location(); 14721cb0ef41Sopenharmony_ci} 14731cb0ef41Sopenharmony_ci 14741cb0ef41Sopenharmony_cibool operator!=(ScopeInfoTinyRef const& lhs, ScopeInfoTinyRef const& rhs) { 14751cb0ef41Sopenharmony_ci return !(lhs == rhs); 14761cb0ef41Sopenharmony_ci} 14771cb0ef41Sopenharmony_ci 14781cb0ef41Sopenharmony_cisize_t hash_value(ScopeInfoTinyRef const& ref) { 14791cb0ef41Sopenharmony_ci return reinterpret_cast<size_t>(ref.object().location()); 14801cb0ef41Sopenharmony_ci} 14811cb0ef41Sopenharmony_ci 14821cb0ef41Sopenharmony_cistd::ostream& operator<<(std::ostream& os, ScopeInfoTinyRef const& ref) { 14831cb0ef41Sopenharmony_ci return os << Brief(*ref.object()); 14841cb0ef41Sopenharmony_ci} 14851cb0ef41Sopenharmony_ci 14861cb0ef41Sopenharmony_ci#undef CACHED_OP_LIST 14871cb0ef41Sopenharmony_ci 14881cb0ef41Sopenharmony_ci} // namespace compiler 14891cb0ef41Sopenharmony_ci} // namespace internal 14901cb0ef41Sopenharmony_ci} // namespace v8 1491