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

Side by Side Diff: runtime/vm/flow_graph_builder.cc

Issue 10827288: - Support for patching of class methods and fields. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 4 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "vm/flow_graph_builder.h" 5 #include "vm/flow_graph_builder.h"
6 6
7 #include "vm/ast_printer.h" 7 #include "vm/ast_printer.h"
8 #include "vm/bit_vector.h" 8 #include "vm/bit_vector.h"
9 #include "vm/code_descriptors.h" 9 #include "vm/code_descriptors.h"
10 #include "vm/dart_entry.h" 10 #include "vm/dart_entry.h"
(...skipping 572 matching lines...) Expand 10 before | Expand all | Expand 10 after
583 } 583 }
584 584
585 585
586 void EffectGraphVisitor::BuildTypecheckArguments( 586 void EffectGraphVisitor::BuildTypecheckArguments(
587 intptr_t token_pos, 587 intptr_t token_pos,
588 Value** instantiator_result, 588 Value** instantiator_result,
589 Value** instantiator_type_arguments_result) { 589 Value** instantiator_type_arguments_result) {
590 Value* instantiator = NULL; 590 Value* instantiator = NULL;
591 Value* instantiator_type_arguments = NULL; 591 Value* instantiator_type_arguments = NULL;
592 const Class& instantiator_class = Class::Handle( 592 const Class& instantiator_class = Class::Handle(
593 owner()->parsed_function().function().owner()); 593 owner()->parsed_function().function().Owner());
594 // Since called only when type tested against is not instantiated. 594 // Since called only when type tested against is not instantiated.
595 ASSERT(instantiator_class.NumTypeParameters() > 0); 595 ASSERT(instantiator_class.NumTypeParameters() > 0);
596 instantiator = BuildInstantiator(); 596 instantiator = BuildInstantiator();
597 if (instantiator == NULL) { 597 if (instantiator == NULL) {
598 // No instantiator when inside factory. 598 // No instantiator when inside factory.
599 instantiator = BuildNullValue(); 599 instantiator = BuildNullValue();
600 instantiator_type_arguments = 600 instantiator_type_arguments =
601 BuildInstantiatorTypeArguments(token_pos, NULL); 601 BuildInstantiatorTypeArguments(token_pos, NULL);
602 } else { 602 } else {
603 // Preserve instantiator. 603 // Preserve instantiator.
(...skipping 844 matching lines...) Expand 10 before | Expand all | Expand 10 after
1448 Value* context = Bind(new CurrentContextComp()); 1448 Value* context = Bind(new CurrentContextComp());
1449 Value* clone = Bind(new CloneContextComp(node->token_pos(), 1449 Value* clone = Bind(new CloneContextComp(node->token_pos(),
1450 owner()->try_index(), 1450 owner()->try_index(),
1451 context)); 1451 context));
1452 ReturnComputation(new StoreContextComp(clone)); 1452 ReturnComputation(new StoreContextComp(clone));
1453 } 1453 }
1454 1454
1455 1455
1456 Value* EffectGraphVisitor::BuildObjectAllocation( 1456 Value* EffectGraphVisitor::BuildObjectAllocation(
1457 ConstructorCallNode* node) { 1457 ConstructorCallNode* node) {
1458 const Class& cls = Class::ZoneHandle(node->constructor().owner()); 1458 const Class& cls = Class::ZoneHandle(node->constructor().Owner());
1459 const bool requires_type_arguments = cls.HasTypeArguments(); 1459 const bool requires_type_arguments = cls.HasTypeArguments();
1460 1460
1461 // In checked mode, if the type arguments are uninstantiated, they may need to 1461 // In checked mode, if the type arguments are uninstantiated, they may need to
1462 // be checked against declared bounds at run time. 1462 // be checked against declared bounds at run time.
1463 Computation* allocate_comp = NULL; 1463 Computation* allocate_comp = NULL;
1464 if (FLAG_enable_type_checks && 1464 if (FLAG_enable_type_checks &&
1465 requires_type_arguments && 1465 requires_type_arguments &&
1466 !node->type_arguments().IsNull() && 1466 !node->type_arguments().IsNull() &&
1467 !node->type_arguments().IsInstantiated() && 1467 !node->type_arguments().IsInstantiated() &&
1468 !node->type_arguments().IsWithinBoundsOf(cls, 1468 !node->type_arguments().IsWithinBoundsOf(cls,
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
1544 // StaticCall(constructor, t_n+1, t_n+2, ...) 1544 // StaticCall(constructor, t_n+1, t_n+2, ...)
1545 // No need to preserve allocated value (simpler than in ValueGraphVisitor). 1545 // No need to preserve allocated value (simpler than in ValueGraphVisitor).
1546 Value* allocated_value = BuildObjectAllocation(node); 1546 Value* allocated_value = BuildObjectAllocation(node);
1547 PushArgumentInstr* push_allocated_value = PushArgument(allocated_value); 1547 PushArgumentInstr* push_allocated_value = PushArgument(allocated_value);
1548 BuildConstructorCall(node, push_allocated_value); 1548 BuildConstructorCall(node, push_allocated_value);
1549 } 1549 }
1550 1550
1551 1551
1552 Value* EffectGraphVisitor::BuildInstantiator() { 1552 Value* EffectGraphVisitor::BuildInstantiator() {
1553 const Class& instantiator_class = Class::Handle( 1553 const Class& instantiator_class = Class::Handle(
1554 owner()->parsed_function().function().owner()); 1554 owner()->parsed_function().function().Owner());
1555 if (instantiator_class.NumTypeParameters() == 0) { 1555 if (instantiator_class.NumTypeParameters() == 0) {
1556 return NULL; 1556 return NULL;
1557 } 1557 }
1558 Function& outer_function = 1558 Function& outer_function =
1559 Function::Handle(owner()->parsed_function().function().raw()); 1559 Function::Handle(owner()->parsed_function().function().raw());
1560 while (outer_function.IsLocalFunction()) { 1560 while (outer_function.IsLocalFunction()) {
1561 outer_function = outer_function.parent_function(); 1561 outer_function = outer_function.parent_function();
1562 } 1562 }
1563 if (outer_function.IsFactory()) { 1563 if (outer_function.IsFactory()) {
1564 return NULL; 1564 return NULL;
1565 } 1565 }
1566 1566
1567 ASSERT(owner()->parsed_function().instantiator() != NULL); 1567 ASSERT(owner()->parsed_function().instantiator() != NULL);
1568 ValueGraphVisitor for_instantiator(owner(), temp_index()); 1568 ValueGraphVisitor for_instantiator(owner(), temp_index());
1569 owner()->parsed_function().instantiator()->Visit(&for_instantiator); 1569 owner()->parsed_function().instantiator()->Visit(&for_instantiator);
1570 Append(for_instantiator); 1570 Append(for_instantiator);
1571 return for_instantiator.value(); 1571 return for_instantiator.value();
1572 } 1572 }
1573 1573
1574 1574
1575 // 'expression_temp_var' may not be used inside this method if 'instantiator' 1575 // 'expression_temp_var' may not be used inside this method if 'instantiator'
1576 // is not NULL. 1576 // is not NULL.
1577 Value* EffectGraphVisitor::BuildInstantiatorTypeArguments( 1577 Value* EffectGraphVisitor::BuildInstantiatorTypeArguments(
1578 intptr_t token_pos, Value* instantiator) { 1578 intptr_t token_pos, Value* instantiator) {
1579 const Class& instantiator_class = Class::Handle( 1579 const Class& instantiator_class = Class::Handle(
1580 owner()->parsed_function().function().owner()); 1580 owner()->parsed_function().function().Owner());
1581 if (instantiator_class.NumTypeParameters() == 0) { 1581 if (instantiator_class.NumTypeParameters() == 0) {
1582 // The type arguments are compile time constants. 1582 // The type arguments are compile time constants.
1583 AbstractTypeArguments& type_arguments = AbstractTypeArguments::ZoneHandle(); 1583 AbstractTypeArguments& type_arguments = AbstractTypeArguments::ZoneHandle();
1584 // Type is temporary. Only its type arguments are preserved. 1584 // Type is temporary. Only its type arguments are preserved.
1585 Type& type = Type::Handle( 1585 Type& type = Type::Handle(
1586 Type::New(instantiator_class, type_arguments, token_pos, Heap::kNew)); 1586 Type::New(instantiator_class, type_arguments, token_pos, Heap::kNew));
1587 type ^= ClassFinalizer::FinalizeType( 1587 type ^= ClassFinalizer::FinalizeType(
1588 instantiator_class, type, ClassFinalizer::kFinalize); 1588 instantiator_class, type, ClassFinalizer::kFinalize);
1589 ASSERT(!type.IsMalformed()); 1589 ASSERT(!type.IsMalformed());
1590 type_arguments = type.arguments(); 1590 type_arguments = type.arguments();
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
1637 type_arguments, 1637 type_arguments,
1638 instantiator_value)); 1638 instantiator_value));
1639 } 1639 }
1640 1640
1641 1641
1642 void EffectGraphVisitor::BuildConstructorTypeArguments( 1642 void EffectGraphVisitor::BuildConstructorTypeArguments(
1643 ConstructorCallNode* node, 1643 ConstructorCallNode* node,
1644 Value** type_arguments, 1644 Value** type_arguments,
1645 Value** instantiator, 1645 Value** instantiator,
1646 ZoneGrowableArray<PushArgumentInstr*>* call_arguments) { 1646 ZoneGrowableArray<PushArgumentInstr*>* call_arguments) {
1647 const Class& cls = Class::ZoneHandle(node->constructor().owner()); 1647 const Class& cls = Class::ZoneHandle(node->constructor().Owner());
1648 ASSERT(cls.HasTypeArguments() && !node->constructor().IsFactory()); 1648 ASSERT(cls.HasTypeArguments() && !node->constructor().IsFactory());
1649 if (node->type_arguments().IsNull() || 1649 if (node->type_arguments().IsNull() ||
1650 node->type_arguments().IsInstantiated()) { 1650 node->type_arguments().IsInstantiated()) {
1651 Value* type_arguments_val = Bind(new ConstantVal(node->type_arguments())); 1651 Value* type_arguments_val = Bind(new ConstantVal(node->type_arguments()));
1652 if (call_arguments != NULL) { 1652 if (call_arguments != NULL) {
1653 ASSERT(type_arguments == NULL); 1653 ASSERT(type_arguments == NULL);
1654 call_arguments->Add(PushArgument(type_arguments_val)); 1654 call_arguments->Add(PushArgument(type_arguments_val));
1655 } else { 1655 } else {
1656 ASSERT(type_arguments != NULL); 1656 ASSERT(type_arguments != NULL);
1657 *type_arguments = type_arguments_val; 1657 *type_arguments = type_arguments_val;
(...skipping 1165 matching lines...) Expand 10 before | Expand all | Expand 10 after
2823 intptr_t len = OS::SNPrint(NULL, 0, kFormat, function_name, reason) + 1; 2823 intptr_t len = OS::SNPrint(NULL, 0, kFormat, function_name, reason) + 1;
2824 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len); 2824 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len);
2825 OS::SNPrint(chars, len, kFormat, function_name, reason); 2825 OS::SNPrint(chars, len, kFormat, function_name, reason);
2826 const Error& error = Error::Handle( 2826 const Error& error = Error::Handle(
2827 LanguageError::New(String::Handle(String::New(chars)))); 2827 LanguageError::New(String::Handle(String::New(chars))));
2828 Isolate::Current()->long_jump_base()->Jump(1, error); 2828 Isolate::Current()->long_jump_base()->Jump(1, error);
2829 } 2829 }
2830 2830
2831 2831
2832 } // namespace dart 2832 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/exceptions.cc ('k') | runtime/vm/il_printer.cc » ('j') | runtime/vm/object.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698