Chromium Code Reviews| Index: src/interpreter/bytecode-generator.cc |
| diff --git a/src/interpreter/bytecode-generator.cc b/src/interpreter/bytecode-generator.cc |
| index 9c82b4702eaa19846bfe820fd38734d8b6eab5fc..2f926a71d29d2016ae68c650feb86c1f91a92f4c 100644 |
| --- a/src/interpreter/bytecode-generator.cc |
| +++ b/src/interpreter/bytecode-generator.cc |
| @@ -713,12 +713,10 @@ void BytecodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { |
| // contains computed properties with an uninitialized value. |
| if (literal_key->value()->IsInternalizedString()) { |
| if (property->emit_store()) { |
| - Register name = inner_temporary_register_scope.NewRegister(); |
| - builder() |
| - ->LoadLiteral(literal_key->AsPropertyName()) |
| - .StoreAccumulatorInRegister(name); |
| + size_t name_index = |
| + builder()->GetConstantPoolEntry(literal_key->AsPropertyName()); |
| VisitForAccumulatorValue(property->value()); |
| - builder()->StoreNamedProperty(literal, name, |
| + builder()->StoreNamedProperty(literal, name_index, |
| feedback_index(property->GetSlot(0)), |
| language_mode()); |
| } else { |
| @@ -939,13 +937,8 @@ void BytecodeGenerator::VisitVariableLoad(Variable* variable, |
| } |
| case VariableLocation::GLOBAL: |
| case VariableLocation::UNALLOCATED: { |
| - TemporaryRegisterScope temporary_register_scope(builder()); |
| - Register obj = temporary_register_scope.NewRegister(); |
| - builder()->LoadContextSlot(execution_context()->reg(), |
| - Context::GLOBAL_OBJECT_INDEX); |
| - builder()->StoreAccumulatorInRegister(obj); |
| - builder()->LoadLiteral(variable->name()); |
| - builder()->LoadNamedProperty(obj, feedback_index(slot), language_mode()); |
| + size_t name_index = builder()->GetConstantPoolEntry(variable->name()); |
| + builder()->LoadGlobal(name_index, feedback_index(slot), language_mode()); |
| execution_result()->SetResultInAccumulator(); |
| break; |
| } |
| @@ -987,21 +980,8 @@ void BytecodeGenerator::VisitVariableAssignment(Variable* variable, |
| } |
| case VariableLocation::GLOBAL: |
| case VariableLocation::UNALLOCATED: { |
| - Register value = execution_result()->NewRegister(); |
| - Register obj = execution_result()->NewRegister(); |
| - Register name = execution_result()->NewRegister(); |
| - |
| - // TODO(rmcilroy): Investigate whether we can avoid having to stash the |
| - // value in a register. |
| - builder()->StoreAccumulatorInRegister(value); |
| - builder()->LoadContextSlot(execution_context()->reg(), |
| - Context::GLOBAL_OBJECT_INDEX); |
| - builder()->StoreAccumulatorInRegister(obj); |
| - builder()->LoadLiteral(variable->name()); |
| - builder()->StoreAccumulatorInRegister(name); |
| - builder()->LoadAccumulatorWithRegister(value); |
| - builder()->StoreNamedProperty(obj, name, feedback_index(slot), |
| - language_mode()); |
| + size_t name_index = builder()->GetConstantPoolEntry(variable->name()); |
| + builder()->StoreGlobal(name_index, feedback_index(slot), language_mode()); |
| break; |
| } |
| case VariableLocation::CONTEXT: { |
| @@ -1023,6 +1003,7 @@ void BytecodeGenerator::VisitVariableAssignment(Variable* variable, |
| void BytecodeGenerator::VisitAssignment(Assignment* expr) { |
| DCHECK(expr->target()->IsValidReferenceExpression()); |
| Register object, key; |
| + size_t name_index; |
| // Left-hand side can only be a property, a global or a variable slot. |
| Property* property = expr->target()->AsProperty(); |
| @@ -1035,9 +1016,8 @@ void BytecodeGenerator::VisitAssignment(Assignment* expr) { |
| break; |
| case NAMED_PROPERTY: { |
| object = VisitForRegisterValue(property->obj()); |
| - key = execution_result()->NewRegister(); |
| - builder()->LoadLiteral(property->key()->AsLiteral()->AsPropertyName()); |
| - builder()->StoreAccumulatorInRegister(key); |
| + name_index = builder()->GetConstantPoolEntry( |
| + property->key()->AsLiteral()->AsPropertyName()); |
| break; |
| } |
| case KEYED_PROPERTY: { |
| @@ -1069,7 +1049,7 @@ void BytecodeGenerator::VisitAssignment(Assignment* expr) { |
| break; |
| } |
| case NAMED_PROPERTY: |
| - builder()->StoreNamedProperty(object, key, feedback_index(slot), |
| + builder()->StoreNamedProperty(object, name_index, feedback_index(slot), |
| language_mode()); |
| break; |
| case KEYED_PROPERTY: |
| @@ -1100,8 +1080,10 @@ void BytecodeGenerator::VisitPropertyLoad(Register obj, Property* expr) { |
| case VARIABLE: |
| UNREACHABLE(); |
| case NAMED_PROPERTY: { |
| - builder()->LoadLiteral(expr->key()->AsLiteral()->AsPropertyName()); |
| - builder()->LoadNamedProperty(obj, feedback_index(slot), language_mode()); |
| + size_t name_index = builder()->GetConstantPoolEntry( |
| + expr->key()->AsLiteral()->AsPropertyName()); |
| + builder()->LoadNamedProperty(obj, name_index, feedback_index(slot), |
| + language_mode()); |
| break; |
| } |
| case KEYED_PROPERTY: { |
| @@ -1113,13 +1095,13 @@ void BytecodeGenerator::VisitPropertyLoad(Register obj, Property* expr) { |
| case KEYED_SUPER_PROPERTY: |
| UNIMPLEMENTED(); |
| } |
| - execution_result()->SetResultInAccumulator(); |
|
oth
2015/10/22 10:54:30
I find this function scary. It is setting the resu
rmcilroy
2015/10/22 13:27:48
Done - added VisitPropertyLoadForAccumulator for t
|
| } |
| void BytecodeGenerator::VisitProperty(Property* expr) { |
| Register obj = VisitForRegisterValue(expr->obj()); |
| VisitPropertyLoad(obj, expr); |
| + execution_result()->SetResultInAccumulator(); |
| } |
| @@ -1173,12 +1155,9 @@ void BytecodeGenerator::VisitCall(Call* expr) { |
| if (property->IsSuperAccess()) { |
| UNIMPLEMENTED(); |
| } |
| + |
| VisitForAccumulatorValue(property->obj()); |
| builder()->StoreAccumulatorInRegister(receiver); |
| - // Need a result scope here to keep our consecutive |
| - // temporaries. |
| - AccumulatorResultScope accumulator_execution_result(this); |
| - // Perform a property load of the callee. |
| VisitPropertyLoad(receiver, property); |
| builder()->StoreAccumulatorInRegister(callee); |
| break; |
| @@ -1516,19 +1495,7 @@ void BytecodeGenerator::VisitSetHomeObject(Register value, Register home_object, |
| Expression* expr = property->value(); |
| if (!FunctionLiteral::NeedsHomeObject(expr)) return; |
| - // TODO(rmcilroy): Remove UNIMPLEMENTED once we have tests for setting the |
| - // home object. |
| UNIMPLEMENTED(); |
| - |
| - TemporaryRegisterScope temporary_register_scope(builder()); |
| - Register name = temporary_register_scope.NewRegister(); |
| - isolate()->factory()->home_object_symbol(); |
| - builder() |
| - ->LoadLiteral(isolate()->factory()->home_object_symbol()) |
| - .StoreAccumulatorInRegister(name) |
| - .StoreNamedProperty(home_object, name, |
| - feedback_index(property->GetSlot(slot_number)), |
| - language_mode()); |
| } |