Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(55)

Unified Diff: src/interpreter/bytecode-generator.cc

Issue 2142333002: Refactor class declaration logic to the parser and runtime Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: minor cleanup per Adam Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/interpreter/bytecode-generator.cc
diff --git a/src/interpreter/bytecode-generator.cc b/src/interpreter/bytecode-generator.cc
index d7445c5d5cadaa21ec76b843d383a692f65a7511..51c623604f2243f57301410ea61be939e9f49bef 100644
--- a/src/interpreter/bytecode-generator.cc
+++ b/src/interpreter/bytecode-generator.cc
@@ -1304,154 +1304,6 @@ void BytecodeGenerator::VisitFunctionLiteral(FunctionLiteral* expr) {
execution_result()->SetResultInAccumulator();
}
-void BytecodeGenerator::VisitClassLiteral(ClassLiteral* expr) {
- if (expr->scope()->ContextLocalCount() > 0) {
- VisitNewLocalBlockContext(expr->scope());
- ContextScope scope(this, expr->scope());
- VisitDeclarations(expr->scope()->declarations());
- VisitClassLiteralContents(expr);
- } else {
- VisitDeclarations(expr->scope()->declarations());
- VisitClassLiteralContents(expr);
- }
-}
-
-void BytecodeGenerator::VisitClassLiteralContents(ClassLiteral* expr) {
- VisitClassLiteralForRuntimeDefinition(expr);
-
- // Load the "prototype" from the constructor.
- register_allocator()->PrepareForConsecutiveAllocations(2);
- Register literal = register_allocator()->NextConsecutiveRegister();
- Register prototype = register_allocator()->NextConsecutiveRegister();
- Handle<String> name = isolate()->factory()->prototype_string();
- FeedbackVectorSlot slot = expr->PrototypeSlot();
- builder()
- ->StoreAccumulatorInRegister(literal)
- .LoadNamedProperty(literal, name, feedback_index(slot))
- .StoreAccumulatorInRegister(prototype);
-
- VisitClassLiteralProperties(expr, literal, prototype);
- builder()->CallRuntime(Runtime::kToFastProperties, literal, 1);
- // Assign to class variable.
- if (expr->class_variable_proxy() != nullptr) {
- Variable* var = expr->class_variable_proxy()->var();
- FeedbackVectorSlot slot = expr->NeedsProxySlot()
- ? expr->ProxySlot()
- : FeedbackVectorSlot::Invalid();
- VisitVariableAssignment(var, Token::INIT, slot);
- }
- execution_result()->SetResultInAccumulator();
-}
-
-void BytecodeGenerator::VisitClassLiteralForRuntimeDefinition(
- ClassLiteral* expr) {
- AccumulatorResultScope result_scope(this);
- register_allocator()->PrepareForConsecutiveAllocations(4);
- Register extends = register_allocator()->NextConsecutiveRegister();
- Register constructor = register_allocator()->NextConsecutiveRegister();
- Register start_position = register_allocator()->NextConsecutiveRegister();
- Register end_position = register_allocator()->NextConsecutiveRegister();
-
- VisitForAccumulatorValueOrTheHole(expr->extends());
- builder()->StoreAccumulatorInRegister(extends);
-
- VisitForAccumulatorValue(expr->constructor());
- builder()
- ->StoreAccumulatorInRegister(constructor)
- .LoadLiteral(Smi::FromInt(expr->start_position()))
- .StoreAccumulatorInRegister(start_position)
- .LoadLiteral(Smi::FromInt(expr->end_position()))
- .StoreAccumulatorInRegister(end_position)
- .CallRuntime(Runtime::kDefineClass, extends, 4);
- result_scope.SetResultInAccumulator();
-}
-
-void BytecodeGenerator::VisitClassLiteralProperties(ClassLiteral* expr,
- Register literal,
- Register prototype) {
- RegisterAllocationScope register_scope(this);
- register_allocator()->PrepareForConsecutiveAllocations(5);
- Register receiver = register_allocator()->NextConsecutiveRegister();
- Register key = register_allocator()->NextConsecutiveRegister();
- Register value = register_allocator()->NextConsecutiveRegister();
- Register attr = register_allocator()->NextConsecutiveRegister();
- Register set_function_name = register_allocator()->NextConsecutiveRegister();
-
- bool attr_assigned = false;
- Register old_receiver = Register::invalid_value();
-
- // Create nodes to store method values into the literal.
- for (int i = 0; i < expr->properties()->length(); i++) {
- ObjectLiteral::Property* property = expr->properties()->at(i);
-
- // Set-up receiver.
- Register new_receiver = property->is_static() ? literal : prototype;
- if (new_receiver != old_receiver) {
- builder()->MoveRegister(new_receiver, receiver);
- old_receiver = new_receiver;
- }
-
- VisitForAccumulatorValue(property->key());
- builder()->CastAccumulatorToName().StoreAccumulatorInRegister(key);
- // The static prototype property is read only. We handle the non computed
- // property name case in the parser. Since this is the only case where we
- // need to check for an own read only property we special case this so we do
- // not need to do this for every property.
- if (property->is_static() && property->is_computed_name()) {
- VisitClassLiteralStaticPrototypeWithComputedName(key);
- }
- VisitForAccumulatorValue(property->value());
- builder()->StoreAccumulatorInRegister(value);
-
- VisitSetHomeObject(value, receiver, property);
-
- if (!attr_assigned) {
- builder()
- ->LoadLiteral(Smi::FromInt(DONT_ENUM))
- .StoreAccumulatorInRegister(attr);
- attr_assigned = true;
- }
-
- switch (property->kind()) {
- case ObjectLiteral::Property::CONSTANT:
- case ObjectLiteral::Property::MATERIALIZED_LITERAL:
- case ObjectLiteral::Property::PROTOTYPE:
- // Invalid properties for ES6 classes.
- UNREACHABLE();
- break;
- case ObjectLiteral::Property::COMPUTED: {
- builder()
- ->LoadLiteral(Smi::FromInt(property->NeedsSetFunctionName()))
- .StoreAccumulatorInRegister(set_function_name);
- builder()->CallRuntime(Runtime::kDefineDataPropertyInLiteral, receiver,
- 5);
- break;
- }
- case ObjectLiteral::Property::GETTER: {
- builder()->CallRuntime(Runtime::kDefineGetterPropertyUnchecked,
- receiver, 4);
- break;
- }
- case ObjectLiteral::Property::SETTER: {
- builder()->CallRuntime(Runtime::kDefineSetterPropertyUnchecked,
- receiver, 4);
- break;
- }
- }
- }
-}
-
-void BytecodeGenerator::VisitClassLiteralStaticPrototypeWithComputedName(
- Register key) {
- BytecodeLabel done;
- builder()
- ->LoadLiteral(isolate()->factory()->prototype_string())
- .CompareOperation(Token::Value::EQ_STRICT, key)
- .JumpIfFalse(&done)
- .CallRuntime(Runtime::kThrowStaticPrototypeError, Register(0), 0)
- .Bind(&done);
-}
-
void BytecodeGenerator::VisitNativeFunctionLiteral(
NativeFunctionLiteral* expr) {
// Find or build a shared function info for the native function template.

Powered by Google App Engine
This is Rietveld 408576698