blob: 644072684ffa606fedd083a90411fe70455dfa39 [file] [log] [blame]
// 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"
#include "vm/report.h"
namespace dart {
DECLARE_FLAG(bool, warn_on_javascript_compatibility);
DEFINE_NATIVE_ENTRY(Identical_comparison, 2) {
GET_NATIVE_ARGUMENT(Instance, a, arguments->NativeArgAt(0));
GET_NATIVE_ARGUMENT(Instance, b, arguments->NativeArgAt(1));
const bool is_identical = a.IsIdenticalTo(b);
if (FLAG_warn_on_javascript_compatibility) {
if (!is_identical) {
if (a.IsString()) {
if (String::Cast(a).Equals(b)) {
Report::JSWarningFromNative(
true, // Identical_comparison is static.
"strings that are equal are also identical");
}
} else if (a.IsInteger()) {
if (b.IsDouble()) {
const int64_t a_value = Integer::Cast(a).AsInt64Value();
const double b_value = Double::Cast(b).value();
if (a_value == floor(b_value)) {
Report::JSWarningFromNative(
true, // Identical_comparison is static.
"integer value and integral double value that are equal "
"are also identical");
}
}
} else if (a.IsDouble()) {
if (b.IsInteger()) {
const double a_value = Double::Cast(a).value();
const int64_t b_value = Integer::Cast(b).AsInt64Value();
if (floor(a_value) == b_value) {
Report::JSWarningFromNative(
true, // Identical_comparison is static.
"integral double value and integer value that are equal "
"are also identical");
}
}
}
}
}
return Bool::Get(is_identical).raw();
}
} // namespace dart