| Index: src/arm/codegen-arm.h
|
| ===================================================================
|
| --- src/arm/codegen-arm.h (revision 3890)
|
| +++ src/arm/codegen-arm.h (working copy)
|
| @@ -161,19 +161,15 @@
|
|
|
| // Takes a function literal, generates code for it. This function should only
|
| // be called by compiler.cc.
|
| - static Handle<Code> MakeCode(FunctionLiteral* fun,
|
| - Handle<Script> script,
|
| - bool is_eval,
|
| - CompilationInfo* info);
|
| + static Handle<Code> MakeCode(CompilationInfo* info);
|
|
|
| // Printing of AST, etc. as requested by flags.
|
| - static void MakeCodePrologue(FunctionLiteral* fun);
|
| + static void MakeCodePrologue(CompilationInfo* info);
|
|
|
| // Allocate and install the code.
|
| - static Handle<Code> MakeCodeEpilogue(FunctionLiteral* fun,
|
| - MacroAssembler* masm,
|
| + static Handle<Code> MakeCodeEpilogue(MacroAssembler* masm,
|
| Code::Flags flags,
|
| - Handle<Script> script);
|
| + CompilationInfo* info);
|
|
|
| #ifdef ENABLE_LOGGING_AND_PROFILING
|
| static bool ShouldGenerateLog(Expression* type);
|
| @@ -189,7 +185,7 @@
|
| // Accessors
|
| MacroAssembler* masm() { return masm_; }
|
| VirtualFrame* frame() const { return frame_; }
|
| - Handle<Script> script() { return script_; }
|
| + inline Handle<Script> script();
|
|
|
| bool has_valid_frame() const { return frame_ != NULL; }
|
|
|
| @@ -212,16 +208,15 @@
|
|
|
| private:
|
| // Construction/Destruction
|
| - CodeGenerator(MacroAssembler* masm, Handle<Script> script, bool is_eval);
|
| + explicit CodeGenerator(MacroAssembler* masm);
|
|
|
| // Accessors
|
| - Scope* scope() const { return scope_; }
|
| + inline bool is_eval();
|
| + Scope* scope();
|
|
|
| // Generating deferred code.
|
| void ProcessDeferred();
|
|
|
| - bool is_eval() { return is_eval_; }
|
| -
|
| // State
|
| bool has_cc() const { return cc_reg_ != al; }
|
| JumpTarget* true_target() const { return state_->true_target(); }
|
| @@ -249,7 +244,7 @@
|
| inline void VisitStatementsAndSpill(ZoneList<Statement*>* statements);
|
|
|
| // Main code generation function
|
| - void Generate(FunctionLiteral* fun, Mode mode, CompilationInfo* info);
|
| + void Generate(CompilationInfo* info, Mode mode);
|
|
|
| // The following are used by class Reference.
|
| void LoadReference(Reference* ref);
|
| @@ -425,16 +420,14 @@
|
| bool HasValidEntryRegisters();
|
| #endif
|
|
|
| - bool is_eval_; // Tells whether code is generated for eval.
|
| -
|
| - Handle<Script> script_;
|
| List<DeferredCode*> deferred_;
|
|
|
| // Assembler
|
| MacroAssembler* masm_; // to generate code
|
|
|
| + CompilationInfo* info_;
|
| +
|
| // Code generation state
|
| - Scope* scope_;
|
| VirtualFrame* frame_;
|
| RegisterAllocator* allocator_;
|
| Condition cc_reg_;
|
| @@ -538,6 +531,74 @@
|
| };
|
|
|
|
|
| +class StringStubBase: public CodeStub {
|
| + public:
|
| + // Generate code for copying characters using a simple loop. This should only
|
| + // be used in places where the number of characters is small and the
|
| + // additional setup and checking in GenerateCopyCharactersLong adds too much
|
| + // overhead. Copying of overlapping regions is not supported.
|
| + // Dest register ends at the position after the last character written.
|
| + void GenerateCopyCharacters(MacroAssembler* masm,
|
| + Register dest,
|
| + Register src,
|
| + Register count,
|
| + Register scratch,
|
| + bool ascii);
|
| +
|
| + // Generate code for copying a large number of characters. This function
|
| + // is allowed to spend extra time setting up conditions to make copying
|
| + // faster. Copying of overlapping regions is not supported.
|
| + // Dest register ends at the position after the last character written.
|
| + void GenerateCopyCharactersLong(MacroAssembler* masm,
|
| + Register dest,
|
| + Register src,
|
| + Register count,
|
| + Register scratch1,
|
| + Register scratch2,
|
| + Register scratch3,
|
| + Register scratch4,
|
| + Register scratch5,
|
| + int flags);
|
| +};
|
| +
|
| +
|
| +// Flag that indicates how to generate code for the stub StringAddStub.
|
| +enum StringAddFlags {
|
| + NO_STRING_ADD_FLAGS = 0,
|
| + NO_STRING_CHECK_IN_STUB = 1 << 0 // Omit string check in stub.
|
| +};
|
| +
|
| +
|
| +class StringAddStub: public StringStubBase {
|
| + public:
|
| + explicit StringAddStub(StringAddFlags flags) {
|
| + string_check_ = ((flags & NO_STRING_CHECK_IN_STUB) == 0);
|
| + }
|
| +
|
| + private:
|
| + Major MajorKey() { return StringAdd; }
|
| + int MinorKey() { return string_check_ ? 0 : 1; }
|
| +
|
| + void Generate(MacroAssembler* masm);
|
| +
|
| + // Should the stub check whether arguments are strings?
|
| + bool string_check_;
|
| +};
|
| +
|
| +
|
| +class SubStringStub: public StringStubBase {
|
| + public:
|
| + SubStringStub() {}
|
| +
|
| + private:
|
| + Major MajorKey() { return SubString; }
|
| + int MinorKey() { return 0; }
|
| +
|
| + void Generate(MacroAssembler* masm);
|
| +};
|
| +
|
| +
|
| +
|
| class StringCompareStub: public CodeStub {
|
| public:
|
| StringCompareStub() { }
|
|
|