| OLD | NEW |
| 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/code_generator.h" | 5 #include "vm/code_generator.h" |
| 6 | 6 |
| 7 #include "vm/assembler_macros.h" | 7 #include "vm/assembler_macros.h" |
| 8 #include "vm/ast.h" | 8 #include "vm/ast.h" |
| 9 #include "vm/bigint_operations.h" | 9 #include "vm/bigint_operations.h" |
| 10 #include "vm/code_patcher.h" | 10 #include "vm/code_patcher.h" |
| (...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 227 ASSERT(type_arguments.IsInstantiated()); | 227 ASSERT(type_arguments.IsInstantiated()); |
| 228 Error& malformed_error = Error::Handle(); | 228 Error& malformed_error = Error::Handle(); |
| 229 if (!type_arguments.IsWithinBoundsOf(cls, | 229 if (!type_arguments.IsWithinBoundsOf(cls, |
| 230 bounds_instantiator, | 230 bounds_instantiator, |
| 231 &malformed_error)) { | 231 &malformed_error)) { |
| 232 ASSERT(!malformed_error.IsNull()); | 232 ASSERT(!malformed_error.IsNull()); |
| 233 // Throw a dynamic type error. | 233 // Throw a dynamic type error. |
| 234 const intptr_t location = GetCallerLocation(); | 234 const intptr_t location = GetCallerLocation(); |
| 235 String& malformed_error_message = String::Handle( | 235 String& malformed_error_message = String::Handle( |
| 236 String::New(malformed_error.ToErrorCString())); | 236 String::New(malformed_error.ToErrorCString())); |
| 237 const String& no_name = String::Handle(Symbols::Empty()); | |
| 238 Exceptions::CreateAndThrowTypeError( | 237 Exceptions::CreateAndThrowTypeError( |
| 239 location, no_name, no_name, no_name, malformed_error_message); | 238 location, Symbols::Empty(), Symbols::Empty(), |
| 239 Symbols::Empty(), malformed_error_message); |
| 240 UNREACHABLE(); | 240 UNREACHABLE(); |
| 241 } | 241 } |
| 242 } | 242 } |
| 243 instance.SetTypeArguments(type_arguments); | 243 instance.SetTypeArguments(type_arguments); |
| 244 } | 244 } |
| 245 | 245 |
| 246 | 246 |
| 247 // Instantiate type arguments. | 247 // Instantiate type arguments. |
| 248 // Arg0: uninstantiated type arguments. | 248 // Arg0: uninstantiated type arguments. |
| 249 // Arg1: instantiator type arguments. | 249 // Arg1: instantiator type arguments. |
| (...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 581 Bool::True() : Bool::False()); | 581 Bool::True() : Bool::False()); |
| 582 if (FLAG_trace_type_checks) { | 582 if (FLAG_trace_type_checks) { |
| 583 PrintTypeCheck("InstanceOf", | 583 PrintTypeCheck("InstanceOf", |
| 584 instance, type, instantiator_type_arguments, result); | 584 instance, type, instantiator_type_arguments, result); |
| 585 } | 585 } |
| 586 if (!result.value() && !malformed_error.IsNull()) { | 586 if (!result.value() && !malformed_error.IsNull()) { |
| 587 // Throw a dynamic type error only if the instanceof test fails. | 587 // Throw a dynamic type error only if the instanceof test fails. |
| 588 const intptr_t location = GetCallerLocation(); | 588 const intptr_t location = GetCallerLocation(); |
| 589 String& malformed_error_message = String::Handle( | 589 String& malformed_error_message = String::Handle( |
| 590 String::New(malformed_error.ToErrorCString())); | 590 String::New(malformed_error.ToErrorCString())); |
| 591 const String& no_name = String::Handle(Symbols::Empty()); | |
| 592 Exceptions::CreateAndThrowTypeError( | 591 Exceptions::CreateAndThrowTypeError( |
| 593 location, no_name, no_name, no_name, malformed_error_message); | 592 location, Symbols::Empty(), Symbols::Empty(), |
| 593 Symbols::Empty(), malformed_error_message); |
| 594 UNREACHABLE(); | 594 UNREACHABLE(); |
| 595 } | 595 } |
| 596 UpdateTypeTestCache(instance, type, instantiator, | 596 UpdateTypeTestCache(instance, type, instantiator, |
| 597 instantiator_type_arguments, result, cache); | 597 instantiator_type_arguments, result, cache); |
| 598 arguments.SetReturn(result); | 598 arguments.SetReturn(result); |
| 599 } | 599 } |
| 600 | 600 |
| 601 | 601 |
| 602 // Check that the type of the given instance is a subtype of the given type and | 602 // Check that the type of the given instance is a subtype of the given type and |
| 603 // can therefore be assigned. | 603 // can therefore be assigned. |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 700 ASSERT(arguments.ArgCount() == | 700 ASSERT(arguments.ArgCount() == |
| 701 kConditionTypeErrorRuntimeEntry.argument_count()); | 701 kConditionTypeErrorRuntimeEntry.argument_count()); |
| 702 const intptr_t location = GetCallerLocation(); | 702 const intptr_t location = GetCallerLocation(); |
| 703 const Instance& src_instance = Instance::CheckedHandle(arguments.ArgAt(0)); | 703 const Instance& src_instance = Instance::CheckedHandle(arguments.ArgAt(0)); |
| 704 ASSERT(src_instance.IsNull() || !src_instance.IsBool()); | 704 ASSERT(src_instance.IsNull() || !src_instance.IsBool()); |
| 705 const Type& bool_interface = Type::Handle(Type::BoolType()); | 705 const Type& bool_interface = Type::Handle(Type::BoolType()); |
| 706 const AbstractType& src_type = AbstractType::Handle(src_instance.GetType()); | 706 const AbstractType& src_type = AbstractType::Handle(src_instance.GetType()); |
| 707 const String& src_type_name = String::Handle(src_type.UserVisibleName()); | 707 const String& src_type_name = String::Handle(src_type.UserVisibleName()); |
| 708 const String& bool_type_name = | 708 const String& bool_type_name = |
| 709 String::Handle(bool_interface.UserVisibleName()); | 709 String::Handle(bool_interface.UserVisibleName()); |
| 710 const String& expr = String::Handle(Symbols::New("boolean expression")); | |
| 711 const String& no_malformed_type_error = String::Handle(); | 710 const String& no_malformed_type_error = String::Handle(); |
| 712 Exceptions::CreateAndThrowTypeError(location, src_type_name, bool_type_name, | 711 Exceptions::CreateAndThrowTypeError(location, src_type_name, bool_type_name, |
| 713 expr, no_malformed_type_error); | 712 Symbols::BooleanExpression(), |
| 713 no_malformed_type_error); |
| 714 UNREACHABLE(); | 714 UNREACHABLE(); |
| 715 } | 715 } |
| 716 | 716 |
| 717 | 717 |
| 718 // Report that the type of the type check is malformed. | 718 // Report that the type of the type check is malformed. |
| 719 // Arg0: src value. | 719 // Arg0: src value. |
| 720 // Arg1: name of instance being assigned to. | 720 // Arg1: name of instance being assigned to. |
| 721 // Arg2: malformed type error message. | 721 // Arg2: malformed type error message. |
| 722 // Return value: none, throws an exception. | 722 // Return value: none, throws an exception. |
| 723 DEFINE_RUNTIME_ENTRY(MalformedTypeError, 3) { | 723 DEFINE_RUNTIME_ENTRY(MalformedTypeError, 3) { |
| 724 ASSERT(arguments.ArgCount() == | 724 ASSERT(arguments.ArgCount() == |
| 725 kMalformedTypeErrorRuntimeEntry.argument_count()); | 725 kMalformedTypeErrorRuntimeEntry.argument_count()); |
| 726 const intptr_t location = GetCallerLocation(); | 726 const intptr_t location = GetCallerLocation(); |
| 727 const Instance& src_value = Instance::CheckedHandle(arguments.ArgAt(0)); | 727 const Instance& src_value = Instance::CheckedHandle(arguments.ArgAt(0)); |
| 728 const String& dst_name = String::CheckedHandle(arguments.ArgAt(1)); | 728 const String& dst_name = String::CheckedHandle(arguments.ArgAt(1)); |
| 729 const String& malformed_error = String::CheckedHandle(arguments.ArgAt(2)); | 729 const String& malformed_error = String::CheckedHandle(arguments.ArgAt(2)); |
| 730 const String& dst_type_name = String::Handle(Symbols::New("malformed")); | |
| 731 const AbstractType& src_type = AbstractType::Handle(src_value.GetType()); | 730 const AbstractType& src_type = AbstractType::Handle(src_value.GetType()); |
| 732 const String& src_type_name = String::Handle(src_type.UserVisibleName()); | 731 const String& src_type_name = String::Handle(src_type.UserVisibleName()); |
| 733 Exceptions::CreateAndThrowTypeError(location, src_type_name, | 732 Exceptions::CreateAndThrowTypeError(location, src_type_name, |
| 734 dst_type_name, dst_name, malformed_error); | 733 Symbols::Malformed(), |
| 734 dst_name, malformed_error); |
| 735 UNREACHABLE(); | 735 UNREACHABLE(); |
| 736 } | 736 } |
| 737 | 737 |
| 738 | 738 |
| 739 DEFINE_RUNTIME_ENTRY(Throw, 1) { | 739 DEFINE_RUNTIME_ENTRY(Throw, 1) { |
| 740 ASSERT(arguments.ArgCount() == kThrowRuntimeEntry.argument_count()); | 740 ASSERT(arguments.ArgCount() == kThrowRuntimeEntry.argument_count()); |
| 741 const Instance& exception = Instance::CheckedHandle(arguments.ArgAt(0)); | 741 const Instance& exception = Instance::CheckedHandle(arguments.ArgAt(0)); |
| 742 Exceptions::Throw(exception); | 742 Exceptions::Throw(exception); |
| 743 } | 743 } |
| 744 | 744 |
| (...skipping 1054 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1799 return; | 1799 return; |
| 1800 } | 1800 } |
| 1801 HeapTrace* heap_trace = Isolate::Current()->heap()->trace(); | 1801 HeapTrace* heap_trace = Isolate::Current()->heap()->trace(); |
| 1802 heap_trace->TraceStoreIntoObject(RawObject::ToAddr(object), | 1802 heap_trace->TraceStoreIntoObject(RawObject::ToAddr(object), |
| 1803 field_addr, | 1803 field_addr, |
| 1804 RawObject::ToAddr(value)); | 1804 RawObject::ToAddr(value)); |
| 1805 } | 1805 } |
| 1806 END_LEAF_RUNTIME_ENTRY | 1806 END_LEAF_RUNTIME_ENTRY |
| 1807 | 1807 |
| 1808 } // namespace dart | 1808 } // namespace dart |
| OLD | NEW |