Assert in debug mode that we do not try to compile a function literal
authorkmillikin@chromium.org <kmillikin@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Mon, 9 Mar 2009 14:48:34 +0000 (14:48 +0000)
committerkmillikin@chromium.org <kmillikin@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Mon, 9 Mar 2009 14:48:34 +0000 (14:48 +0000)
more than once.

Review URL: http://codereview.chromium.org/39339

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@1456 ce2b1a6d-e550-0410-aec6-3dcde31c8c00

src/ast.h
src/codegen.cc

index 70314a1..844e116 100644 (file)
--- a/src/ast.h
+++ b/src/ast.h
@@ -1197,6 +1197,9 @@ class FunctionLiteral: public Expression {
         is_expression_(is_expression),
         loop_nesting_(0),
         function_token_position_(RelocInfo::kNoPosition) {
+#ifdef DEBUG
+    already_compiled_ = false;
+#endif
   }
 
   virtual void Accept(AstVisitor* v);
@@ -1223,6 +1226,13 @@ class FunctionLiteral: public Expression {
   bool loop_nesting() const { return loop_nesting_; }
   void set_loop_nesting(int nesting) { loop_nesting_ = nesting; }
 
+#ifdef DEBUG
+  void mark_as_compiled() {
+    ASSERT(!already_compiled_);
+    already_compiled_ = true;
+  }
+#endif
+
  private:
   Handle<String> name_;
   Scope* scope_;
@@ -1236,6 +1246,9 @@ class FunctionLiteral: public Expression {
   bool is_expression_;
   int loop_nesting_;
   int function_token_position_;
+#ifdef DEBUG
+  bool already_compiled_;
+#endif
 };
 
 
index cfd8f8f..f43e01c 100644 (file)
@@ -237,6 +237,12 @@ static Handle<Code> ComputeLazyCompile(int argc) {
 
 
 Handle<JSFunction> CodeGenerator::BuildBoilerplate(FunctionLiteral* node) {
+#ifdef DEBUG
+  // We should not try to compile the same function literal more than
+  // once.
+  node->mark_as_compiled();
+#endif
+
   // Determine if the function can be lazily compiled. This is
   // necessary to allow some of our builtin JS files to be lazily
   // compiled. These builtins cannot be handled lazily by the parser,