| OLD | NEW | 
|---|
| 1 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file | 1 // Copyright (c) 2011, 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/bootstrap_natives.h" | 5 #include "vm/bootstrap_natives.h" | 
| 6 | 6 | 
| 7 #include "lib/invocation_mirror.h" | 7 #include "lib/invocation_mirror.h" | 
| 8 #include "vm/code_patcher.h" | 8 #include "vm/code_patcher.h" | 
| 9 #include "vm/exceptions.h" | 9 #include "vm/exceptions.h" | 
| 10 #include "vm/heap.h" | 10 #include "vm/heap.h" | 
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 116 | 116 | 
| 117 DEFINE_NATIVE_ENTRY(Object_runtimeType, 1) { | 117 DEFINE_NATIVE_ENTRY(Object_runtimeType, 1) { | 
| 118   const Instance& instance = Instance::CheckedHandle(arguments->NativeArgAt(0)); | 118   const Instance& instance = Instance::CheckedHandle(arguments->NativeArgAt(0)); | 
| 119   if (instance.IsString()) { | 119   if (instance.IsString()) { | 
| 120     return Type::StringType(); | 120     return Type::StringType(); | 
| 121   } else if (instance.IsInteger()) { | 121   } else if (instance.IsInteger()) { | 
| 122     return Type::IntType(); | 122     return Type::IntType(); | 
| 123   } else if (instance.IsDouble()) { | 123   } else if (instance.IsDouble()) { | 
| 124     return Type::Double(); | 124     return Type::Double(); | 
| 125   } | 125   } | 
| 126   return instance.GetType(); | 126   return instance.GetType(Heap::kNew); | 
| 127 } | 127 } | 
| 128 | 128 | 
| 129 | 129 | 
| 130 DEFINE_NATIVE_ENTRY(Object_haveSameRuntimeType, 2) { | 130 DEFINE_NATIVE_ENTRY(Object_haveSameRuntimeType, 2) { | 
| 131   const Instance& left = Instance::CheckedHandle(arguments->NativeArgAt(0)); | 131   const Instance& left = Instance::CheckedHandle(arguments->NativeArgAt(0)); | 
| 132   const Instance& right = Instance::CheckedHandle(arguments->NativeArgAt(1)); | 132   const Instance& right = Instance::CheckedHandle(arguments->NativeArgAt(1)); | 
| 133 | 133 | 
| 134   const intptr_t left_cid = left.GetClassId(); | 134   const intptr_t left_cid = left.GetClassId(); | 
| 135   const intptr_t right_cid = right.GetClassId(); | 135   const intptr_t right_cid = right.GetClassId(); | 
| 136 | 136 | 
| 137   if (left_cid != right_cid) { | 137   if (left_cid != right_cid) { | 
| 138     if (RawObject::IsIntegerClassId(left_cid)) { | 138     if (RawObject::IsIntegerClassId(left_cid)) { | 
| 139       return Bool::Get(RawObject::IsIntegerClassId(right_cid)).raw(); | 139       return Bool::Get(RawObject::IsIntegerClassId(right_cid)).raw(); | 
| 140     } else if (RawObject::IsStringClassId(right_cid)) { | 140     } else if (RawObject::IsStringClassId(right_cid)) { | 
| 141       return Bool::Get(RawObject::IsStringClassId(right_cid)).raw(); | 141       return Bool::Get(RawObject::IsStringClassId(right_cid)).raw(); | 
| 142     } else { | 142     } else { | 
| 143       return Bool::False().raw(); | 143       return Bool::False().raw(); | 
| 144     } | 144     } | 
| 145   } | 145   } | 
| 146 | 146 | 
| 147   const Class& cls = Class::Handle(left.clazz()); | 147   const Class& cls = Class::Handle(left.clazz()); | 
| 148   if (cls.IsClosureClass()) { | 148   if (cls.IsClosureClass()) { | 
| 149     // TODO(vegorov): provide faster implementation for closure classes. | 149     // TODO(vegorov): provide faster implementation for closure classes. | 
| 150     const AbstractType& left_type = AbstractType::Handle(left.GetType()); | 150     const AbstractType& left_type = | 
| 151     const AbstractType& right_type = AbstractType::Handle(right.GetType()); | 151         AbstractType::Handle(left.GetType(Heap::kNew)); | 
|  | 152     const AbstractType& right_type = | 
|  | 153         AbstractType::Handle(right.GetType(Heap::kNew)); | 
| 152     return Bool::Get(left_type.raw() == right_type.raw()).raw(); | 154     return Bool::Get(left_type.raw() == right_type.raw()).raw(); | 
| 153   } | 155   } | 
| 154 | 156 | 
| 155   if (!cls.IsGeneric()) { | 157   if (!cls.IsGeneric()) { | 
| 156     return Bool::True().raw(); | 158     return Bool::True().raw(); | 
| 157   } | 159   } | 
| 158 | 160 | 
| 159   const TypeArguments& left_type_arguments = | 161   const TypeArguments& left_type_arguments = | 
| 160       TypeArguments::Handle(left.GetTypeArguments()); | 162       TypeArguments::Handle(left.GetTypeArguments()); | 
| 161   const TypeArguments& right_type_arguments = | 163   const TypeArguments& right_type_arguments = | 
| (...skipping 13 matching lines...) Expand all  Loading... | 
| 175   ASSERT(type.IsFinalized()); | 177   ASSERT(type.IsFinalized()); | 
| 176   ASSERT(!type.IsMalformed()); | 178   ASSERT(!type.IsMalformed()); | 
| 177   ASSERT(!type.IsMalbounded()); | 179   ASSERT(!type.IsMalbounded()); | 
| 178   Error& bound_error = Error::Handle(zone, Error::null()); | 180   Error& bound_error = Error::Handle(zone, Error::null()); | 
| 179   const bool is_instance_of = | 181   const bool is_instance_of = | 
| 180       instance.IsInstanceOf(type, instantiator_type_arguments, &bound_error); | 182       instance.IsInstanceOf(type, instantiator_type_arguments, &bound_error); | 
| 181   if (FLAG_trace_type_checks) { | 183   if (FLAG_trace_type_checks) { | 
| 182     const char* result_str = is_instance_of ? "true" : "false"; | 184     const char* result_str = is_instance_of ? "true" : "false"; | 
| 183     OS::Print("Native Object.instanceOf: result %s\n", result_str); | 185     OS::Print("Native Object.instanceOf: result %s\n", result_str); | 
| 184     const AbstractType& instance_type = | 186     const AbstractType& instance_type = | 
| 185         AbstractType::Handle(zone, instance.GetType()); | 187         AbstractType::Handle(zone, instance.GetType(Heap::kNew)); | 
| 186     OS::Print("  instance type: %s\n", | 188     OS::Print("  instance type: %s\n", | 
| 187               String::Handle(zone, instance_type.Name()).ToCString()); | 189               String::Handle(zone, instance_type.Name()).ToCString()); | 
| 188     OS::Print("  test type: %s\n", | 190     OS::Print("  test type: %s\n", | 
| 189               String::Handle(zone, type.Name()).ToCString()); | 191               String::Handle(zone, type.Name()).ToCString()); | 
| 190     if (!bound_error.IsNull()) { | 192     if (!bound_error.IsNull()) { | 
| 191       OS::Print("  bound error: %s\n", bound_error.ToErrorCString()); | 193       OS::Print("  bound error: %s\n", bound_error.ToErrorCString()); | 
| 192     } | 194     } | 
| 193   } | 195   } | 
| 194   if (!is_instance_of && !bound_error.IsNull()) { | 196   if (!is_instance_of && !bound_error.IsNull()) { | 
| 195     // Throw a dynamic type error only if the instanceof test fails. | 197     // Throw a dynamic type error only if the instanceof test fails. | 
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 311   Error& bound_error = Error::Handle(zone); | 313   Error& bound_error = Error::Handle(zone); | 
| 312   if (instance.IsNull()) { | 314   if (instance.IsNull()) { | 
| 313     return instance.raw(); | 315     return instance.raw(); | 
| 314   } | 316   } | 
| 315   const bool is_instance_of = | 317   const bool is_instance_of = | 
| 316       instance.IsInstanceOf(type, instantiator_type_arguments, &bound_error); | 318       instance.IsInstanceOf(type, instantiator_type_arguments, &bound_error); | 
| 317   if (FLAG_trace_type_checks) { | 319   if (FLAG_trace_type_checks) { | 
| 318     const char* result_str = is_instance_of ? "true" : "false"; | 320     const char* result_str = is_instance_of ? "true" : "false"; | 
| 319     OS::Print("Object.as: result %s\n", result_str); | 321     OS::Print("Object.as: result %s\n", result_str); | 
| 320     const AbstractType& instance_type = | 322     const AbstractType& instance_type = | 
| 321         AbstractType::Handle(zone, instance.GetType()); | 323         AbstractType::Handle(zone, instance.GetType(Heap::kNew)); | 
| 322     OS::Print("  instance type: %s\n", | 324     OS::Print("  instance type: %s\n", | 
| 323               String::Handle(zone, instance_type.Name()).ToCString()); | 325               String::Handle(zone, instance_type.Name()).ToCString()); | 
| 324     OS::Print("  cast type: %s\n", | 326     OS::Print("  cast type: %s\n", | 
| 325               String::Handle(zone, type.Name()).ToCString()); | 327               String::Handle(zone, type.Name()).ToCString()); | 
| 326     if (!bound_error.IsNull()) { | 328     if (!bound_error.IsNull()) { | 
| 327       OS::Print("  bound error: %s\n", bound_error.ToErrorCString()); | 329       OS::Print("  bound error: %s\n", bound_error.ToErrorCString()); | 
| 328     } | 330     } | 
| 329   } | 331   } | 
| 330   if (!is_instance_of) { | 332   if (!is_instance_of) { | 
| 331     DartFrameIterator iterator; | 333     DartFrameIterator iterator; | 
| 332     StackFrame* caller_frame = iterator.NextFrame(); | 334     StackFrame* caller_frame = iterator.NextFrame(); | 
| 333     ASSERT(caller_frame != NULL); | 335     ASSERT(caller_frame != NULL); | 
| 334     const TokenPosition location = caller_frame->GetTokenPos(); | 336     const TokenPosition location = caller_frame->GetTokenPos(); | 
| 335     const AbstractType& instance_type = | 337     const AbstractType& instance_type = | 
| 336         AbstractType::Handle(zone, instance.GetType()); | 338         AbstractType::Handle(zone, instance.GetType(Heap::kNew)); | 
| 337     if (!type.IsInstantiated()) { | 339     if (!type.IsInstantiated()) { | 
| 338       // Instantiate type before reporting the error. | 340       // Instantiate type before reporting the error. | 
| 339       type = type.InstantiateFrom(instantiator_type_arguments, NULL, NULL, NULL, | 341       type = type.InstantiateFrom(instantiator_type_arguments, NULL, NULL, NULL, | 
| 340                                   Heap::kNew); | 342                                   Heap::kNew); | 
| 341       // Note that the instantiated type may be malformed. | 343       // Note that the instantiated type may be malformed. | 
| 342     } | 344     } | 
| 343     if (bound_error.IsNull()) { | 345     if (bound_error.IsNull()) { | 
| 344       Exceptions::CreateAndThrowTypeError(location, instance_type, type, | 346       Exceptions::CreateAndThrowTypeError(location, instance_type, type, | 
| 345                                           Symbols::InTypeCast(), | 347                                           Symbols::InTypeCast(), | 
| 346                                           Object::null_string()); | 348                                           Object::null_string()); | 
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 402 | 404 | 
| 403 DEFINE_NATIVE_ENTRY(Internal_inquireIs64Bit, 0) { | 405 DEFINE_NATIVE_ENTRY(Internal_inquireIs64Bit, 0) { | 
| 404 #if defined(ARCH_IS_64_BIT) | 406 #if defined(ARCH_IS_64_BIT) | 
| 405   return Bool::True().raw(); | 407   return Bool::True().raw(); | 
| 406 #else | 408 #else | 
| 407   return Bool::False().raw(); | 409   return Bool::False().raw(); | 
| 408 #endif  // defined(ARCH_IS_64_BIT) | 410 #endif  // defined(ARCH_IS_64_BIT) | 
| 409 } | 411 } | 
| 410 | 412 | 
| 411 }  // namespace dart | 413 }  // namespace dart | 
| OLD | NEW | 
|---|