summaryrefslogtreecommitdiffstats
path: root/src/3rdparty/v8/src/full-codegen.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/3rdparty/v8/src/full-codegen.h')
-rw-r--r--src/3rdparty/v8/src/full-codegen.h863
1 files changed, 0 insertions, 863 deletions
diff --git a/src/3rdparty/v8/src/full-codegen.h b/src/3rdparty/v8/src/full-codegen.h
deleted file mode 100644
index b9285c7..0000000
--- a/src/3rdparty/v8/src/full-codegen.h
+++ /dev/null
@@ -1,863 +0,0 @@
-// Copyright 2012 the V8 project authors. All rights reserved.
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following
-// disclaimer in the documentation and/or other materials provided
-// with the distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived
-// from this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#ifndef V8_FULL_CODEGEN_H_
-#define V8_FULL_CODEGEN_H_
-
-#include "v8.h"
-
-#include "allocation.h"
-#include "ast.h"
-#include "code-stubs.h"
-#include "codegen.h"
-#include "compiler.h"
-#include "data-flow.h"
-
-namespace v8 {
-namespace internal {
-
-// Forward declarations.
-class JumpPatchSite;
-
-// AST node visitor which can tell whether a given statement will be breakable
-// when the code is compiled by the full compiler in the debugger. This means
-// that there will be an IC (load/store/call) in the code generated for the
-// debugger to piggybag on.
-class BreakableStatementChecker: public AstVisitor {
- public:
- BreakableStatementChecker() : is_breakable_(false) {
- InitializeAstVisitor();
- }
-
- void Check(Statement* stmt);
- void Check(Expression* stmt);
-
- bool is_breakable() { return is_breakable_; }
-
- private:
- // AST node visit functions.
-#define DECLARE_VISIT(type) virtual void Visit##type(type* node);
- AST_NODE_LIST(DECLARE_VISIT)
-#undef DECLARE_VISIT
-
- bool is_breakable_;
-
- DEFINE_AST_VISITOR_SUBCLASS_MEMBERS();
- DISALLOW_COPY_AND_ASSIGN(BreakableStatementChecker);
-};
-
-
-// -----------------------------------------------------------------------------
-// Full code generator.
-
-class FullCodeGenerator: public AstVisitor {
- public:
- enum State {
- NO_REGISTERS,
- TOS_REG
- };
-
- FullCodeGenerator(MacroAssembler* masm, CompilationInfo* info)
- : masm_(masm),
- info_(info),
- scope_(info->scope()),
- nesting_stack_(NULL),
- loop_depth_(0),
- globals_(NULL),
- context_(NULL),
- bailout_entries_(info->HasDeoptimizationSupport()
- ? info->function()->ast_node_count() : 0,
- info->zone()),
- stack_checks_(2, info->zone()), // There's always at least one.
- type_feedback_cells_(info->HasDeoptimizationSupport()
- ? info->function()->ast_node_count() : 0,
- info->zone()),
- ic_total_count_(0),
- zone_(info->zone()) {
- Initialize();
- }
-
- void Initialize();
-
- static bool MakeCode(CompilationInfo* info);
-
- // Encode state and pc-offset as a BitField<type, start, size>.
- // Only use 30 bits because we encode the result as a smi.
- class StateField : public BitField<State, 0, 1> { };
- class PcField : public BitField<unsigned, 1, 30-1> { };
-
- static const char* State2String(State state) {
- switch (state) {
- case NO_REGISTERS: return "NO_REGISTERS";
- case TOS_REG: return "TOS_REG";
- }
- UNREACHABLE();
- return NULL;
- }
-
- Zone* zone() const { return zone_; }
-
- static const int kMaxBackEdgeWeight = 127;
-
-#if V8_TARGET_ARCH_IA32
- static const int kBackEdgeDistanceUnit = 100;
-#elif V8_TARGET_ARCH_X64
- static const int kBackEdgeDistanceUnit = 162;
-#elif V8_TARGET_ARCH_ARM
- static const int kBackEdgeDistanceUnit = 142;
-#elif V8_TARGET_ARCH_MIPS
- static const int kBackEdgeDistanceUnit = 142;
-#else
-#error Unsupported target architecture.
-#endif
-
-
- private:
- class Breakable;
- class Iteration;
-
- class TestContext;
-
- class NestedStatement BASE_EMBEDDED {
- public:
- explicit NestedStatement(FullCodeGenerator* codegen) : codegen_(codegen) {
- // Link into codegen's nesting stack.
- previous_ = codegen->nesting_stack_;
- codegen->nesting_stack_ = this;
- }
- virtual ~NestedStatement() {
- // Unlink from codegen's nesting stack.
- ASSERT_EQ(this, codegen_->nesting_stack_);
- codegen_->nesting_stack_ = previous_;
- }
-
- virtual Breakable* AsBreakable() { return NULL; }
- virtual Iteration* AsIteration() { return NULL; }
-
- virtual bool IsContinueTarget(Statement* target) { return false; }
- virtual bool IsBreakTarget(Statement* target) { return false; }
-
- // Notify the statement that we are exiting it via break, continue, or
- // return and give it a chance to generate cleanup code. Return the
- // next outer statement in the nesting stack. We accumulate in
- // *stack_depth the amount to drop the stack and in *context_length the
- // number of context chain links to unwind as we traverse the nesting
- // stack from an exit to its target.
- virtual NestedStatement* Exit(int* stack_depth, int* context_length) {
- return previous_;
- }
-
- protected:
- MacroAssembler* masm() { return codegen_->masm(); }
-
- FullCodeGenerator* codegen_;
- NestedStatement* previous_;
-
- private:
- DISALLOW_COPY_AND_ASSIGN(NestedStatement);
- };
-
- // A breakable statement such as a block.
- class Breakable : public NestedStatement {
- public:
- Breakable(FullCodeGenerator* codegen, BreakableStatement* statement)
- : NestedStatement(codegen), statement_(statement) {
- }
- virtual ~Breakable() {}
-
- virtual Breakable* AsBreakable() { return this; }
- virtual bool IsBreakTarget(Statement* target) {
- return statement() == target;
- }
-
- BreakableStatement* statement() { return statement_; }
- Label* break_label() { return &break_label_; }
-
- private:
- BreakableStatement* statement_;
- Label break_label_;
- };
-
- // An iteration statement such as a while, for, or do loop.
- class Iteration : public Breakable {
- public:
- Iteration(FullCodeGenerator* codegen, IterationStatement* statement)
- : Breakable(codegen, statement) {
- }
- virtual ~Iteration() {}
-
- virtual Iteration* AsIteration() { return this; }
- virtual bool IsContinueTarget(Statement* target) {
- return statement() == target;
- }
-
- Label* continue_label() { return &continue_label_; }
-
- private:
- Label continue_label_;
- };
-
- // A nested block statement.
- class NestedBlock : public Breakable {
- public:
- NestedBlock(FullCodeGenerator* codegen, Block* block)
- : Breakable(codegen, block) {
- }
- virtual ~NestedBlock() {}
-
- virtual NestedStatement* Exit(int* stack_depth, int* context_length) {
- if (statement()->AsBlock()->scope() != NULL) {
- ++(*context_length);
- }
- return previous_;
- };
- };
-
- // The try block of a try/catch statement.
- class TryCatch : public NestedStatement {
- public:
- explicit TryCatch(FullCodeGenerator* codegen) : NestedStatement(codegen) {
- }
- virtual ~TryCatch() {}
-
- virtual NestedStatement* Exit(int* stack_depth, int* context_length);
- };
-
- // The try block of a try/finally statement.
- class TryFinally : public NestedStatement {
- public:
- TryFinally(FullCodeGenerator* codegen, Label* finally_entry)
- : NestedStatement(codegen), finally_entry_(finally_entry) {
- }
- virtual ~TryFinally() {}
-
- virtual NestedStatement* Exit(int* stack_depth, int* context_length);
-
- private:
- Label* finally_entry_;
- };
-
- // The finally block of a try/finally statement.
- class Finally : public NestedStatement {
- public:
- static const int kElementCount = 5;
-
- explicit Finally(FullCodeGenerator* codegen) : NestedStatement(codegen) { }
- virtual ~Finally() {}
-
- virtual NestedStatement* Exit(int* stack_depth, int* context_length) {
- *stack_depth += kElementCount;
- return previous_;
- }
- };
-
- // The body of a for/in loop.
- class ForIn : public Iteration {
- public:
- static const int kElementCount = 5;
-
- ForIn(FullCodeGenerator* codegen, ForInStatement* statement)
- : Iteration(codegen, statement) {
- }
- virtual ~ForIn() {}
-
- virtual NestedStatement* Exit(int* stack_depth, int* context_length) {
- *stack_depth += kElementCount;
- return previous_;
- }
- };
-
-
- // The body of a with or catch.
- class WithOrCatch : public NestedStatement {
- public:
- explicit WithOrCatch(FullCodeGenerator* codegen)
- : NestedStatement(codegen) {
- }
- virtual ~WithOrCatch() {}
-
- virtual NestedStatement* Exit(int* stack_depth, int* context_length) {
- ++(*context_length);
- return previous_;
- }
- };
-
- // Type of a member function that generates inline code for a native function.
- typedef void (FullCodeGenerator::*InlineFunctionGenerator)(CallRuntime* expr);
-
- static const InlineFunctionGenerator kInlineFunctionGenerators[];
-
- // A platform-specific utility to overwrite the accumulator register
- // with a GC-safe value.
- void ClearAccumulator();
-
- // Determine whether or not to inline the smi case for the given
- // operation.
- bool ShouldInlineSmiCase(Token::Value op);
-
- // Helper function to convert a pure value into a test context. The value
- // is expected on the stack or the accumulator, depending on the platform.
- // See the platform-specific implementation for details.
- void DoTest(Expression* condition,
- Label* if_true,
- Label* if_false,
- Label* fall_through);
- void DoTest(const TestContext* context);
-
- // Helper function to split control flow and avoid a branch to the
- // fall-through label if it is set up.
-#ifdef V8_TARGET_ARCH_MIPS
- void Split(Condition cc,
- Register lhs,
- const Operand& rhs,
- Label* if_true,
- Label* if_false,
- Label* fall_through);
-#else // All non-mips arch.
- void Split(Condition cc,
- Label* if_true,
- Label* if_false,
- Label* fall_through);
-#endif // V8_TARGET_ARCH_MIPS
-
- // Load the value of a known (PARAMETER, LOCAL, or CONTEXT) variable into
- // a register. Emits a context chain walk if if necessary (so does
- // SetVar) so avoid calling both on the same variable.
- void GetVar(Register destination, Variable* var);
-
- // Assign to a known (PARAMETER, LOCAL, or CONTEXT) variable. If it's in
- // the context, the write barrier will be emitted and source, scratch0,
- // scratch1 will be clobbered. Emits a context chain walk if if necessary
- // (so does GetVar) so avoid calling both on the same variable.
- void SetVar(Variable* var,
- Register source,
- Register scratch0,
- Register scratch1);
-
- // An operand used to read/write a stack-allocated (PARAMETER or LOCAL)
- // variable. Writing does not need the write barrier.
- MemOperand StackOperand(Variable* var);
-
- // An operand used to read/write a known (PARAMETER, LOCAL, or CONTEXT)
- // variable. May emit code to traverse the context chain, loading the
- // found context into the scratch register. Writing to this operand will
- // need the write barrier if location is CONTEXT.
- MemOperand VarOperand(Variable* var, Register scratch);
-
- void VisitForEffect(Expression* expr) {
- EffectContext context(this);
- Visit(expr);
- PrepareForBailout(expr, NO_REGISTERS);
- }
-
- void VisitForAccumulatorValue(Expression* expr) {
- AccumulatorValueContext context(this);
- Visit(expr);
- PrepareForBailout(expr, TOS_REG);
- }
-
- void VisitForStackValue(Expression* expr) {
- StackValueContext context(this);
- Visit(expr);
- PrepareForBailout(expr, NO_REGISTERS);
- }
-
- void VisitForControl(Expression* expr,
- Label* if_true,
- Label* if_false,
- Label* fall_through) {
- TestContext context(this, expr, if_true, if_false, fall_through);
- Visit(expr);
- // For test contexts, we prepare for bailout before branching, not at
- // the end of the entire expression. This happens as part of visiting
- // the expression.
- }
-
- void VisitInDuplicateContext(Expression* expr);
-
- void VisitDeclarations(ZoneList<Declaration*>* declarations);
- void DeclareModules(Handle<FixedArray> descriptions);
- void DeclareGlobals(Handle<FixedArray> pairs);
- int DeclareGlobalsFlags();
-
- // Generate code to allocate all (including nested) modules and contexts.
- // Because of recursive linking and the presence of module alias declarations,
- // this has to be a separate pass _before_ populating or executing any module.
- void AllocateModules(ZoneList<Declaration*>* declarations);
-
- // Try to perform a comparison as a fast inlined literal compare if
- // the operands allow it. Returns true if the compare operations
- // has been matched and all code generated; false otherwise.
- bool TryLiteralCompare(CompareOperation* compare);
-
- // Platform-specific code for comparing the type of a value with
- // a given literal string.
- void EmitLiteralCompareTypeof(Expression* expr,
- Expression* sub_expr,
- Handle<String> check);
-
- // Platform-specific code for equality comparison with a nil-like value.
- void EmitLiteralCompareNil(CompareOperation* expr,
- Expression* sub_expr,
- NilValue nil);
-
- // Bailout support.
- void PrepareForBailout(Expression* node, State state);
- void PrepareForBailoutForId(BailoutId id, State state);
-
- // Cache cell support. This associates AST ids with global property cells
- // that will be cleared during GC and collected by the type-feedback oracle.
- void RecordTypeFeedbackCell(TypeFeedbackId id,
- Handle<JSGlobalPropertyCell> cell);
-
- // Record a call's return site offset, used to rebuild the frame if the
- // called function was inlined at the site.
- void RecordJSReturnSite(Call* call);
-
- // Prepare for bailout before a test (or compare) and branch. If
- // should_normalize, then the following comparison will not handle the
- // canonical JS true value so we will insert a (dead) test against true at
- // the actual bailout target from the optimized code. If not
- // should_normalize, the true and false labels are ignored.
- void PrepareForBailoutBeforeSplit(Expression* expr,
- bool should_normalize,
- Label* if_true,
- Label* if_false);
-
- // If enabled, emit debug code for checking that the current context is
- // neither a with nor a catch context.
- void EmitDebugCheckDeclarationContext(Variable* variable);
-
- // This is meant to be called at loop back edges, |back_edge_target| is
- // the jump target of the back edge and is used to approximate the amount
- // of code inside the loop.
- void EmitBackEdgeBookkeeping(IterationStatement* stmt,
- Label* back_edge_target);
- // Record the OSR AST id corresponding to a back edge in the code.
- void RecordBackEdge(BailoutId osr_ast_id);
- // Emit a table of stack check ids and pcs into the code stream. Return
- // the offset of the start of the table.
- unsigned EmitStackCheckTable();
-
- void EmitProfilingCounterDecrement(int delta);
- void EmitProfilingCounterReset();
-
- // Platform-specific return sequence
- void EmitReturnSequence();
-
- // Platform-specific code sequences for calls
- void EmitCallWithStub(Call* expr, CallFunctionFlags flags);
- void EmitCallWithIC(Call* expr, Handle<Object> name, RelocInfo::Mode mode);
- void EmitKeyedCallWithIC(Call* expr, Expression* key);
-
- // Platform-specific code for inline runtime calls.
- InlineFunctionGenerator FindInlineFunctionGenerator(Runtime::FunctionId id);
-
- void EmitInlineRuntimeCall(CallRuntime* expr);
-
-#define EMIT_INLINE_RUNTIME_CALL(name, x, y) \
- void Emit##name(CallRuntime* expr);
- INLINE_FUNCTION_LIST(EMIT_INLINE_RUNTIME_CALL)
- INLINE_RUNTIME_FUNCTION_LIST(EMIT_INLINE_RUNTIME_CALL)
-#undef EMIT_INLINE_RUNTIME_CALL
-
- // Platform-specific code for loading variables.
- void EmitLoadGlobalCheckExtensions(Variable* var,
- TypeofState typeof_state,
- Label* slow);
- MemOperand ContextSlotOperandCheckExtensions(Variable* var, Label* slow);
- void EmitDynamicLookupFastCase(Variable* var,
- TypeofState typeof_state,
- Label* slow,
- Label* done);
- void EmitVariableLoad(VariableProxy* proxy);
-
- void EmitAccessor(Expression* expression);
-
- // Expects the arguments and the function already pushed.
- void EmitResolvePossiblyDirectEval(int arg_count);
-
- // Platform-specific support for allocating a new closure based on
- // the given function info.
- void EmitNewClosure(Handle<SharedFunctionInfo> info, bool pretenure);
-
- // Platform-specific support for compiling assignments.
-
- // Load a value from a named property.
- // The receiver is left on the stack by the IC.
- void EmitNamedPropertyLoad(Property* expr);
-
- // Load a value from a keyed property.
- // The receiver and the key is left on the stack by the IC.
- void EmitKeyedPropertyLoad(Property* expr);
-
- // Apply the compound assignment operator. Expects the left operand on top
- // of the stack and the right one in the accumulator.
- void EmitBinaryOp(BinaryOperation* expr,
- Token::Value op,
- OverwriteMode mode);
-
- // Helper functions for generating inlined smi code for certain
- // binary operations.
- void EmitInlineSmiBinaryOp(BinaryOperation* expr,
- Token::Value op,
- OverwriteMode mode,
- Expression* left,
- Expression* right);
-
- // Assign to the given expression as if via '='. The right-hand-side value
- // is expected in the accumulator.
- void EmitAssignment(Expression* expr);
-
- // Complete a variable assignment. The right-hand-side value is expected
- // in the accumulator.
- void EmitVariableAssignment(Variable* var,
- Token::Value op);
-
- // Complete a named property assignment. The receiver is expected on top
- // of the stack and the right-hand-side value in the accumulator.
- void EmitNamedPropertyAssignment(Assignment* expr);
-
- // Complete a keyed property assignment. The receiver and key are
- // expected on top of the stack and the right-hand-side value in the
- // accumulator.
- void EmitKeyedPropertyAssignment(Assignment* expr);
-
- void CallIC(Handle<Code> code,
- RelocInfo::Mode rmode = RelocInfo::CODE_TARGET,
- TypeFeedbackId id = TypeFeedbackId::None());
-
- void SetFunctionPosition(FunctionLiteral* fun);
- void SetReturnPosition(FunctionLiteral* fun);
- void SetStatementPosition(Statement* stmt);
- void SetExpressionPosition(Expression* expr, int pos);
- void SetStatementPosition(int pos);
- void SetSourcePosition(int pos);
-
- // Non-local control flow support.
- void EnterFinallyBlock();
- void ExitFinallyBlock();
-
- // Loop nesting counter.
- int loop_depth() { return loop_depth_; }
- void increment_loop_depth() { loop_depth_++; }
- void decrement_loop_depth() {
- ASSERT(loop_depth_ > 0);
- loop_depth_--;
- }
-
- MacroAssembler* masm() { return masm_; }
-
- class ExpressionContext;
- const ExpressionContext* context() { return context_; }
- void set_new_context(const ExpressionContext* context) { context_ = context; }
-
- Handle<Script> script() { return info_->script(); }
- bool is_eval() { return info_->is_eval(); }
- bool is_native() { return info_->is_native(); }
- bool is_classic_mode() { return language_mode() == CLASSIC_MODE; }
- LanguageMode language_mode() { return function()->language_mode(); }
- bool is_qml_mode() { return function()->qml_mode(); }
- FunctionLiteral* function() { return info_->function(); }
- Scope* scope() { return scope_; }
-
- static Register result_register();
- static Register context_register();
-
- // Set fields in the stack frame. Offsets are the frame pointer relative
- // offsets defined in, e.g., StandardFrameConstants.
- void StoreToFrameField(int frame_offset, Register value);
-
- // Load a value from the current context. Indices are defined as an enum
- // in v8::internal::Context.
- void LoadContextField(Register dst, int context_index);
-
- // Push the function argument for the runtime functions PushWithContext
- // and PushCatchContext.
- void PushFunctionArgumentForContextAllocation();
-
- // AST node visit functions.
-#define DECLARE_VISIT(type) virtual void Visit##type(type* node);
- AST_NODE_LIST(DECLARE_VISIT)
-#undef DECLARE_VISIT
-
- void EmitUnaryOperation(UnaryOperation* expr, const char* comment);
-
- void VisitComma(BinaryOperation* expr);
- void VisitLogicalExpression(BinaryOperation* expr);
- void VisitArithmeticExpression(BinaryOperation* expr);
-
- void VisitForTypeofValue(Expression* expr);
-
- void Generate();
- void PopulateDeoptimizationData(Handle<Code> code);
- void PopulateTypeFeedbackInfo(Handle<Code> code);
- void PopulateTypeFeedbackCells(Handle<Code> code);
-
- Handle<FixedArray> handler_table() { return handler_table_; }
-
- struct BailoutEntry {
- BailoutId id;
- unsigned pc_and_state;
- };
-
- struct TypeFeedbackCellEntry {
- TypeFeedbackId ast_id;
- Handle<JSGlobalPropertyCell> cell;
- };
-
-
- class ExpressionContext BASE_EMBEDDED {
- public:
- explicit ExpressionContext(FullCodeGenerator* codegen)
- : masm_(codegen->masm()), old_(codegen->context()), codegen_(codegen) {
- codegen->set_new_context(this);
- }
-
- virtual ~ExpressionContext() {
- codegen_->set_new_context(old_);
- }
-
- Isolate* isolate() const { return codegen_->isolate(); }
-
- // Convert constant control flow (true or false) to the result expected for
- // this expression context.
- virtual void Plug(bool flag) const = 0;
-
- // Emit code to convert a pure value (in a register, known variable
- // location, as a literal, or on top of the stack) into the result
- // expected according to this expression context.
- virtual void Plug(Register reg) const = 0;
- virtual void Plug(Variable* var) const = 0;
- virtual void Plug(Handle<Object> lit) const = 0;
- virtual void Plug(Heap::RootListIndex index) const = 0;
- virtual void PlugTOS() const = 0;
-
- // Emit code to convert pure control flow to a pair of unbound labels into
- // the result expected according to this expression context. The
- // implementation will bind both labels unless it's a TestContext, which
- // won't bind them at this point.
- virtual void Plug(Label* materialize_true,
- Label* materialize_false) const = 0;
-
- // Emit code to discard count elements from the top of stack, then convert
- // a pure value into the result expected according to this expression
- // context.
- virtual void DropAndPlug(int count, Register reg) const = 0;
-
- // Set up branch labels for a test expression. The three Label** parameters
- // are output parameters.
- virtual void PrepareTest(Label* materialize_true,
- Label* materialize_false,
- Label** if_true,
- Label** if_false,
- Label** fall_through) const = 0;
-
- // Returns true if we are evaluating only for side effects (i.e. if the
- // result will be discarded).
- virtual bool IsEffect() const { return false; }
-
- // Returns true if we are evaluating for the value (in accu/on stack).
- virtual bool IsAccumulatorValue() const { return false; }
- virtual bool IsStackValue() const { return false; }
-
- // Returns true if we are branching on the value rather than materializing
- // it. Only used for asserts.
- virtual bool IsTest() const { return false; }
-
- protected:
- FullCodeGenerator* codegen() const { return codegen_; }
- MacroAssembler* masm() const { return masm_; }
- MacroAssembler* masm_;
-
- private:
- const ExpressionContext* old_;
- FullCodeGenerator* codegen_;
- };
-
- class AccumulatorValueContext : public ExpressionContext {
- public:
- explicit AccumulatorValueContext(FullCodeGenerator* codegen)
- : ExpressionContext(codegen) { }
-
- virtual void Plug(bool flag) const;
- virtual void Plug(Register reg) const;
- virtual void Plug(Label* materialize_true, Label* materialize_false) const;
- virtual void Plug(Variable* var) const;
- virtual void Plug(Handle<Object> lit) const;
- virtual void Plug(Heap::RootListIndex) const;
- virtual void PlugTOS() const;
- virtual void DropAndPlug(int count, Register reg) const;
- virtual void PrepareTest(Label* materialize_true,
- Label* materialize_false,
- Label** if_true,
- Label** if_false,
- Label** fall_through) const;
- virtual bool IsAccumulatorValue() const { return true; }
- };
-
- class StackValueContext : public ExpressionContext {
- public:
- explicit StackValueContext(FullCodeGenerator* codegen)
- : ExpressionContext(codegen) { }
-
- virtual void Plug(bool flag) const;
- virtual void Plug(Register reg) const;
- virtual void Plug(Label* materialize_true, Label* materialize_false) const;
- virtual void Plug(Variable* var) const;
- virtual void Plug(Handle<Object> lit) const;
- virtual void Plug(Heap::RootListIndex) const;
- virtual void PlugTOS() const;
- virtual void DropAndPlug(int count, Register reg) const;
- virtual void PrepareTest(Label* materialize_true,
- Label* materialize_false,
- Label** if_true,
- Label** if_false,
- Label** fall_through) const;
- virtual bool IsStackValue() const { return true; }
- };
-
- class TestContext : public ExpressionContext {
- public:
- TestContext(FullCodeGenerator* codegen,
- Expression* condition,
- Label* true_label,
- Label* false_label,
- Label* fall_through)
- : ExpressionContext(codegen),
- condition_(condition),
- true_label_(true_label),
- false_label_(false_label),
- fall_through_(fall_through) { }
-
- static const TestContext* cast(const ExpressionContext* context) {
- ASSERT(context->IsTest());
- return reinterpret_cast<const TestContext*>(context);
- }
-
- Expression* condition() const { return condition_; }
- Label* true_label() const { return true_label_; }
- Label* false_label() const { return false_label_; }
- Label* fall_through() const { return fall_through_; }
-
- virtual void Plug(bool flag) const;
- virtual void Plug(Register reg) const;
- virtual void Plug(Label* materialize_true, Label* materialize_false) const;
- virtual void Plug(Variable* var) const;
- virtual void Plug(Handle<Object> lit) const;
- virtual void Plug(Heap::RootListIndex) const;
- virtual void PlugTOS() const;
- virtual void DropAndPlug(int count, Register reg) const;
- virtual void PrepareTest(Label* materialize_true,
- Label* materialize_false,
- Label** if_true,
- Label** if_false,
- Label** fall_through) const;
- virtual bool IsTest() const { return true; }
-
- private:
- Expression* condition_;
- Label* true_label_;
- Label* false_label_;
- Label* fall_through_;
- };
-
- class EffectContext : public ExpressionContext {
- public:
- explicit EffectContext(FullCodeGenerator* codegen)
- : ExpressionContext(codegen) { }
-
- virtual void Plug(bool flag) const;
- virtual void Plug(Register reg) const;
- virtual void Plug(Label* materialize_true, Label* materialize_false) const;
- virtual void Plug(Variable* var) const;
- virtual void Plug(Handle<Object> lit) const;
- virtual void Plug(Heap::RootListIndex) const;
- virtual void PlugTOS() const;
- virtual void DropAndPlug(int count, Register reg) const;
- virtual void PrepareTest(Label* materialize_true,
- Label* materialize_false,
- Label** if_true,
- Label** if_false,
- Label** fall_through) const;
- virtual bool IsEffect() const { return true; }
- };
-
- MacroAssembler* masm_;
- CompilationInfo* info_;
- Scope* scope_;
- Label return_label_;
- NestedStatement* nesting_stack_;
- int loop_depth_;
- ZoneList<Handle<Object> >* globals_;
- Handle<FixedArray> modules_;
- int module_index_;
- const ExpressionContext* context_;
- ZoneList<BailoutEntry> bailout_entries_;
- GrowableBitVector prepared_bailout_ids_;
- // TODO(svenpanne) Rename this to something like back_edges_ and rename
- // related functions accordingly.
- ZoneList<BailoutEntry> stack_checks_;
- ZoneList<TypeFeedbackCellEntry> type_feedback_cells_;
- int ic_total_count_;
- Handle<FixedArray> handler_table_;
- Handle<JSGlobalPropertyCell> profiling_counter_;
- bool generate_debug_code_;
- Zone* zone_;
-
- friend class NestedStatement;
-
- DEFINE_AST_VISITOR_SUBCLASS_MEMBERS();
- DISALLOW_COPY_AND_ASSIGN(FullCodeGenerator);
-};
-
-
-// A map from property names to getter/setter pairs allocated in the zone.
-class AccessorTable: public TemplateHashMap<Literal,
- ObjectLiteral::Accessors,
- ZoneAllocationPolicy> {
- public:
- explicit AccessorTable(Zone* zone) :
- TemplateHashMap<Literal, ObjectLiteral::Accessors,
- ZoneAllocationPolicy>(Literal::Match,
- ZoneAllocationPolicy(zone)),
- zone_(zone) { }
-
- Iterator lookup(Literal* literal) {
- Iterator it = find(literal, true, ZoneAllocationPolicy(zone_));
- if (it->second == NULL) it->second = new(zone_) ObjectLiteral::Accessors();
- return it;
- }
-
- private:
- Zone* zone_;
-};
-
-
-} } // namespace v8::internal
-
-#endif // V8_FULL_CODEGEN_H_