| // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| #include "vm/bootstrap_natives.h" |
| |
| #include "vm/object.h" |
| |
| namespace dart { |
| |
| DEFINE_NATIVE_ENTRY(Identical_comparison, 2) { |
| GET_NATIVE_ARGUMENT(Instance, a, arguments->NativeArgAt(0)); |
| GET_NATIVE_ARGUMENT(Instance, b, arguments->NativeArgAt(1)); |
| if (a.raw() == b.raw()) return Bool::True().raw(); |
| if (a.IsInteger() && b.IsInteger()) { |
| return Bool::Get(a.Equals(b)); |
| } |
| if (a.IsDouble() && b.IsDouble()) { |
| if (a.Equals(b)) return Bool::True().raw(); |
| // Check for NaN. |
| const Double& a_double = Double::Cast(a); |
| const Double& b_double = Double::Cast(b); |
| if (isnan(a_double.value()) && isnan(b_double.value())) { |
| return Bool::True().raw(); |
| } |
| } |
| return Bool::False().raw(); |
| } |
| |
| |
| } // namespace dart |