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

Side by Side Diff: src/interpreter/bytecode-generator.cc

Issue 1626423003: Support computed properties for ES2015 Function.name (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Mostly working Created 4 years, 10 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 unified diff | Download patch
OLDNEW
1 // Copyright 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/interpreter/bytecode-generator.h" 5 #include "src/interpreter/bytecode-generator.h"
6 6
7 #include "src/ast/scopes.h" 7 #include "src/ast/scopes.h"
8 #include "src/compiler.h" 8 #include "src/compiler.h"
9 #include "src/interpreter/bytecode-register-allocator.h" 9 #include "src/interpreter/bytecode-register-allocator.h"
10 #include "src/interpreter/control-flow-builders.h" 10 #include "src/interpreter/control-flow-builders.h"
(...skipping 1401 matching lines...) Expand 10 before | Expand all | Expand 10 after
1412 register_allocator()->NextConsecutiveRegister(); 1412 register_allocator()->NextConsecutiveRegister();
1413 Register value = register_allocator()->NextConsecutiveRegister(); 1413 Register value = register_allocator()->NextConsecutiveRegister();
1414 1414
1415 builder()->MoveRegister(literal, literal_argument); 1415 builder()->MoveRegister(literal, literal_argument);
1416 VisitForAccumulatorValue(property->value()); 1416 VisitForAccumulatorValue(property->value());
1417 builder()->StoreAccumulatorInRegister(value).CallRuntime( 1417 builder()->StoreAccumulatorInRegister(value).CallRuntime(
1418 Runtime::kInternalSetPrototype, literal_argument, 2); 1418 Runtime::kInternalSetPrototype, literal_argument, 2);
1419 continue; 1419 continue;
1420 } 1420 }
1421 1421
1422 register_allocator()->PrepareForConsecutiveAllocations(4); 1422 register_allocator()->PrepareForConsecutiveAllocations(5);
1423 Register literal_argument = register_allocator()->NextConsecutiveRegister(); 1423 Register literal_argument = register_allocator()->NextConsecutiveRegister();
1424 Register key = register_allocator()->NextConsecutiveRegister(); 1424 Register key = register_allocator()->NextConsecutiveRegister();
1425 Register value = register_allocator()->NextConsecutiveRegister(); 1425 Register value = register_allocator()->NextConsecutiveRegister();
1426 Register attr = register_allocator()->NextConsecutiveRegister(); 1426 Register attr = register_allocator()->NextConsecutiveRegister();
1427 DCHECK(Register::AreContiguous(literal_argument, key, value, attr)); 1427 DCHECK(Register::AreContiguous(literal_argument, key, value, attr));
1428 Register set_function_name =
1429 register_allocator()->NextConsecutiveRegister();
1428 1430
1429 builder()->MoveRegister(literal, literal_argument); 1431 builder()->MoveRegister(literal, literal_argument);
1430 VisitForAccumulatorValue(property->key()); 1432 VisitForAccumulatorValue(property->key());
1431 builder()->CastAccumulatorToName().StoreAccumulatorInRegister(key); 1433 builder()->CastAccumulatorToName().StoreAccumulatorInRegister(key);
1432 VisitForAccumulatorValue(property->value()); 1434 VisitForAccumulatorValue(property->value());
1433 builder()->StoreAccumulatorInRegister(value); 1435 builder()->StoreAccumulatorInRegister(value);
1434 VisitSetHomeObject(value, literal, property); 1436 VisitSetHomeObject(value, literal, property);
1435 builder()->LoadLiteral(Smi::FromInt(NONE)).StoreAccumulatorInRegister(attr); 1437 builder()->LoadLiteral(Smi::FromInt(NONE)).StoreAccumulatorInRegister(attr);
1436 Runtime::FunctionId function_id = static_cast<Runtime::FunctionId>(-1);
1437 switch (property->kind()) { 1438 switch (property->kind()) {
1438 case ObjectLiteral::Property::CONSTANT: 1439 case ObjectLiteral::Property::CONSTANT:
1439 case ObjectLiteral::Property::COMPUTED: 1440 case ObjectLiteral::Property::COMPUTED:
1440 case ObjectLiteral::Property::MATERIALIZED_LITERAL: 1441 case ObjectLiteral::Property::MATERIALIZED_LITERAL:
1441 function_id = Runtime::kDefineDataPropertyUnchecked; 1442 builder()
1443 ->LoadLiteral(Smi::FromInt(property->NeedsSetFunctionName()))
1444 .StoreAccumulatorInRegister(set_function_name);
1445 builder()->CallRuntime(Runtime::kDefineDataPropertyInLiteral,
1446 literal_argument, 5);
1442 break; 1447 break;
1443 case ObjectLiteral::Property::PROTOTYPE: 1448 case ObjectLiteral::Property::PROTOTYPE:
1444 UNREACHABLE(); // Handled specially above. 1449 UNREACHABLE(); // Handled specially above.
1445 break; 1450 break;
1446 case ObjectLiteral::Property::GETTER: 1451 case ObjectLiteral::Property::GETTER:
1447 function_id = Runtime::kDefineGetterPropertyUnchecked; 1452 builder()->CallRuntime(Runtime::kDefineGetterPropertyUnchecked,
1453 literal_argument, 4);
1448 break; 1454 break;
1449 case ObjectLiteral::Property::SETTER: 1455 case ObjectLiteral::Property::SETTER:
1450 function_id = Runtime::kDefineSetterPropertyUnchecked; 1456 builder()->CallRuntime(Runtime::kDefineSetterPropertyUnchecked,
1457 literal_argument, 4);
1451 break; 1458 break;
1452 } 1459 }
1453 builder()->CallRuntime(function_id, literal_argument, 4);
1454 } 1460 }
1455 1461
1456 // Transform literals that contain functions to fast properties. 1462 // Transform literals that contain functions to fast properties.
1457 if (expr->has_function()) { 1463 if (expr->has_function()) {
1458 builder()->CallRuntime(Runtime::kToFastProperties, literal, 1); 1464 builder()->CallRuntime(Runtime::kToFastProperties, literal, 1);
1459 } 1465 }
1460 1466
1461 execution_result()->SetResultInRegister(literal); 1467 execution_result()->SetResultInRegister(literal);
1462 } 1468 }
1463 1469
(...skipping 1043 matching lines...) Expand 10 before | Expand all | Expand 10 after
2507 } 2513 }
2508 2514
2509 2515
2510 int BytecodeGenerator::feedback_index(FeedbackVectorSlot slot) const { 2516 int BytecodeGenerator::feedback_index(FeedbackVectorSlot slot) const {
2511 return info()->feedback_vector()->GetIndex(slot); 2517 return info()->feedback_vector()->GetIndex(slot);
2512 } 2518 }
2513 2519
2514 } // namespace interpreter 2520 } // namespace interpreter
2515 } // namespace internal 2521 } // namespace internal
2516 } // namespace v8 2522 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698