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 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
151 Report::JSWarningFromNative( | 151 Report::JSWarningFromNative( |
152 false, // Object_instanceOf and Object_as are not static calls. | 152 false, // Object_instanceOf and Object_as are not static calls. |
153 "integer value is also considered to be of type 'double'"); | 153 "integer value is also considered to be of type 'double'"); |
154 } | 154 } |
155 } | 155 } |
156 } | 156 } |
157 | 157 |
158 | 158 |
159 DEFINE_NATIVE_ENTRY(Object_instanceOf, 5) { | 159 DEFINE_NATIVE_ENTRY(Object_instanceOf, 5) { |
160 const Instance& instance = | 160 const Instance& instance = |
161 Instance::CheckedHandle(isolate, arguments->NativeArgAt(0)); | 161 Instance::CheckedHandle(zone, arguments->NativeArgAt(0)); |
162 // Instantiator at position 1 is not used. It is passed along so that the call | 162 // Instantiator at position 1 is not used. It is passed along so that the call |
163 // can be easily converted to an optimized implementation. Instantiator is | 163 // can be easily converted to an optimized implementation. Instantiator is |
164 // used to populate the subtype cache. | 164 // used to populate the subtype cache. |
165 const TypeArguments& instantiator_type_arguments = | 165 const TypeArguments& instantiator_type_arguments = |
166 TypeArguments::CheckedHandle(isolate, arguments->NativeArgAt(2)); | 166 TypeArguments::CheckedHandle(zone, arguments->NativeArgAt(2)); |
167 const AbstractType& type = | 167 const AbstractType& type = |
168 AbstractType::CheckedHandle(isolate, arguments->NativeArgAt(3)); | 168 AbstractType::CheckedHandle(zone, arguments->NativeArgAt(3)); |
169 const Bool& negate = Bool::CheckedHandle(isolate, arguments->NativeArgAt(4)); | 169 const Bool& negate = Bool::CheckedHandle(zone, arguments->NativeArgAt(4)); |
170 ASSERT(type.IsFinalized()); | 170 ASSERT(type.IsFinalized()); |
171 ASSERT(!type.IsMalformed()); | 171 ASSERT(!type.IsMalformed()); |
172 ASSERT(!type.IsMalbounded()); | 172 ASSERT(!type.IsMalbounded()); |
173 | 173 |
174 // Check for javascript compatibility. | 174 // Check for javascript compatibility. |
175 if (FLAG_warn_on_javascript_compatibility) { | 175 if (FLAG_warn_on_javascript_compatibility) { |
176 WarnOnJSIntegralNumTypeTest(instance, instantiator_type_arguments, type); | 176 WarnOnJSIntegralNumTypeTest(instance, instantiator_type_arguments, type); |
177 } | 177 } |
178 | 178 |
179 Error& bound_error = Error::Handle(isolate, Error::null()); | 179 Error& bound_error = Error::Handle(zone, Error::null()); |
180 const bool is_instance_of = instance.IsInstanceOf(type, | 180 const bool is_instance_of = instance.IsInstanceOf(type, |
181 instantiator_type_arguments, | 181 instantiator_type_arguments, |
182 &bound_error); | 182 &bound_error); |
183 if (FLAG_trace_type_checks) { | 183 if (FLAG_trace_type_checks) { |
184 const char* result_str = is_instance_of ? "true" : "false"; | 184 const char* result_str = is_instance_of ? "true" : "false"; |
185 OS::Print("Native Object.instanceOf: result %s\n", result_str); | 185 OS::Print("Native Object.instanceOf: result %s\n", result_str); |
186 const Type& instance_type = Type::Handle(instance.GetType()); | 186 const Type& instance_type = Type::Handle(instance.GetType()); |
187 OS::Print(" instance type: %s\n", | 187 OS::Print(" instance type: %s\n", |
188 String::Handle(instance_type.Name()).ToCString()); | 188 String::Handle(instance_type.Name()).ToCString()); |
189 OS::Print(" test type: %s\n", String::Handle(type.Name()).ToCString()); | 189 OS::Print(" test type: %s\n", String::Handle(type.Name()).ToCString()); |
190 if (!bound_error.IsNull()) { | 190 if (!bound_error.IsNull()) { |
191 OS::Print(" bound error: %s\n", bound_error.ToErrorCString()); | 191 OS::Print(" bound error: %s\n", bound_error.ToErrorCString()); |
192 } | 192 } |
193 } | 193 } |
194 if (!is_instance_of && !bound_error.IsNull()) { | 194 if (!is_instance_of && !bound_error.IsNull()) { |
195 // Throw a dynamic type error only if the instanceof test fails. | 195 // Throw a dynamic type error only if the instanceof test fails. |
196 DartFrameIterator iterator; | 196 DartFrameIterator iterator; |
197 StackFrame* caller_frame = iterator.NextFrame(); | 197 StackFrame* caller_frame = iterator.NextFrame(); |
198 ASSERT(caller_frame != NULL); | 198 ASSERT(caller_frame != NULL); |
199 const intptr_t location = caller_frame->GetTokenPos(); | 199 const intptr_t location = caller_frame->GetTokenPos(); |
200 String& bound_error_message = String::Handle( | 200 String& bound_error_message = String::Handle( |
201 isolate, String::New(bound_error.ToErrorCString())); | 201 zone, String::New(bound_error.ToErrorCString())); |
202 Exceptions::CreateAndThrowTypeError( | 202 Exceptions::CreateAndThrowTypeError( |
203 location, Symbols::Empty(), Symbols::Empty(), | 203 location, Symbols::Empty(), Symbols::Empty(), |
204 Symbols::Empty(), bound_error_message); | 204 Symbols::Empty(), bound_error_message); |
205 UNREACHABLE(); | 205 UNREACHABLE(); |
206 } | 206 } |
207 return Bool::Get(negate.value() ? !is_instance_of : is_instance_of).raw(); | 207 return Bool::Get(negate.value() ? !is_instance_of : is_instance_of).raw(); |
208 } | 208 } |
209 | 209 |
210 | 210 |
211 DEFINE_NATIVE_ENTRY(Object_as, 4) { | 211 DEFINE_NATIVE_ENTRY(Object_as, 4) { |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
313 // Currently all errors are Dart instances, e.g. I/O errors | 313 // Currently all errors are Dart instances, e.g. I/O errors |
314 // created by deferred loading code. LanguageErrors from | 314 // created by deferred loading code. LanguageErrors from |
315 // failed loading or finalization attempts are propagated and result | 315 // failed loading or finalization attempts are propagated and result |
316 // in the isolate's death. | 316 // in the isolate's death. |
317 const Instance& error = Instance::Handle(prefix.LoadError()); | 317 const Instance& error = Instance::Handle(prefix.LoadError()); |
318 return error.raw(); | 318 return error.raw(); |
319 } | 319 } |
320 | 320 |
321 | 321 |
322 } // namespace dart | 322 } // namespace dart |
OLD | NEW |