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/globals.h" // Needed here to get TARGET_ARCH_X64. | 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_X64. |
6 #if defined(TARGET_ARCH_X64) | 6 #if defined(TARGET_ARCH_X64) |
7 | 7 |
8 #include "vm/code_generator.h" | 8 #include "vm/code_generator.h" |
9 | 9 |
10 #include "lib/error.h" | 10 #include "lib/error.h" |
(...skipping 2293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2304 instantiator_class = outer_function.signature_class(); | 2304 instantiator_class = outer_function.signature_class(); |
2305 } else { | 2305 } else { |
2306 instantiator_class = outer_function.owner(); | 2306 instantiator_class = outer_function.owner(); |
2307 } | 2307 } |
2308 if (instantiator_class.NumTypeParameters() == 0) { | 2308 if (instantiator_class.NumTypeParameters() == 0) { |
2309 // The type arguments are compile time constants. | 2309 // The type arguments are compile time constants. |
2310 AbstractTypeArguments& type_arguments = AbstractTypeArguments::ZoneHandle(); | 2310 AbstractTypeArguments& type_arguments = AbstractTypeArguments::ZoneHandle(); |
2311 // TODO(regis): Temporary type should be allocated in new gen heap. | 2311 // TODO(regis): Temporary type should be allocated in new gen heap. |
2312 Type& type = Type::Handle( | 2312 Type& type = Type::Handle( |
2313 Type::NewParameterizedType(instantiator_class, type_arguments)); | 2313 Type::NewParameterizedType(instantiator_class, type_arguments)); |
2314 String& errmsg = String::Handle(); | 2314 Error& error = Error::Handle(); |
2315 type ^= ClassFinalizer::FinalizeAndCanonicalizeType(instantiator_class, | 2315 type ^= ClassFinalizer::FinalizeAndCanonicalizeType(instantiator_class, |
2316 type, | 2316 type, |
2317 &errmsg); | 2317 &error); |
2318 if (!errmsg.IsNull()) { | 2318 if (!error.IsNull()) { |
2319 ErrorMsg(token_index, errmsg.ToCString()); | 2319 ErrorMsg(token_index, error.ToErrorCString()); |
2320 } | 2320 } |
2321 type_arguments = type.arguments(); | 2321 type_arguments = type.arguments(); |
2322 __ PushObject(type_arguments); | 2322 __ PushObject(type_arguments); |
2323 } else { | 2323 } else { |
2324 ASSERT(parsed_function().instantiator() != NULL); | 2324 ASSERT(parsed_function().instantiator() != NULL); |
2325 parsed_function().instantiator()->Visit(this); | 2325 parsed_function().instantiator()->Visit(this); |
2326 if (!outer_function.IsFactory()) { | 2326 if (!outer_function.IsFactory()) { |
2327 __ popq(RAX); // Pop instantiator. | 2327 __ popq(RAX); // Pop instantiator. |
2328 // The instantiator is the receiver of the caller, which is not a factory. | 2328 // The instantiator is the receiver of the caller, which is not a factory. |
2329 // The receiver cannot be null; extract its AbstractTypeArguments object. | 2329 // The receiver cannot be null; extract its AbstractTypeArguments object. |
(...skipping 454 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2784 intptr_t token_index) { | 2784 intptr_t token_index) { |
2785 pc_descriptors_list_->AddDescriptor(kind, | 2785 pc_descriptors_list_->AddDescriptor(kind, |
2786 assembler_->CodeSize(), | 2786 assembler_->CodeSize(), |
2787 node_id, | 2787 node_id, |
2788 token_index, | 2788 token_index, |
2789 state()->try_index()); | 2789 state()->try_index()); |
2790 } | 2790 } |
2791 | 2791 |
2792 | 2792 |
2793 void CodeGenerator::ErrorMsg(intptr_t token_index, const char* format, ...) { | 2793 void CodeGenerator::ErrorMsg(intptr_t token_index, const char* format, ...) { |
2794 const intptr_t kMessageBufferSize = 512; | |
2795 char message_buffer[kMessageBufferSize]; | |
2796 va_list args; | 2794 va_list args; |
2797 va_start(args, format); | 2795 va_start(args, format); |
2798 const Class& cls = Class::Handle(parsed_function_.function().owner()); | 2796 const Class& cls = Class::Handle(parsed_function_.function().owner()); |
2799 const Script& script = Script::Handle(cls.script()); | 2797 const Script& script = Script::Handle(cls.script()); |
2800 Parser::FormatMessage(script, token_index, "Error", | 2798 const Error& error = Error::Handle( |
2801 message_buffer, kMessageBufferSize, | 2799 Parser::FormatError(script, token_index, "Error", format, args)); |
2802 format, args); | |
2803 va_end(args); | 2800 va_end(args); |
2804 Isolate::Current()->long_jump_base()->Jump(1, message_buffer); | 2801 Isolate::Current()->long_jump_base()->Jump(1, error); |
2805 UNREACHABLE(); | 2802 UNREACHABLE(); |
2806 } | 2803 } |
2807 | 2804 |
2808 } // namespace dart | 2805 } // namespace dart |
2809 | 2806 |
2810 #endif // defined TARGET_ARCH_X64 | 2807 #endif // defined TARGET_ARCH_X64 |
OLD | NEW |