| Index: src/compiler/frame-states.h
|
| diff --git a/src/compiler/frame-states.h b/src/compiler/frame-states.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..ee98c06ffeb5922a79f78d31eb2f4e078b0fcde1
|
| --- /dev/null
|
| +++ b/src/compiler/frame-states.h
|
| @@ -0,0 +1,116 @@
|
| +// Copyright 2015 the V8 project authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#ifndef V8_COMPILER_FRAME_STATES_H_
|
| +#define V8_COMPILER_FRAME_STATES_H_
|
| +
|
| +#include "src/handles-inl.h" // TODO(everyone): Fix our inl.h crap
|
| +#include "src/objects-inl.h" // TODO(everyone): Fix our inl.h crap
|
| +#include "src/utils.h"
|
| +
|
| +namespace v8 {
|
| +namespace internal {
|
| +namespace compiler {
|
| +
|
| +// Flag that describes how to combine the current environment with
|
| +// the output of a node to obtain a framestate for lazy bailout.
|
| +class OutputFrameStateCombine {
|
| + public:
|
| + enum Kind {
|
| + kPushOutput, // Push the output on the expression stack.
|
| + kPokeAt // Poke at the given environment location,
|
| + // counting from the top of the stack.
|
| + };
|
| +
|
| + static OutputFrameStateCombine Ignore() {
|
| + return OutputFrameStateCombine(kPushOutput, 0);
|
| + }
|
| + static OutputFrameStateCombine Push(size_t count = 1) {
|
| + return OutputFrameStateCombine(kPushOutput, count);
|
| + }
|
| + static OutputFrameStateCombine PokeAt(size_t index) {
|
| + return OutputFrameStateCombine(kPokeAt, index);
|
| + }
|
| +
|
| + Kind kind() const { return kind_; }
|
| + size_t GetPushCount() const {
|
| + DCHECK_EQ(kPushOutput, kind());
|
| + return parameter_;
|
| + }
|
| + size_t GetOffsetToPokeAt() const {
|
| + DCHECK_EQ(kPokeAt, kind());
|
| + return parameter_;
|
| + }
|
| +
|
| + bool IsOutputIgnored() const {
|
| + return kind_ == kPushOutput && parameter_ == 0;
|
| + }
|
| +
|
| + size_t ConsumedOutputCount() const {
|
| + return kind_ == kPushOutput ? GetPushCount() : 1;
|
| + }
|
| +
|
| + bool operator==(OutputFrameStateCombine const& other) const {
|
| + return kind_ == other.kind_ && parameter_ == other.parameter_;
|
| + }
|
| + bool operator!=(OutputFrameStateCombine const& other) const {
|
| + return !(*this == other);
|
| + }
|
| +
|
| + friend size_t hash_value(OutputFrameStateCombine const&);
|
| + friend std::ostream& operator<<(std::ostream&,
|
| + OutputFrameStateCombine const&);
|
| +
|
| + private:
|
| + OutputFrameStateCombine(Kind kind, size_t parameter)
|
| + : kind_(kind), parameter_(parameter) {}
|
| +
|
| + Kind const kind_;
|
| + size_t const parameter_;
|
| +};
|
| +
|
| +
|
| +// The type of stack frame that a FrameState node represents.
|
| +enum FrameStateType {
|
| + JS_FRAME, // Represents an unoptimized JavaScriptFrame.
|
| + ARGUMENTS_ADAPTOR // Represents an ArgumentsAdaptorFrame.
|
| +};
|
| +
|
| +
|
| +class FrameStateCallInfo final {
|
| + public:
|
| + FrameStateCallInfo(
|
| + FrameStateType type, BailoutId bailout_id,
|
| + OutputFrameStateCombine state_combine,
|
| + MaybeHandle<JSFunction> jsfunction = MaybeHandle<JSFunction>())
|
| + : type_(type),
|
| + bailout_id_(bailout_id),
|
| + frame_state_combine_(state_combine),
|
| + jsfunction_(jsfunction) {}
|
| +
|
| + FrameStateType type() const { return type_; }
|
| + BailoutId bailout_id() const { return bailout_id_; }
|
| + OutputFrameStateCombine state_combine() const { return frame_state_combine_; }
|
| + MaybeHandle<JSFunction> jsfunction() const { return jsfunction_; }
|
| +
|
| + private:
|
| + FrameStateType type_;
|
| + BailoutId bailout_id_;
|
| + OutputFrameStateCombine frame_state_combine_;
|
| + MaybeHandle<JSFunction> jsfunction_;
|
| +};
|
| +
|
| +bool operator==(FrameStateCallInfo const&, FrameStateCallInfo const&);
|
| +bool operator!=(FrameStateCallInfo const&, FrameStateCallInfo const&);
|
| +
|
| +size_t hash_value(FrameStateCallInfo const&);
|
| +
|
| +std::ostream& operator<<(std::ostream&, FrameStateCallInfo const&);
|
| +
|
| +
|
| +} // namespace compiler
|
| +} // namespace internal
|
| +} // namespace v8
|
| +
|
| +#endif // V8_COMPILER_FRAME_STATES_H_
|
|
|