| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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.h" | 7 #include "vm/assembler.h" |
| 8 #include "vm/ast.h" | 8 #include "vm/ast.h" |
| 9 #include "vm/code_patcher.h" | 9 #include "vm/code_patcher.h" |
| 10 #include "vm/compiler.h" | 10 #include "vm/compiler.h" |
| (...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 331 // Helper routine for tracing a type check. | 331 // Helper routine for tracing a type check. |
| 332 static void PrintTypeCheck(const char* message, | 332 static void PrintTypeCheck(const char* message, |
| 333 const Instance& instance, | 333 const Instance& instance, |
| 334 const AbstractType& type, | 334 const AbstractType& type, |
| 335 const TypeArguments& instantiator_type_arguments, | 335 const TypeArguments& instantiator_type_arguments, |
| 336 const Bool& result) { | 336 const Bool& result) { |
| 337 DartFrameIterator iterator; | 337 DartFrameIterator iterator; |
| 338 StackFrame* caller_frame = iterator.NextFrame(); | 338 StackFrame* caller_frame = iterator.NextFrame(); |
| 339 ASSERT(caller_frame != NULL); | 339 ASSERT(caller_frame != NULL); |
| 340 | 340 |
| 341 const AbstractType& instance_type = AbstractType::Handle(instance.GetType()); | 341 const AbstractType& instance_type = |
| 342 AbstractType::Handle(instance.GetType(Heap::kNew)); |
| 342 ASSERT(instance_type.IsInstantiated()); | 343 ASSERT(instance_type.IsInstantiated()); |
| 343 if (type.IsInstantiated()) { | 344 if (type.IsInstantiated()) { |
| 344 OS::PrintErr("%s: '%s' %" Pd " %s '%s' %" Pd " (pc: %#" Px ").\n", message, | 345 OS::PrintErr("%s: '%s' %" Pd " %s '%s' %" Pd " (pc: %#" Px ").\n", message, |
| 345 String::Handle(instance_type.Name()).ToCString(), | 346 String::Handle(instance_type.Name()).ToCString(), |
| 346 Class::Handle(instance_type.type_class()).id(), | 347 Class::Handle(instance_type.type_class()).id(), |
| 347 (result.raw() == Bool::True().raw()) ? "is" : "is !", | 348 (result.raw() == Bool::True().raw()) ? "is" : "is !", |
| 348 String::Handle(type.Name()).ToCString(), | 349 String::Handle(type.Name()).ToCString(), |
| 349 Class::Handle(type.type_class()).id(), caller_frame->pc()); | 350 Class::Handle(type.type_class()).id(), caller_frame->pc()); |
| 350 } else { | 351 } else { |
| 351 // Instantiate type before printing. | 352 // Instantiate type before printing. |
| (...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 544 dst_type, instantiator_type_arguments, &bound_error); | 545 dst_type, instantiator_type_arguments, &bound_error); |
| 545 | 546 |
| 546 if (FLAG_trace_type_checks) { | 547 if (FLAG_trace_type_checks) { |
| 547 PrintTypeCheck("TypeCheck", src_instance, dst_type, | 548 PrintTypeCheck("TypeCheck", src_instance, dst_type, |
| 548 instantiator_type_arguments, Bool::Get(is_instance_of)); | 549 instantiator_type_arguments, Bool::Get(is_instance_of)); |
| 549 } | 550 } |
| 550 if (!is_instance_of) { | 551 if (!is_instance_of) { |
| 551 // Throw a dynamic type error. | 552 // Throw a dynamic type error. |
| 552 const TokenPosition location = GetCallerLocation(); | 553 const TokenPosition location = GetCallerLocation(); |
| 553 const AbstractType& src_type = | 554 const AbstractType& src_type = |
| 554 AbstractType::Handle(zone, src_instance.GetType()); | 555 AbstractType::Handle(zone, src_instance.GetType(Heap::kNew)); |
| 555 if (!dst_type.IsInstantiated()) { | 556 if (!dst_type.IsInstantiated()) { |
| 556 // Instantiate dst_type before reporting the error. | 557 // Instantiate dst_type before reporting the error. |
| 557 dst_type = dst_type.InstantiateFrom(instantiator_type_arguments, NULL, | 558 dst_type = dst_type.InstantiateFrom(instantiator_type_arguments, NULL, |
| 558 NULL, NULL, Heap::kNew); | 559 NULL, NULL, Heap::kNew); |
| 559 // Note that instantiated dst_type may be malbounded. | 560 // Note that instantiated dst_type may be malbounded. |
| 560 } | 561 } |
| 561 String& bound_error_message = String::Handle(zone); | 562 String& bound_error_message = String::Handle(zone); |
| 562 if (!bound_error.IsNull()) { | 563 if (!bound_error.IsNull()) { |
| 563 ASSERT(isolate->type_checks()); | 564 ASSERT(isolate->type_checks()); |
| 564 bound_error_message = String::New(bound_error.ToErrorCString()); | 565 bound_error_message = String::New(bound_error.ToErrorCString()); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 596 args.SetAt(2, Smi::Handle(zone, Smi::New(0))); | 597 args.SetAt(2, Smi::Handle(zone, Smi::New(0))); |
| 597 args.SetAt(3, Smi::Handle(zone, Smi::New(0))); | 598 args.SetAt(3, Smi::Handle(zone, Smi::New(0))); |
| 598 | 599 |
| 599 Exceptions::ThrowByType(Exceptions::kAssertion, args); | 600 Exceptions::ThrowByType(Exceptions::kAssertion, args); |
| 600 UNREACHABLE(); | 601 UNREACHABLE(); |
| 601 } | 602 } |
| 602 | 603 |
| 603 ASSERT(!src_instance.IsBool()); | 604 ASSERT(!src_instance.IsBool()); |
| 604 const Type& bool_interface = Type::Handle(Type::BoolType()); | 605 const Type& bool_interface = Type::Handle(Type::BoolType()); |
| 605 const AbstractType& src_type = | 606 const AbstractType& src_type = |
| 606 AbstractType::Handle(zone, src_instance.GetType()); | 607 AbstractType::Handle(zone, src_instance.GetType(Heap::kNew)); |
| 607 const String& no_bound_error = String::Handle(zone); | 608 const String& no_bound_error = String::Handle(zone); |
| 608 Exceptions::CreateAndThrowTypeError(location, src_type, bool_interface, | 609 Exceptions::CreateAndThrowTypeError(location, src_type, bool_interface, |
| 609 Symbols::BooleanExpression(), | 610 Symbols::BooleanExpression(), |
| 610 no_bound_error); | 611 no_bound_error); |
| 611 UNREACHABLE(); | 612 UNREACHABLE(); |
| 612 } | 613 } |
| 613 | 614 |
| 614 | 615 |
| 615 // Report that the type of the type check is malformed or malbounded. | 616 // Report that the type of the type check is malformed or malbounded. |
| 616 // Arg0: src value. | 617 // Arg0: src value. |
| 617 // Arg1: name of destination being assigned to. | 618 // Arg1: name of destination being assigned to. |
| 618 // Arg2: type of destination being assigned to. | 619 // Arg2: type of destination being assigned to. |
| 619 // Return value: none, throws an exception. | 620 // Return value: none, throws an exception. |
| 620 DEFINE_RUNTIME_ENTRY(BadTypeError, 3) { | 621 DEFINE_RUNTIME_ENTRY(BadTypeError, 3) { |
| 621 const TokenPosition location = GetCallerLocation(); | 622 const TokenPosition location = GetCallerLocation(); |
| 622 const Instance& src_value = Instance::CheckedHandle(zone, arguments.ArgAt(0)); | 623 const Instance& src_value = Instance::CheckedHandle(zone, arguments.ArgAt(0)); |
| 623 const String& dst_name = String::CheckedHandle(zone, arguments.ArgAt(1)); | 624 const String& dst_name = String::CheckedHandle(zone, arguments.ArgAt(1)); |
| 624 const AbstractType& dst_type = | 625 const AbstractType& dst_type = |
| 625 AbstractType::CheckedHandle(zone, arguments.ArgAt(2)); | 626 AbstractType::CheckedHandle(zone, arguments.ArgAt(2)); |
| 626 const AbstractType& src_type = | 627 const AbstractType& src_type = |
| 627 AbstractType::Handle(zone, src_value.GetType()); | 628 AbstractType::Handle(zone, src_value.GetType(Heap::kNew)); |
| 628 Exceptions::CreateAndThrowTypeError(location, src_type, dst_type, dst_name, | 629 Exceptions::CreateAndThrowTypeError(location, src_type, dst_type, dst_name, |
| 629 String::Handle(zone)); | 630 String::Handle(zone)); |
| 630 UNREACHABLE(); | 631 UNREACHABLE(); |
| 631 } | 632 } |
| 632 | 633 |
| 633 | 634 |
| 634 DEFINE_RUNTIME_ENTRY(Throw, 1) { | 635 DEFINE_RUNTIME_ENTRY(Throw, 1) { |
| 635 const Instance& exception = Instance::CheckedHandle(zone, arguments.ArgAt(0)); | 636 const Instance& exception = Instance::CheckedHandle(zone, arguments.ArgAt(0)); |
| 636 Exceptions::Throw(thread, exception); | 637 Exceptions::Throw(thread, exception); |
| 637 } | 638 } |
| (...skipping 1643 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2281 const intptr_t elm_size = old_data.ElementSizeInBytes(); | 2282 const intptr_t elm_size = old_data.ElementSizeInBytes(); |
| 2282 const TypedData& new_data = | 2283 const TypedData& new_data = |
| 2283 TypedData::Handle(TypedData::New(cid, new_size, Heap::kOld)); | 2284 TypedData::Handle(TypedData::New(cid, new_size, Heap::kOld)); |
| 2284 TypedData::Copy(new_data, 0, old_data, 0, old_size * elm_size); | 2285 TypedData::Copy(new_data, 0, old_data, 0, old_size * elm_size); |
| 2285 typed_data_cell.SetAt(0, new_data); | 2286 typed_data_cell.SetAt(0, new_data); |
| 2286 arguments.SetReturn(new_data); | 2287 arguments.SetReturn(new_data); |
| 2287 } | 2288 } |
| 2288 | 2289 |
| 2289 | 2290 |
| 2290 } // namespace dart | 2291 } // namespace dart |
| OLD | NEW |