Index: src/fast-codegen.cc |
diff --git a/src/fast-codegen.cc b/src/fast-codegen.cc |
index 5a8c09e6e280dc2c48352577e9df97490f0cf6b5..db0205c3ca0dfb675fbd522ad1352a13c44c35a0 100644 |
--- a/src/fast-codegen.cc |
+++ b/src/fast-codegen.cc |
@@ -27,6 +27,7 @@ |
#include "v8.h" |
+#include "data-flow.h" |
#include "fast-codegen.h" |
#include "scopes.h" |
@@ -51,6 +52,8 @@ namespace internal { |
void FastCodeGenSyntaxChecker::Check(FunctionLiteral* fun, |
CompilationInfo* info) { |
+ info_ = info; |
+ |
// We do not specialize if we do not have a receiver. |
if (!info->has_receiver()) BAILOUT("No receiver"); |
@@ -322,4 +325,239 @@ void FastCodeGenSyntaxChecker::VisitThisFunction(ThisFunction* expr) { |
#undef CHECK_BAILOUT |
+void FastCodeGenerator::MakeCode(FunctionLiteral* fun, |
+ Handle<Script> script, |
+ bool is_eval, |
+ CompilationInfo* info) { |
+ AstLabeler labeler; |
+ FastCodeGenerator cgen(script, is_eval); |
+ labeler.Label(fun); |
+ cgen.Generate(fun, info); |
+} |
+ |
+ |
+void FastCodeGenerator::Generate(FunctionLiteral* fun, CompilationInfo* info) { |
+ ASSERT(function_ == NULL); |
+ ASSERT(info_ == NULL); |
+ function_ = fun; |
+ info_ = info; |
+ VisitStatements(fun->body()); |
+ function_ = NULL; |
+ info_ = NULL; |
fschneider
2010/01/29 13:02:29
Maybe I miss something here. Why do we need to res
|
+} |
+ |
+ |
+void FastCodeGenerator::VisitDeclaration(Declaration* decl) { |
+ UNREACHABLE(); |
+} |
+ |
+ |
+void FastCodeGenerator::VisitBlock(Block* stmt) { |
+ VisitStatements(stmt->statements()); |
+} |
+ |
+ |
+void FastCodeGenerator::VisitExpressionStatement(ExpressionStatement* stmt) { |
+ Visit(stmt->expression()); |
+} |
+ |
+ |
+void FastCodeGenerator::VisitEmptyStatement(EmptyStatement* stmt) { |
+ // Nothing to do. |
+} |
+ |
+ |
+void FastCodeGenerator::VisitIfStatement(IfStatement* stmt) { |
+ UNREACHABLE(); |
+} |
+ |
+ |
+void FastCodeGenerator::VisitContinueStatement(ContinueStatement* stmt) { |
+ UNREACHABLE(); |
+} |
+ |
+ |
+void FastCodeGenerator::VisitBreakStatement(BreakStatement* stmt) { |
+ UNREACHABLE(); |
+} |
+ |
+ |
+void FastCodeGenerator::VisitReturnStatement(ReturnStatement* stmt) { |
+ UNREACHABLE(); |
+} |
+ |
+ |
+void FastCodeGenerator::VisitWithEnterStatement(WithEnterStatement* stmt) { |
+ UNREACHABLE(); |
+} |
+ |
+ |
+void FastCodeGenerator::VisitWithExitStatement(WithExitStatement* stmt) { |
+ UNREACHABLE(); |
+} |
+ |
+ |
+void FastCodeGenerator::VisitSwitchStatement(SwitchStatement* stmt) { |
+ UNREACHABLE(); |
+} |
+ |
+ |
+void FastCodeGenerator::VisitDoWhileStatement(DoWhileStatement* stmt) { |
+ UNREACHABLE(); |
+} |
+ |
+ |
+void FastCodeGenerator::VisitWhileStatement(WhileStatement* stmt) { |
+ UNREACHABLE(); |
+} |
+ |
+ |
+void FastCodeGenerator::VisitForStatement(ForStatement* stmt) { |
+ UNREACHABLE(); |
+} |
+ |
+ |
+void FastCodeGenerator::VisitForInStatement(ForInStatement* stmt) { |
+ UNREACHABLE(); |
+} |
+ |
+ |
+void FastCodeGenerator::VisitTryCatchStatement(TryCatchStatement* stmt) { |
+ UNREACHABLE(); |
+} |
+ |
+ |
+void FastCodeGenerator::VisitTryFinallyStatement(TryFinallyStatement* stmt) { |
+ UNREACHABLE(); |
+} |
+ |
+ |
+void FastCodeGenerator::VisitDebuggerStatement(DebuggerStatement* stmt) { |
+ UNREACHABLE(); |
+} |
+ |
+ |
+void FastCodeGenerator::VisitFunctionLiteral(FunctionLiteral* expr) { |
+ UNREACHABLE(); |
+} |
+ |
+ |
+void FastCodeGenerator::VisitFunctionBoilerplateLiteral( |
+ FunctionBoilerplateLiteral* expr) { |
+ UNREACHABLE(); |
+} |
+ |
+ |
+void FastCodeGenerator::VisitConditional(Conditional* expr) { |
+ UNREACHABLE(); |
+} |
+ |
+ |
+void FastCodeGenerator::VisitSlot(Slot* expr) { |
+ UNREACHABLE(); |
+} |
+ |
+ |
+void FastCodeGenerator::VisitVariableProxy(VariableProxy* expr) { |
+ if (FLAG_print_ir) { |
+ ASSERT(expr->var()->is_global() && !expr->var()->is_this()); |
+ SmartPointer<char> name = expr->name()->ToCString(); |
+ PrintF("%d: t%d = Global(%s)\n", expr->num(), expr->num(), *name); |
+ } |
+} |
+ |
+ |
+void FastCodeGenerator::VisitLiteral(Literal* expr) { |
+ UNREACHABLE(); |
+} |
+ |
+ |
+void FastCodeGenerator::VisitRegExpLiteral(RegExpLiteral* expr) { |
+ UNREACHABLE(); |
+} |
+ |
+ |
+void FastCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { |
+ UNREACHABLE(); |
+} |
+ |
+ |
+void FastCodeGenerator::VisitArrayLiteral(ArrayLiteral* expr) { |
+ UNREACHABLE(); |
+} |
+ |
+ |
+void FastCodeGenerator::VisitCatchExtensionObject(CatchExtensionObject* expr) { |
+ UNREACHABLE(); |
+} |
+ |
+ |
+void FastCodeGenerator::VisitAssignment(Assignment* expr) { |
+ // Known to be a simple this property assignment. |
+ Visit(expr->value()); |
+ |
+ if (FLAG_print_ir) { |
+ Property* prop = expr->target()->AsProperty(); |
+ ASSERT_NOT_NULL(prop); |
+ ASSERT_NOT_NULL(prop->obj()->AsVariableProxy()); |
+ ASSERT(prop->obj()->AsVariableProxy()->var()->is_this()); |
+ ASSERT(prop->key()->IsPropertyName()); |
+ Handle<String> key = |
+ Handle<String>::cast(prop->key()->AsLiteral()->handle()); |
+ SmartPointer<char> name = key->ToCString(); |
+ PrintF("%d: t%d = Store(this, \"%s\", t%d)\n", |
+ expr->num(), expr->num(), *name, expr->value()->num()); |
+ } |
+} |
+ |
+ |
+void FastCodeGenerator::VisitThrow(Throw* expr) { |
+ UNREACHABLE(); |
+} |
+ |
+ |
+void FastCodeGenerator::VisitProperty(Property* expr) { |
+ UNREACHABLE(); |
+} |
+ |
+ |
+void FastCodeGenerator::VisitCall(Call* expr) { |
+ UNREACHABLE(); |
+} |
+ |
+ |
+void FastCodeGenerator::VisitCallNew(CallNew* expr) { |
+ UNREACHABLE(); |
+} |
+ |
+ |
+void FastCodeGenerator::VisitCallRuntime(CallRuntime* expr) { |
+ UNREACHABLE(); |
+} |
+ |
+ |
+void FastCodeGenerator::VisitUnaryOperation(UnaryOperation* expr) { |
+ UNREACHABLE(); |
+} |
+ |
+ |
+void FastCodeGenerator::VisitCountOperation(CountOperation* expr) { |
+ UNREACHABLE(); |
+} |
+ |
+ |
+void FastCodeGenerator::VisitBinaryOperation(BinaryOperation* expr) { |
+ UNREACHABLE(); |
+} |
+ |
+ |
+void FastCodeGenerator::VisitCompareOperation(CompareOperation* expr) { |
+ UNREACHABLE(); |
+} |
+ |
+ |
+void FastCodeGenerator::VisitThisFunction(ThisFunction* expr) { |
+ UNREACHABLE(); |
+} |
+ |
} } // namespace v8::internal |