#include "src/interpreter/bytecode-generator.h"
#include <map>
#include <optional>
#include <unordered_map>
#include <unordered_set>
#include "include/v8-extension.h"
#include "src/api/api-inl.h"
#include "src/ast/ast-source-ranges.h"
#include "src/ast/ast.h"
#include "src/ast/scopes.h"
#include "src/builtins/builtins-constructor.h"
#include "src/codegen/compiler.h"
#include "src/codegen/unoptimized-compilation-info.h"
#include "src/common/globals.h"
#include "src/compiler-dispatcher/lazy-compile-dispatcher.h"
#include "src/heap/parked-scope.h"
#include "src/interpreter/bytecode-array-builder.h"
#include "src/interpreter/bytecode-flags-and-tokens.h"
#include "src/interpreter/bytecode-jump-table.h"
#include "src/interpreter/bytecode-label.h"
#include "src/interpreter/bytecode-register-allocator.h"
#include "src/interpreter/bytecode-register-optimizer.h"
#include "src/interpreter/bytecode-register.h"
#include "src/interpreter/control-flow-builders.h"
#include "src/logging/local-logger.h"
#include "src/logging/log.h"
#include "src/numbers/conversions.h"
#include "src/objects/debug-objects.h"
#include "src/objects/js-disposable-stack.h"
#include "src/objects/objects.h"
#include "src/objects/smi.h"
#include "src/objects/template-objects.h"
#include "src/parsing/parse-info.h"
#include "src/parsing/token.h"
#include "src/utils/ostreams.h"
namespace v8 {
namespace internal {
namespace interpreter {
class V8_NODISCARD BytecodeGenerator::ContextScope { … };
class V8_NODISCARD BytecodeGenerator::ControlScope { … };
class V8_NODISCARD BytecodeGenerator::ControlScope::DeferredCommands final { … };
class BytecodeGenerator::ControlScopeForTopLevel final
: public BytecodeGenerator::ControlScope { … };
class BytecodeGenerator::ControlScopeForBreakable final
: public BytecodeGenerator::ControlScope { … };
class BytecodeGenerator::ControlScopeForIteration final
: public BytecodeGenerator::ControlScope { … };
class BytecodeGenerator::ControlScopeForTryCatch final
: public BytecodeGenerator::ControlScope { … };
class BytecodeGenerator::ControlScopeForTryFinally final
: public BytecodeGenerator::ControlScope { … };
class BytecodeGenerator::ControlScopeForDerivedConstructor final
: public BytecodeGenerator::ControlScope { … };
class BytecodeGenerator::NaryCodeCoverageSlots { … };
void BytecodeGenerator::ControlScope::PerformCommand(Command command,
Statement* statement,
int source_position) { … }
void BytecodeGenerator::ControlScope::PopContextToExpectedDepth() { … }
class V8_NODISCARD BytecodeGenerator::RegisterAllocationScope final { … };
class V8_NODISCARD BytecodeGenerator::AccumulatorPreservingScope final { … };
class V8_NODISCARD BytecodeGenerator::ExpressionResultScope { … };
class BytecodeGenerator::EffectResultScope final
: public ExpressionResultScope { … };
class V8_NODISCARD BytecodeGenerator::ValueResultScope final
: public ExpressionResultScope { … };
class V8_NODISCARD BytecodeGenerator::TestResultScope final
: public ExpressionResultScope { … };
class BytecodeGenerator::TopLevelDeclarationsBuilder final : public ZoneObject { … };
class V8_NODISCARD BytecodeGenerator::CurrentScope final { … };
class V8_NODISCARD BytecodeGenerator::MultipleEntryBlockContextScope { … };
class BytecodeGenerator::FeedbackSlotCache : public ZoneObject { … };
class V8_NODISCARD BytecodeGenerator::HoleCheckElisionScope { … };
class V8_NODISCARD BytecodeGenerator::HoleCheckElisionMergeScope final { … };
class BytecodeGenerator::IteratorRecord final { … };
class V8_NODISCARD BytecodeGenerator::OptionalChainNullLabelScope final { … };
class V8_NODISCARD BytecodeGenerator::LoopScope final { … };
class V8_NODISCARD BytecodeGenerator::ForInScope final { … };
class V8_NODISCARD BytecodeGenerator::DisposablesStackScope final { … };
namespace {
template <typename PropertyT>
struct Accessors : public ZoneObject { … };
template <typename PropertyT>
class AccessorTable
: public base::TemplateHashMap<Literal, Accessors<PropertyT>,
bool (*)(void*, void*),
ZoneAllocationPolicy> { … };
}
#ifdef DEBUG
static bool IsInEagerLiterals(
FunctionLiteral* literal,
const std::vector<FunctionLiteral*>& eager_literals) { … }
#endif
BytecodeGenerator::BytecodeGenerator(
LocalIsolate* local_isolate, Zone* compile_zone,
UnoptimizedCompilationInfo* info,
const AstStringConstants* ast_string_constants,
std::vector<FunctionLiteral*>* eager_inner_literals, Handle<Script> script)
: … { … }
namespace {
template <typename Isolate>
struct NullContextScopeHelper;
template <>
struct NullContextScopeHelper<Isolate> { … };
template <>
struct NullContextScopeHelper<LocalIsolate> { … };
NullContextScopeFor;
}
template <typename IsolateT>
Handle<BytecodeArray> BytecodeGenerator::FinalizeBytecode(
IsolateT* isolate, Handle<Script> script) { … }
template Handle<BytecodeArray> BytecodeGenerator::FinalizeBytecode(
Isolate* isolate, Handle<Script> script);
template Handle<BytecodeArray> BytecodeGenerator::FinalizeBytecode(
LocalIsolate* isolate, Handle<Script> script);
template <typename IsolateT>
Handle<TrustedByteArray> BytecodeGenerator::FinalizeSourcePositionTable(
IsolateT* isolate) { … }
template Handle<TrustedByteArray>
BytecodeGenerator::FinalizeSourcePositionTable(Isolate* isolate);
template Handle<TrustedByteArray>
BytecodeGenerator::FinalizeSourcePositionTable(LocalIsolate* isolate);
#ifdef DEBUG
int BytecodeGenerator::CheckBytecodeMatches(Tagged<BytecodeArray> bytecode) { … }
#endif
template <typename IsolateT>
void BytecodeGenerator::AllocateDeferredConstants(IsolateT* isolate,
Handle<Script> script) { … }
template void BytecodeGenerator::AllocateDeferredConstants(
Isolate* isolate, Handle<Script> script);
template void BytecodeGenerator::AllocateDeferredConstants(
LocalIsolate* isolate, Handle<Script> script);
namespace {
bool NeedsContextInitialization(DeclarationScope* scope) { … }
}
void BytecodeGenerator::GenerateBytecode(uintptr_t stack_limit) { … }
void BytecodeGenerator::GenerateBytecodeBody() { … }
void BytecodeGenerator::GenerateBodyPrologue() { … }
void BytecodeGenerator::GenerateBaseConstructorBody() { … }
void BytecodeGenerator::GenerateDerivedConstructorBody() { … }
void BytecodeGenerator::GenerateAsyncFunctionBody() { … }
void BytecodeGenerator::GenerateBodyStatements() { … }
void BytecodeGenerator::GenerateBodyStatementsWithoutImplicitFinalReturn() { … }
void BytecodeGenerator::AllocateTopLevelRegisters() { … }
void BytecodeGenerator::BuildGeneratorPrologue() { … }
void BytecodeGenerator::VisitBlock(Block* stmt) { … }
void BytecodeGenerator::VisitBlockMaybeDispose(Block* stmt) { … }
void BytecodeGenerator::VisitBlockDeclarationsAndStatements(Block* stmt) { … }
void BytecodeGenerator::VisitVariableDeclaration(VariableDeclaration* decl) { … }
void BytecodeGenerator::VisitFunctionDeclaration(FunctionDeclaration* decl) { … }
void BytecodeGenerator::VisitModuleNamespaceImports() { … }
void BytecodeGenerator::BuildDeclareCall(Runtime::FunctionId id) { … }
void BytecodeGenerator::VisitModuleDeclarations(Declaration::List* decls) { … }
void BytecodeGenerator::VisitGlobalDeclarations(Declaration::List* decls) { … }
void BytecodeGenerator::VisitDeclarations(Declaration::List* declarations) { … }
void BytecodeGenerator::VisitStatements(
const ZonePtrList<Statement>* statements) { … }
void BytecodeGenerator::VisitExpressionStatement(ExpressionStatement* stmt) { … }
void BytecodeGenerator::VisitEmptyStatement(EmptyStatement* stmt) { … }
void BytecodeGenerator::VisitIfStatement(IfStatement* stmt) { … }
void BytecodeGenerator::VisitSloppyBlockFunctionStatement(
SloppyBlockFunctionStatement* stmt) { … }
void BytecodeGenerator::VisitContinueStatement(ContinueStatement* stmt) { … }
void BytecodeGenerator::VisitBreakStatement(BreakStatement* stmt) { … }
void BytecodeGenerator::VisitReturnStatement(ReturnStatement* stmt) { … }
void BytecodeGenerator::VisitWithStatement(WithStatement* stmt) { … }
namespace {
bool IsSmiLiteralSwitchCaseValue(Expression* expr) { … }
inline int ReduceToSmiSwitchCaseValue(Expression* expr) { … }
inline bool IsSpreadAcceptable(int spread, int ncases) { … }
struct SwitchInfo { … };
bool IsSwitchOptimizable(SwitchStatement* stmt, SwitchInfo* info) { … }
}
void BytecodeGenerator::VisitSwitchStatement(SwitchStatement* stmt) { … }
template <typename TryBodyFunc, typename CatchBodyFunc>
void BytecodeGenerator::BuildTryCatch(
TryBodyFunc try_body_func, CatchBodyFunc catch_body_func,
HandlerTable::CatchPrediction catch_prediction,
TryCatchStatement* stmt_for_coverage) { … }
template <typename TryBodyFunc, typename FinallyBodyFunc>
void BytecodeGenerator::BuildTryFinally(
TryBodyFunc try_body_func, FinallyBodyFunc finally_body_func,
HandlerTable::CatchPrediction catch_prediction,
TryFinallyStatement* stmt_for_coverage) { … }
template <typename WrappedFunc>
void BytecodeGenerator::BuildDisposeScope(WrappedFunc wrapped_func,
bool has_await_using) { … }
void BytecodeGenerator::VisitIterationBody(IterationStatement* stmt,
LoopBuilder* loop_builder) { … }
void BytecodeGenerator::VisitIterationBodyInHoleCheckElisionScope(
IterationStatement* stmt, LoopBuilder* loop_builder) { … }
void BytecodeGenerator::VisitDoWhileStatement(DoWhileStatement* stmt) { … }
void BytecodeGenerator::VisitWhileStatement(WhileStatement* stmt) { … }
void BytecodeGenerator::VisitForStatement(ForStatement* stmt) { … }
void BytecodeGenerator::VisitForInStatement(ForInStatement* stmt) { … }
void BytecodeGenerator::VisitForOfStatement(ForOfStatement* stmt) { … }
void BytecodeGenerator::VisitTryCatchStatement(TryCatchStatement* stmt) { … }
void BytecodeGenerator::VisitTryFinallyStatement(TryFinallyStatement* stmt) { … }
void BytecodeGenerator::VisitDebuggerStatement(DebuggerStatement* stmt) { … }
void BytecodeGenerator::VisitFunctionLiteral(FunctionLiteral* expr) { … }
void BytecodeGenerator::AddToEagerLiteralsIfEager(FunctionLiteral* literal) { … }
void BytecodeGenerator::BuildClassLiteral(ClassLiteral* expr, Register name) { … }
void BytecodeGenerator::VisitClassLiteral(ClassLiteral* expr) { … }
void BytecodeGenerator::VisitClassLiteral(ClassLiteral* expr, Register name) { … }
void BytecodeGenerator::BuildClassProperty(ClassLiteral::Property* property) { … }
void BytecodeGenerator::VisitInitializeClassMembersStatement(
InitializeClassMembersStatement* stmt) { … }
void BytecodeGenerator::VisitInitializeClassStaticElementsStatement(
InitializeClassStaticElementsStatement* stmt) { … }
void BytecodeGenerator::VisitAutoAccessorGetterBody(
AutoAccessorGetterBody* stmt) { … }
void BytecodeGenerator::VisitAutoAccessorSetterBody(
AutoAccessorSetterBody* stmt) { … }
void BytecodeGenerator::BuildInvalidPropertyAccess(MessageTemplate tmpl,
Property* property) { … }
void BytecodeGenerator::BuildPrivateBrandInitialization(Register receiver,
Variable* brand) { … }
void BytecodeGenerator::BuildInstanceMemberInitialization(Register constructor,
Register instance) { … }
void BytecodeGenerator::VisitNativeFunctionLiteral(
NativeFunctionLiteral* expr) { … }
void BytecodeGenerator::VisitConditionalChain(ConditionalChain* expr) { … }
void BytecodeGenerator::VisitConditional(Conditional* expr) { … }
void BytecodeGenerator::VisitLiteral(Literal* expr) { … }
void BytecodeGenerator::VisitRegExpLiteral(RegExpLiteral* expr) { … }
void BytecodeGenerator::BuildCreateObjectLiteral(Register literal,
uint8_t flags, size_t entry) { … }
void BytecodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { … }
void BytecodeGenerator::BuildFillArrayWithIterator(
IteratorRecord iterator, Register array, Register index, Register value,
FeedbackSlot next_value_slot, FeedbackSlot next_done_slot,
FeedbackSlot index_slot, FeedbackSlot element_slot) { … }
void BytecodeGenerator::BuildCreateArrayLiteral(
const ZonePtrList<Expression>* elements, ArrayLiteral* expr) { … }
void BytecodeGenerator::VisitArrayLiteral(ArrayLiteral* expr) { … }
void BytecodeGenerator::VisitVariableProxy(VariableProxy* proxy) { … }
bool BytecodeGenerator::IsVariableInRegister(Variable* var, Register reg) { … }
void BytecodeGenerator::SetVariableInRegister(Variable* var, Register reg) { … }
Variable* BytecodeGenerator::GetPotentialVariableInAccumulator() { … }
void BytecodeGenerator::BuildVariableLoad(Variable* variable,
HoleCheckMode hole_check_mode,
TypeofMode typeof_mode) { … }
void BytecodeGenerator::BuildVariableLoadForAccumulatorValue(
Variable* variable, HoleCheckMode hole_check_mode, TypeofMode typeof_mode) { … }
void BytecodeGenerator::BuildReturn(int source_position) { … }
void BytecodeGenerator::BuildAsyncReturn(int source_position) { … }
void BytecodeGenerator::BuildReThrow() { … }
void BytecodeGenerator::RememberHoleCheckInCurrentBlock(Variable* variable) { … }
void BytecodeGenerator::BuildThrowIfHole(Variable* variable) { … }
bool BytecodeGenerator::VariableNeedsHoleCheckInCurrentBlock(
Variable* variable, HoleCheckMode hole_check_mode) { … }
bool BytecodeGenerator::VariableNeedsHoleCheckInCurrentBlockForAssignment(
Variable* variable, Token::Value op, HoleCheckMode hole_check_mode) { … }
void BytecodeGenerator::BuildHoleCheckForVariableAssignment(Variable* variable,
Token::Value op) { … }
void BytecodeGenerator::BuildVariableAssignment(
Variable* variable, Token::Value op, HoleCheckMode hole_check_mode,
LookupHoistingMode lookup_hoisting_mode) { … }
void BytecodeGenerator::BuildLoadNamedProperty(const Expression* object_expr,
Register object,
const AstRawString* name) { … }
void BytecodeGenerator::BuildSetNamedProperty(const Expression* object_expr,
Register object,
const AstRawString* name) { … }
void BytecodeGenerator::BuildStoreGlobal(Variable* variable) { … }
void BytecodeGenerator::BuildLoadKeyedProperty(Register object,
FeedbackSlot slot) { … }
BytecodeGenerator::AssignmentLhsData
BytecodeGenerator::AssignmentLhsData::NonProperty(Expression* expr) { … }
BytecodeGenerator::AssignmentLhsData
BytecodeGenerator::AssignmentLhsData::NamedProperty(Expression* object_expr,
Register object,
const AstRawString* name) { … }
BytecodeGenerator::AssignmentLhsData
BytecodeGenerator::AssignmentLhsData::KeyedProperty(Register object,
Register key) { … }
BytecodeGenerator::AssignmentLhsData
BytecodeGenerator::AssignmentLhsData::NamedSuperProperty(
RegisterList super_property_args) { … }
BytecodeGenerator::AssignmentLhsData
BytecodeGenerator::AssignmentLhsData::PrivateMethodOrAccessor(
AssignType type, Property* property, Register object, Register key) { … }
BytecodeGenerator::AssignmentLhsData
BytecodeGenerator::AssignmentLhsData::PrivateDebugEvaluate(AssignType type,
Property* property,
Register object) { … }
BytecodeGenerator::AssignmentLhsData
BytecodeGenerator::AssignmentLhsData::KeyedSuperProperty(
RegisterList super_property_args) { … }
BytecodeGenerator::AssignmentLhsData BytecodeGenerator::PrepareAssignmentLhs(
Expression* lhs, AccumulatorPreservingMode accumulator_preserving_mode) { … }
void BytecodeGenerator::BuildFinalizeIteration(
IteratorRecord iterator, Register done,
Register iteration_continuation_token) { … }
Expression* BytecodeGenerator::GetDestructuringDefaultValue(
Expression** target) { … }
void BytecodeGenerator::BuildDestructuringArrayAssignment(
ArrayLiteral* pattern, Token::Value op,
LookupHoistingMode lookup_hoisting_mode) { … }
void BytecodeGenerator::BuildDestructuringObjectAssignment(
ObjectLiteral* pattern, Token::Value op,
LookupHoistingMode lookup_hoisting_mode) { … }
void BytecodeGenerator::BuildAssignment(
const AssignmentLhsData& lhs_data, Token::Value op,
LookupHoistingMode lookup_hoisting_mode) { … }
void BytecodeGenerator::VisitAssignment(Assignment* expr) { … }
void BytecodeGenerator::VisitCompoundAssignment(CompoundAssignment* expr) { … }
void BytecodeGenerator::BuildSuspendPoint(int position) { … }
void BytecodeGenerator::VisitYield(Yield* expr) { … }
void BytecodeGenerator::VisitYieldStar(YieldStar* expr) { … }
void BytecodeGenerator::BuildAwait(int position) { … }
void BytecodeGenerator::VisitAwait(Await* expr) { … }
void BytecodeGenerator::VisitThrow(Throw* expr) { … }
void BytecodeGenerator::VisitPropertyLoad(Register obj, Property* property) { … }
void BytecodeGenerator::BuildPrivateDebugDynamicGet(Property* property,
Register obj) { … }
void BytecodeGenerator::BuildPrivateDebugDynamicSet(Property* property,
Register obj,
Register value) { … }
void BytecodeGenerator::BuildPrivateGetterAccess(Register object,
Register accessor_pair) { … }
void BytecodeGenerator::BuildPrivateSetterAccess(Register object,
Register accessor_pair,
Register value) { … }
void BytecodeGenerator::BuildPrivateMethodIn(Variable* private_name,
Expression* object_expression) { … }
void BytecodeGenerator::BuildPrivateBrandCheck(Property* property,
Register object) { … }
void BytecodeGenerator::VisitPropertyLoadForRegister(Register obj,
Property* expr,
Register destination) { … }
void BytecodeGenerator::VisitNamedSuperPropertyLoad(Property* property,
Register opt_receiver_out) { … }
void BytecodeGenerator::VisitKeyedSuperPropertyLoad(Property* property,
Register opt_receiver_out) { … }
template <typename ExpressionFunc>
void BytecodeGenerator::BuildOptionalChain(ExpressionFunc expression_func) { … }
void BytecodeGenerator::VisitOptionalChain(OptionalChain* expr) { … }
void BytecodeGenerator::VisitProperty(Property* expr) { … }
void BytecodeGenerator::VisitArguments(const ZonePtrList<Expression>* args,
RegisterList* arg_regs) { … }
void BytecodeGenerator::VisitCall(Call* expr) { … }
void BytecodeGenerator::VisitCallSuper(Call* expr) { … }
void BytecodeGenerator::BuildInstanceInitializationAfterSuperCall(
Register this_function, Register instance) { … }
void BytecodeGenerator::BuildGetAndCheckSuperConstructor(
Register this_function, Register new_target, Register constructor,
BytecodeLabel* super_ctor_call_done) { … }
void BytecodeGenerator::BuildSuperCallOptimization(
Register this_function, Register new_target,
Register constructor_then_instance, BytecodeLabel* super_ctor_call_done) { … }
void BytecodeGenerator::VisitCallNew(CallNew* expr) { … }
void BytecodeGenerator::VisitSuperCallForwardArgs(SuperCallForwardArgs* expr) { … }
void BytecodeGenerator::VisitCallRuntime(CallRuntime* expr) { … }
void BytecodeGenerator::VisitVoid(UnaryOperation* expr) { … }
void BytecodeGenerator::VisitForTypeOfValue(Expression* expr) { … }
void BytecodeGenerator::VisitTypeOf(UnaryOperation* expr) { … }
void BytecodeGenerator::VisitNot(UnaryOperation* expr) { … }
void BytecodeGenerator::VisitUnaryOperation(UnaryOperation* expr) { … }
void BytecodeGenerator::VisitDelete(UnaryOperation* unary) { … }
void BytecodeGenerator::VisitCountOperation(CountOperation* expr) { … }
void BytecodeGenerator::VisitBinaryOperation(BinaryOperation* binop) { … }
void BytecodeGenerator::VisitNaryOperation(NaryOperation* expr) { … }
void BytecodeGenerator::BuildLiteralCompareNil(
Token::Value op, BytecodeArrayBuilder::NilValue nil) { … }
void BytecodeGenerator::BuildLiteralStrictCompareBoolean(Literal* literal) { … }
bool BytecodeGenerator::IsLocalVariableWithInternalizedStringHint(
Expression* expr) { … }
static bool IsTypeof(Expression* expr) { … }
static bool IsCharU(const AstRawString* str) { … }
static bool IsLiteralCompareTypeof(CompareOperation* expr,
Expression** sub_expr,
TestTypeOfFlags::LiteralFlag* flag,
const AstStringConstants* ast_constants) { … }
void BytecodeGenerator::VisitCompareOperation(CompareOperation* expr) { … }
void BytecodeGenerator::VisitArithmeticExpression(BinaryOperation* expr) { … }
void BytecodeGenerator::VisitNaryArithmeticExpression(NaryOperation* expr) { … }
void BytecodeGenerator::VisitSpread(Spread* expr) { … }
void BytecodeGenerator::VisitEmptyParentheses(EmptyParentheses* expr) { … }
void BytecodeGenerator::VisitImportCallExpression(ImportCallExpression* expr) { … }
void BytecodeGenerator::BuildGetIterator(IteratorType hint) { … }
BytecodeGenerator::IteratorRecord BytecodeGenerator::BuildGetIteratorRecord(
Register next, Register object, IteratorType hint) { … }
BytecodeGenerator::IteratorRecord BytecodeGenerator::BuildGetIteratorRecord(
IteratorType hint) { … }
void BytecodeGenerator::BuildIteratorNext(const IteratorRecord& iterator,
Register next_result) { … }
void BytecodeGenerator::BuildCallIteratorMethod(Register iterator,
const AstRawString* method_name,
RegisterList receiver_and_args,
BytecodeLabel* if_called,
BytecodeLabels* if_notcalled) { … }
void BytecodeGenerator::BuildIteratorClose(const IteratorRecord& iterator,
Expression* expr) { … }
void BytecodeGenerator::VisitGetTemplateObject(GetTemplateObject* expr) { … }
void BytecodeGenerator::VisitTemplateLiteral(TemplateLiteral* expr) { … }
void BytecodeGenerator::BuildThisVariableLoad() { … }
void BytecodeGenerator::VisitThisExpression(ThisExpression* expr) { … }
void BytecodeGenerator::VisitSuperCallReference(SuperCallReference* expr) { … }
void BytecodeGenerator::VisitSuperPropertyReference(
SuperPropertyReference* expr) { … }
void BytecodeGenerator::VisitCommaExpression(BinaryOperation* binop) { … }
void BytecodeGenerator::VisitNaryCommaExpression(NaryOperation* expr) { … }
void BytecodeGenerator::VisitLogicalTestSubExpression(
Token::Value token, Expression* expr, BytecodeLabels* then_labels,
BytecodeLabels* else_labels, int coverage_slot) { … }
void BytecodeGenerator::VisitLogicalTest(Token::Value token, Expression* left,
Expression* right,
int right_coverage_slot) { … }
void BytecodeGenerator::VisitNaryLogicalTest(
Token::Value token, NaryOperation* expr,
const NaryCodeCoverageSlots* coverage_slots) { … }
bool BytecodeGenerator::VisitLogicalOrSubExpression(Expression* expr,
BytecodeLabels* end_labels,
int coverage_slot) { … }
bool BytecodeGenerator::VisitLogicalAndSubExpression(Expression* expr,
BytecodeLabels* end_labels,
int coverage_slot) { … }
bool BytecodeGenerator::VisitNullishSubExpression(Expression* expr,
BytecodeLabels* end_labels,
int coverage_slot) { … }
void BytecodeGenerator::VisitLogicalOrExpression(BinaryOperation* binop) { … }
void BytecodeGenerator::VisitNaryLogicalOrExpression(NaryOperation* expr) { … }
void BytecodeGenerator::VisitLogicalAndExpression(BinaryOperation* binop) { … }
void BytecodeGenerator::VisitNaryLogicalAndExpression(NaryOperation* expr) { … }
void BytecodeGenerator::VisitNullishExpression(BinaryOperation* binop) { … }
void BytecodeGenerator::VisitNaryNullishExpression(NaryOperation* expr) { … }
void BytecodeGenerator::BuildNewLocalActivationContext() { … }
void BytecodeGenerator::BuildLocalActivationContextInitialization() { … }
void BytecodeGenerator::BuildNewLocalBlockContext(Scope* scope) { … }
void BytecodeGenerator::BuildNewLocalWithContext(Scope* scope) { … }
void BytecodeGenerator::BuildNewLocalCatchContext(Scope* scope) { … }
void BytecodeGenerator::VisitLiteralAccessor(LiteralProperty* property,
Register value_out) { … }
void BytecodeGenerator::VisitArgumentsObject(Variable* variable) { … }
void BytecodeGenerator::VisitRestArgumentsArray(Variable* rest) { … }
void BytecodeGenerator::VisitThisFunctionVariable(Variable* variable) { … }
void BytecodeGenerator::VisitNewTargetVariable(Variable* variable) { … }
void BytecodeGenerator::BuildGeneratorObjectVariableInitialization() { … }
void BytecodeGenerator::BuildPushUndefinedIntoRegisterList(
RegisterList* reg_list) { … }
void BytecodeGenerator::BuildLoadPropertyKey(LiteralProperty* property,
Register out_reg) { … }
int BytecodeGenerator::AllocateBlockCoverageSlotIfEnabled(
AstNode* node, SourceRangeKind kind) { … }
int BytecodeGenerator::AllocateNaryBlockCoverageSlotIfEnabled(
NaryOperation* node, size_t index) { … }
int BytecodeGenerator::AllocateConditionalChainBlockCoverageSlotIfEnabled(
ConditionalChain* node, SourceRangeKind kind, size_t index) { … }
void BytecodeGenerator::BuildIncrementBlockCoverageCounterIfEnabled(
AstNode* node, SourceRangeKind kind) { … }
void BytecodeGenerator::BuildIncrementBlockCoverageCounterIfEnabled(
int coverage_array_slot) { … }
BytecodeGenerator::TypeHint BytecodeGenerator::VisitForAccumulatorValue(
Expression* expr) { … }
void BytecodeGenerator::VisitForAccumulatorValueOrTheHole(Expression* expr) { … }
void BytecodeGenerator::VisitForEffect(Expression* expr) { … }
Register BytecodeGenerator::VisitForRegisterValue(Expression* expr) { … }
void BytecodeGenerator::VisitForRegisterValue(Expression* expr,
Register destination) { … }
void BytecodeGenerator::VisitAndPushIntoRegisterList(Expression* expr,
RegisterList* reg_list) { … }
void BytecodeGenerator::BuildTest(ToBooleanMode mode,
BytecodeLabels* then_labels,
BytecodeLabels* else_labels,
TestFallthrough fallthrough) { … }
void BytecodeGenerator::VisitForTest(Expression* expr,
BytecodeLabels* then_labels,
BytecodeLabels* else_labels,
TestFallthrough fallthrough) { … }
void BytecodeGenerator::VisitForNullishTest(Expression* expr,
BytecodeLabels* then_labels,
BytecodeLabels* test_next_labels,
BytecodeLabels* else_labels) { … }
void BytecodeGenerator::VisitInSameTestExecutionScope(Expression* expr) { … }
void BytecodeGenerator::VisitInScope(Statement* stmt, Scope* scope) { … }
template <typename T>
void BytecodeGenerator::VisitInHoleCheckElisionScope(T* node) { … }
BytecodeGenerator::TypeHint
BytecodeGenerator::VisitInHoleCheckElisionScopeForAccumulatorValue(
Expression* expr) { … }
Register BytecodeGenerator::GetRegisterForLocalVariable(Variable* variable) { … }
BytecodeGenerator::TypeHint BytecodeGenerator::GetTypeHintForLocalVariable(
Variable* variable) { … }
FunctionKind BytecodeGenerator::function_kind() const { … }
LanguageMode BytecodeGenerator::language_mode() const { … }
Register BytecodeGenerator::generator_object() const { … }
FeedbackVectorSpec* BytecodeGenerator::feedback_spec() { … }
int BytecodeGenerator::feedback_index(FeedbackSlot slot) const { … }
FeedbackSlot BytecodeGenerator::GetCachedLoadGlobalICSlot(
TypeofMode typeof_mode, Variable* variable) { … }
FeedbackSlot BytecodeGenerator::GetCachedStoreGlobalICSlot(
LanguageMode language_mode, Variable* variable) { … }
FeedbackSlot BytecodeGenerator::GetCachedLoadICSlot(const Expression* expr,
const AstRawString* name) { … }
FeedbackSlot BytecodeGenerator::GetCachedLoadSuperICSlot(
const AstRawString* name) { … }
FeedbackSlot BytecodeGenerator::GetCachedStoreICSlot(const Expression* expr,
const AstRawString* name) { … }
int BytecodeGenerator::GetCachedCreateClosureSlot(FunctionLiteral* literal) { … }
FeedbackSlot BytecodeGenerator::GetDummyCompareICSlot() { … }
}
}
}