Index: src/compiler.cc |
diff --git a/src/compiler.cc b/src/compiler.cc |
index 4e80a245023a582db68bcd2c1f76434b5f24c223..f49cb6ec4b26803b0426d06ddb83e78fcc90ee97 100644 |
--- a/src/compiler.cc |
+++ b/src/compiler.cc |
@@ -599,11 +599,6 @@ CodeGenSelector::CodeGenTag CodeGenSelector::Select(FunctionLiteral* fun) { |
} |
} |
- if (scope->arguments() != NULL) { |
- if (FLAG_trace_bailout) PrintF("function uses 'arguments'\n"); |
- return NORMAL; |
- } |
- |
has_supported_syntax_ = true; |
VisitDeclarations(scope->declarations()); |
if (!has_supported_syntax_) return NORMAL; |
@@ -802,7 +797,17 @@ void CodeGenSelector::VisitVariableProxy(VariableProxy* expr) { |
BAILOUT("Lookup slot"); |
} |
} else { |
- BAILOUT("access to arguments object"); |
+#ifdef DEBUG |
+ // Only remaining possibility is a property where the object is |
+ // a slotted variable and the key is a smi. |
+ Property* property = rewrite->AsProperty(); |
+ ASSERT_NOT_NULL(property); |
+ Variable* object = property->obj()->AsVariableProxy()->AsVariable(); |
+ ASSERT_NOT_NULL(object); |
+ ASSERT_NOT_NULL(object->slot()); |
+ ASSERT_NOT_NULL(property->key()->AsLiteral()); |
+ ASSERT(property->key()->AsLiteral()->handle()->IsSmi()); |
+#endif |
} |
} |
} |
@@ -886,12 +891,21 @@ void CodeGenSelector::VisitAssignment(Assignment* expr) { |
// All global variables are supported. |
if (!var->is_global()) { |
if (var->slot() == NULL) { |
- // This is a parameter that has rewritten to an arguments access. |
- BAILOUT("non-global/non-slot assignment"); |
- } |
- Slot::Type type = var->slot()->type(); |
- if (type == Slot::LOOKUP) { |
- BAILOUT("Lookup slot"); |
+ Property* property = var->AsProperty(); |
+ if (property == NULL) { |
+ BAILOUT("non-global/non-slot/non-property assignment"); |
+ } |
+ if (property->obj()->AsSlot() == NULL) { |
+ BAILOUT("variable rewritten to property non slot object assignment"); |
+ } |
+ if (property->key()->AsLiteral() == NULL) { |
+ BAILOUT("variable rewritten to property non literal key assignment"); |
+ } |
+ } else { |
+ Slot::Type type = var->slot()->type(); |
+ if (type == Slot::LOOKUP) { |
+ BAILOUT("Lookup slot"); |
+ } |
} |
} |
} else if (prop != NULL) { |