Index: src/interpreter/bytecode-generator.cc |
diff --git a/src/interpreter/bytecode-generator.cc b/src/interpreter/bytecode-generator.cc |
index 052f29367dadd6a4fa1b5fca9948f9ffe4c66a41..f67e7b927c28e4a9502c50b1ae98b1c652d48cf9 100644 |
--- a/src/interpreter/bytecode-generator.cc |
+++ b/src/interpreter/bytecode-generator.cc |
@@ -2211,18 +2211,34 @@ void BytecodeGenerator::VisitAssignment(Assignment* expr) { |
LhsKind assign_type = Property::GetAssignType(property); |
// Evaluate LHS expression. |
+ Register lhs_name; |
+ if (expr->HasTypeProfileSlot()) { |
+ lhs_name = register_allocator()->NewRegister(); |
+ } |
+ |
switch (assign_type) { |
case VARIABLE: |
+ if (expr->HasTypeProfileSlot()) { |
+ builder() |
+ ->LoadLiteral(expr->target()->AsVariableProxy()->var()->raw_name()) |
+ .StoreAccumulatorInRegister(lhs_name); |
+ } |
// Nothing to do to evaluate variable assignment LHS. |
break; |
case NAMED_PROPERTY: { |
object = VisitForRegisterValue(property->obj()); |
name = property->key()->AsLiteral()->AsRawPropertyName(); |
+ if (expr->HasTypeProfileSlot()) { |
+ builder()->LoadLiteral(name).StoreAccumulatorInRegister(lhs_name); |
+ } |
break; |
} |
case KEYED_PROPERTY: { |
object = VisitForRegisterValue(property->obj()); |
key = VisitForRegisterValue(property->key()); |
+ if (expr->HasTypeProfileSlot()) { |
+ builder()->StoreAccumulatorInRegister(lhs_name); |
+ } |
break; |
} |
case NAMED_SUPER_PROPERTY: { |
@@ -2235,6 +2251,9 @@ void BytecodeGenerator::VisitAssignment(Assignment* expr) { |
builder() |
->LoadLiteral(property->key()->AsLiteral()->AsRawPropertyName()) |
.StoreAccumulatorInRegister(super_property_args[2]); |
+ if (expr->HasTypeProfileSlot()) { |
+ builder()->StoreAccumulatorInRegister(lhs_name); |
+ } |
break; |
} |
case KEYED_SUPER_PROPERTY: { |
@@ -2245,6 +2264,10 @@ void BytecodeGenerator::VisitAssignment(Assignment* expr) { |
VisitForRegisterValue(super_property->home_object(), |
super_property_args[1]); |
VisitForRegisterValue(property->key(), super_property_args[2]); |
+ if (expr->HasTypeProfileSlot()) { |
+ builder()->StoreAccumulatorInRegister(lhs_name); |
+ } |
+ |
break; |
} |
} |
@@ -2333,6 +2356,14 @@ void BytecodeGenerator::VisitAssignment(Assignment* expr) { |
break; |
} |
} |
+ |
+ // Value is in accumulator. |
+ if (expr->HasTypeProfileSlot()) { |
+ FeedbackSlot collect_type_feedback_slot = expr->TypeProfileSlot(); |
+ |
+ builder()->CollectTypeProfile(lhs_name, |
+ feedback_index(collect_type_feedback_slot)); |
+ } |
} |
void BytecodeGenerator::VisitYield(Yield* expr) { |