| Index: src/fast-codegen.cc
 | 
| diff --git a/src/fast-codegen.cc b/src/fast-codegen.cc
 | 
| index 587cda8061e3878f012f02ec3e9fc2afa6e326ec..19091dafa81bbd89f9951145d20388b238042b45 100644
 | 
| --- a/src/fast-codegen.cc
 | 
| +++ b/src/fast-codegen.cc
 | 
| @@ -89,10 +89,10 @@ void FastCodeGenSyntaxChecker::VisitDeclarations(
 | 
|  
 | 
|  
 | 
|  void FastCodeGenSyntaxChecker::VisitStatements(ZoneList<Statement*>* stmts) {
 | 
| -  for (int i = 0, len = stmts->length(); i < len; i++) {
 | 
| -    Visit(stmts->at(i));
 | 
| -    CHECK_BAILOUT;
 | 
| +  if (stmts->length() != 1) {
 | 
| +    BAILOUT("Function body is not a singleton statement.");
 | 
|    }
 | 
| +  Visit(stmts->at(0));
 | 
|  }
 | 
|  
 | 
|  
 | 
| @@ -276,6 +276,9 @@ void FastCodeGenSyntaxChecker::VisitAssignment(Assignment* expr) {
 | 
|      Handle<String> name = Handle<String>::cast(key->handle());
 | 
|      LookupResult lookup;
 | 
|      receiver->Lookup(*name, &lookup);
 | 
| +    if (!lookup.IsValid()) {
 | 
| +      BAILOUT("Assigned property not found at compile time");
 | 
| +    }
 | 
|      if (lookup.holder() != *receiver) BAILOUT("Non-own property assignment");
 | 
|      if (!lookup.type() == FIELD) BAILOUT("Non-field property assignment");
 | 
|    } else {
 | 
| @@ -311,6 +314,9 @@ void FastCodeGenSyntaxChecker::VisitProperty(Property* expr) {
 | 
|      Handle<String> name = Handle<String>::cast(key->handle());
 | 
|      LookupResult lookup;
 | 
|      receiver->Lookup(*name, &lookup);
 | 
| +    if (!lookup.IsValid()) {
 | 
| +      BAILOUT("Referenced property not found at compile time");
 | 
| +    }
 | 
|      if (lookup.holder() != *receiver) BAILOUT("Non-own property reference");
 | 
|      if (!lookup.type() == FIELD) BAILOUT("Non-field property reference");
 | 
|    } else {
 | 
| @@ -360,6 +366,16 @@ void FastCodeGenSyntaxChecker::VisitBinaryOperation(BinaryOperation* expr) {
 | 
|        // a pair of registers to keep all intermediate values in registers
 | 
|        // (i.e., the expression stack has height no more than two).
 | 
|        if (!expr->right()->IsLeaf()) BAILOUT("expression nested on right");
 | 
| +
 | 
| +      // We do not allow subexpressions with side effects because we
 | 
| +      // (currently) bail out to the beginning of the full function.  The
 | 
| +      // only expressions with side effects that we would otherwise handle
 | 
| +      // are assignments.
 | 
| +      if (expr->left()->AsAssignment() != NULL ||
 | 
| +          expr->right()->AsAssignment() != NULL) {
 | 
| +        BAILOUT("subexpression of binary operation has side effects");
 | 
| +      }
 | 
| +
 | 
|        Visit(expr->left());
 | 
|        CHECK_BAILOUT;
 | 
|        Visit(expr->right());
 | 
| 
 |