Index: src/codegen.h |
=================================================================== |
--- src/codegen.h (revision 479) |
+++ src/codegen.h (working copy) |
@@ -26,13 +26,44 @@ |
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
#ifndef V8_CODEGEN_H_ |
+#define V8_CODEGEN_H_ |
#include "ast.h" |
#include "code-stubs.h" |
#include "runtime.h" |
-#define V8_CODEGEN_H_ |
+// Include the declaration of the architecture defined class CodeGenerator. |
+// The contract to the shared code is that the the CodeGenerator is a subclass |
+// of Visitor and that the following methods are available publicly: |
+// CodeGenerator::MakeCode |
+// CodeGenerator::SetFunctionInfo |
+// CodeGenerator::AddDeferred |
+// CodeGenerator::masm |
+// |
+// These methods are either used privately by the shared code or implemented as |
+// shared code: |
+// CodeGenerator::CodeGenerator |
+// CodeGenerator::~CodeGenerator |
+// CodeGenerator::ProcessDeferred |
+// CodeGenerator::GenCode |
+// CodeGenerator::BuildBoilerplate |
+// CodeGenerator::ComputeCallInitialize |
+// CodeGenerator::ProcessDeclarations |
+// CodeGenerator::DeclareGlobals |
+// CodeGenerator::CheckForInlineRuntimeCall |
+// CodeGenerator::GenerateFastCaseSwitchStatement |
+// CodeGenerator::GenerateFastCaseSwitchCases |
+// CodeGenerator::TryGenerateFastCaseSwitchStatement |
+// CodeGenerator::GenerateFastCaseSwitchJumpTable |
+// CodeGenerator::FastCaseSwitchMinCaseCount |
+// CodeGenerator::FastCaseSwitchMaxOverheadFactor |
+#if defined(ARM) |
+#include "codegen-arm.h" |
+#else |
+#include "codegen-ia32.h" |
+#endif |
+ |
namespace v8 { namespace internal { |
@@ -43,10 +74,6 @@ |
// and we can only run the tests with --nolazy. |
-// Forward declaration. |
-class CodeGenerator; |
- |
- |
// Deferred code objects are small pieces of code that are compiled |
// out of line. They are used to defer the compilation of uncommon |
// paths thereby avoiding expensive jumps around uncommon code parts. |
@@ -93,124 +120,6 @@ |
}; |
-// A superclass for code generators. The implementations of methods |
-// declared in this class are partially in codegen.c and partially in |
-// codegen_<arch>.c. |
-class CodeGenerator: public Visitor { |
- public: |
- CodeGenerator(bool is_eval, |
- Handle<Script> script) |
- : is_eval_(is_eval), |
- script_(script), |
- deferred_(8) { } |
- |
- |
- // The code generator: Takes a function literal, generates code for it, |
- // and assembles it all into a Code* object. This function should only |
- // be called by compiler.cc. |
- static Handle<Code> MakeCode(FunctionLiteral* fun, |
- Handle<Script> script, |
- bool is_eval); |
- |
- static void SetFunctionInfo(Handle<JSFunction> fun, |
- int length, |
- int function_token_position, |
- int start_position, |
- int end_position, |
- bool is_expression, |
- bool is_toplevel, |
- Handle<Script> script); |
- |
- virtual MacroAssembler* masm() = 0; |
- |
- virtual Scope* scope() const = 0; |
- |
- void AddDeferred(DeferredCode* code) { deferred_.Add(code); } |
- void ProcessDeferred(); |
- |
- // Accessors for is_eval. |
- bool is_eval() { return is_eval_; } |
- |
- // Abstract node visitors. |
-#define DEF_VISIT(type) \ |
- virtual void Visit##type(type* node) = 0; |
- NODE_LIST(DEF_VISIT) |
-#undef DEF_VISIT |
- |
- protected: |
- bool CheckForInlineRuntimeCall(CallRuntime* node); |
- Handle<JSFunction> BuildBoilerplate(FunctionLiteral* node); |
- void ProcessDeclarations(ZoneList<Declaration*>* declarations); |
- |
- Handle<Code> ComputeCallInitialize(int argc); |
- |
- // Declare global variables and functions in the given array of |
- // name/value pairs. |
- virtual void DeclareGlobals(Handle<FixedArray> pairs) = 0; |
- |
- // Support for type checks. |
- virtual void GenerateIsSmi(ZoneList<Expression*>* args) = 0; |
- virtual void GenerateIsNonNegativeSmi(ZoneList<Expression*>* args) = 0; |
- virtual void GenerateIsArray(ZoneList<Expression*>* args) = 0; |
- |
- // Support for arguments.length and arguments[?]. |
- virtual void GenerateArgumentsLength(ZoneList<Expression*>* args) = 0; |
- virtual void GenerateArgumentsAccess(ZoneList<Expression*>* args) = 0; |
- |
- // Support for accessing the value field of an object (used by Date). |
- virtual void GenerateValueOf(ZoneList<Expression*>* args) = 0; |
- virtual void GenerateSetValueOf(ZoneList<Expression*>* args) = 0; |
- |
- // Fast support for charCodeAt(n). |
- virtual void GenerateFastCharCodeAt(ZoneList<Expression*>* args) = 0; |
- |
- // Fast support for object equality testing. |
- virtual void GenerateObjectEquals(ZoneList<Expression*>* args) = 0; |
- |
- |
- // Multiple methods for fast case switch statement support. |
- |
- // The limit of the range of a fast-case switch, as a factor of the number |
- // of cases of the switch. Each platform should return a value that |
- // is optimal compared to the default code generated for a switch statement |
- // on that platform. |
- virtual int FastCaseSwitchMaxOverheadFactor() = 0; |
- |
- // The minimal number of cases in a switch before the fast-case switch |
- // optimization is enabled. Each platform should return a value that |
- // is optimal compared to the default code generated for a switch statement |
- // on that platform. |
- virtual int FastCaseSwitchMinCaseCount() = 0; |
- |
- // Allocate a jump table and create code to jump through it. |
- // Should call GenerateFastCaseSwitchCases to generate the code for |
- // all the cases at the appropriate point. |
- virtual void GenerateFastCaseSwitchJumpTable( |
- SwitchStatement* node, int min_index, int range, Label *fail_label, |
- SmartPointer<Label*> &case_targets, SmartPointer<Label>& case_labels) = 0; |
- |
- // Generate the code for cases for the fast case switch. |
- // Called by GenerateFastCaseSwitchJumpTable. |
- virtual void GenerateFastCaseSwitchCases( |
- SwitchStatement* node, SmartPointer<Label> &case_labels); |
- |
- // Fast support for constant-Smi switches. |
- virtual void GenerateFastCaseSwitchStatement( |
- SwitchStatement *node, int min_index, int range, int default_index); |
- |
- // Fast support for constant-Smi switches. Tests whether switch statement |
- // permits optimization and calls GenerateFastCaseSwitch if it does. |
- // Returns true if the fast-case switch was generated, and false if not. |
- virtual bool TryGenerateFastCaseSwitchStatement(SwitchStatement *node); |
- |
- |
- private: |
- bool is_eval_; // Tells whether code is generated for eval. |
- Handle<Script> script_; |
- List<DeferredCode*> deferred_; |
-}; |
- |
- |
// RuntimeStub models code stubs calling entry points in the Runtime class. |
class RuntimeStub : public CodeStub { |
public: |