| 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 "platform/math.h" | 7 #include "platform/math.h" |
| 8 | 8 |
| 9 #include "vm/code_generator.h" // DartModulo. | 9 #include "vm/code_generator.h" // DartModulo. |
| 10 #include "vm/dart_entry.h" | 10 #include "vm/dart_entry.h" |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 137 double right = right_object.value(); | 137 double right = right_object.value(); |
| 138 return Double::New(fmod_ieee(left, right)); | 138 return Double::New(fmod_ieee(left, right)); |
| 139 } | 139 } |
| 140 | 140 |
| 141 | 141 |
| 142 DEFINE_NATIVE_ENTRY(Double_greaterThan, 2) { | 142 DEFINE_NATIVE_ENTRY(Double_greaterThan, 2) { |
| 143 const Double& left = Double::CheckedHandle(arguments->NativeArgAt(0)); | 143 const Double& left = Double::CheckedHandle(arguments->NativeArgAt(0)); |
| 144 GET_NON_NULL_NATIVE_ARGUMENT(Double, right, arguments->NativeArgAt(1)); | 144 GET_NON_NULL_NATIVE_ARGUMENT(Double, right, arguments->NativeArgAt(1)); |
| 145 bool result = right.IsNull() ? false : (left.value() > right.value()); | 145 bool result = right.IsNull() ? false : (left.value() > right.value()); |
| 146 if (FLAG_trace_intrinsified_natives) { | 146 if (FLAG_trace_intrinsified_natives) { |
| 147 OS::Print("Double_greaterThan %s > %s\n", | 147 OS::Print("Double_greaterThan %s > %s\n", left.ToCString(), |
| 148 left.ToCString(), right.ToCString()); | 148 right.ToCString()); |
| 149 } | 149 } |
| 150 return Bool::Get(result).raw(); | 150 return Bool::Get(result).raw(); |
| 151 } | 151 } |
| 152 | 152 |
| 153 | 153 |
| 154 DEFINE_NATIVE_ENTRY(Double_greaterThanFromInteger, 2) { | 154 DEFINE_NATIVE_ENTRY(Double_greaterThanFromInteger, 2) { |
| 155 const Double& right = Double::CheckedHandle(arguments->NativeArgAt(0)); | 155 const Double& right = Double::CheckedHandle(arguments->NativeArgAt(0)); |
| 156 GET_NON_NULL_NATIVE_ARGUMENT(Integer, left, arguments->NativeArgAt(1)); | 156 GET_NON_NULL_NATIVE_ARGUMENT(Integer, left, arguments->NativeArgAt(1)); |
| 157 return Bool::Get(left.AsDoubleValue() > right.value()).raw(); | 157 return Bool::Get(left.AsDoubleValue() > right.value()).raw(); |
| 158 } | 158 } |
| 159 | 159 |
| 160 | 160 |
| 161 DEFINE_NATIVE_ENTRY(Double_equal, 2) { | 161 DEFINE_NATIVE_ENTRY(Double_equal, 2) { |
| 162 const Double& left = Double::CheckedHandle(arguments->NativeArgAt(0)); | 162 const Double& left = Double::CheckedHandle(arguments->NativeArgAt(0)); |
| 163 GET_NON_NULL_NATIVE_ARGUMENT(Double, right, arguments->NativeArgAt(1)); | 163 GET_NON_NULL_NATIVE_ARGUMENT(Double, right, arguments->NativeArgAt(1)); |
| 164 bool result = right.IsNull() ? false : (left.value() == right.value()); | 164 bool result = right.IsNull() ? false : (left.value() == right.value()); |
| 165 if (FLAG_trace_intrinsified_natives) { | 165 if (FLAG_trace_intrinsified_natives) { |
| 166 OS::Print("Double_equal %s == %s\n", | 166 OS::Print("Double_equal %s == %s\n", left.ToCString(), right.ToCString()); |
| 167 left.ToCString(), right.ToCString()); | |
| 168 } | 167 } |
| 169 return Bool::Get(result).raw(); | 168 return Bool::Get(result).raw(); |
| 170 } | 169 } |
| 171 | 170 |
| 172 | 171 |
| 173 DEFINE_NATIVE_ENTRY(Double_equalToInteger, 2) { | 172 DEFINE_NATIVE_ENTRY(Double_equalToInteger, 2) { |
| 174 const Double& left = Double::CheckedHandle(arguments->NativeArgAt(0)); | 173 const Double& left = Double::CheckedHandle(arguments->NativeArgAt(0)); |
| 175 GET_NON_NULL_NATIVE_ARGUMENT(Integer, right, arguments->NativeArgAt(1)); | 174 GET_NON_NULL_NATIVE_ARGUMENT(Integer, right, arguments->NativeArgAt(1)); |
| 176 return Bool::Get(left.value() == right.AsDoubleValue()).raw(); | 175 return Bool::Get(left.value() == right.AsDoubleValue()).raw(); |
| 177 } | 176 } |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 238 | 237 |
| 239 DEFINE_NATIVE_ENTRY(Double_toStringAsFixed, 2) { | 238 DEFINE_NATIVE_ENTRY(Double_toStringAsFixed, 2) { |
| 240 // The boundaries are exclusive. | 239 // The boundaries are exclusive. |
| 241 static const double kLowerBoundary = -1e21; | 240 static const double kLowerBoundary = -1e21; |
| 242 static const double kUpperBoundary = 1e21; | 241 static const double kUpperBoundary = 1e21; |
| 243 | 242 |
| 244 const Double& arg = Double::CheckedHandle(arguments->NativeArgAt(0)); | 243 const Double& arg = Double::CheckedHandle(arguments->NativeArgAt(0)); |
| 245 GET_NON_NULL_NATIVE_ARGUMENT(Smi, fraction_digits, arguments->NativeArgAt(1)); | 244 GET_NON_NULL_NATIVE_ARGUMENT(Smi, fraction_digits, arguments->NativeArgAt(1)); |
| 246 double d = arg.value(); | 245 double d = arg.value(); |
| 247 intptr_t fraction_digits_value = fraction_digits.Value(); | 246 intptr_t fraction_digits_value = fraction_digits.Value(); |
| 248 if (0 <= fraction_digits_value && fraction_digits_value <= 20 | 247 if (0 <= fraction_digits_value && fraction_digits_value <= 20 && |
| 249 && kLowerBoundary < d && d < kUpperBoundary) { | 248 kLowerBoundary < d && d < kUpperBoundary) { |
| 250 return DoubleToStringAsFixed(d, static_cast<int>(fraction_digits_value)); | 249 return DoubleToStringAsFixed(d, static_cast<int>(fraction_digits_value)); |
| 251 } else { | 250 } else { |
| 252 Exceptions::ThrowArgumentError(String::Handle( | 251 Exceptions::ThrowArgumentError(String::Handle( |
| 253 String::New("Illegal arguments to double.toStringAsFixed"))); | 252 String::New("Illegal arguments to double.toStringAsFixed"))); |
| 254 return Object::null(); | 253 return Object::null(); |
| 255 } | 254 } |
| 256 } | 255 } |
| 257 | 256 |
| 258 | 257 |
| 259 DEFINE_NATIVE_ENTRY(Double_toStringAsExponential, 2) { | 258 DEFINE_NATIVE_ENTRY(Double_toStringAsExponential, 2) { |
| 260 const Double& arg = Double::CheckedHandle(arguments->NativeArgAt(0)); | 259 const Double& arg = Double::CheckedHandle(arguments->NativeArgAt(0)); |
| 261 GET_NON_NULL_NATIVE_ARGUMENT(Smi, fraction_digits, arguments->NativeArgAt(1)); | 260 GET_NON_NULL_NATIVE_ARGUMENT(Smi, fraction_digits, arguments->NativeArgAt(1)); |
| 262 double d = arg.value(); | 261 double d = arg.value(); |
| 263 intptr_t fraction_digits_value = fraction_digits.Value(); | 262 intptr_t fraction_digits_value = fraction_digits.Value(); |
| 264 if (-1 <= fraction_digits_value && fraction_digits_value <= 20) { | 263 if (-1 <= fraction_digits_value && fraction_digits_value <= 20) { |
| 265 return DoubleToStringAsExponential( | 264 return DoubleToStringAsExponential(d, |
| 266 d, static_cast<int>(fraction_digits_value)); | 265 static_cast<int>(fraction_digits_value)); |
| 267 } else { | 266 } else { |
| 268 Exceptions::ThrowArgumentError(String::Handle( | 267 Exceptions::ThrowArgumentError(String::Handle( |
| 269 String::New("Illegal arguments to double.toStringAsExponential"))); | 268 String::New("Illegal arguments to double.toStringAsExponential"))); |
| 270 return Object::null(); | 269 return Object::null(); |
| 271 } | 270 } |
| 272 } | 271 } |
| 273 | 272 |
| 274 | 273 |
| 275 DEFINE_NATIVE_ENTRY(Double_toStringAsPrecision, 2) { | 274 DEFINE_NATIVE_ENTRY(Double_toStringAsPrecision, 2) { |
| 276 const Double& arg = Double::CheckedHandle(arguments->NativeArgAt(0)); | 275 const Double& arg = Double::CheckedHandle(arguments->NativeArgAt(0)); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 310 DEFINE_NATIVE_ENTRY(Double_flipSignBit, 1) { | 309 DEFINE_NATIVE_ENTRY(Double_flipSignBit, 1) { |
| 311 const Double& arg = Double::CheckedHandle(arguments->NativeArgAt(0)); | 310 const Double& arg = Double::CheckedHandle(arguments->NativeArgAt(0)); |
| 312 const double in_val = arg.value(); | 311 const double in_val = arg.value(); |
| 313 const int64_t bits = bit_cast<int64_t, double>(in_val) ^ kSignBitDouble; | 312 const int64_t bits = bit_cast<int64_t, double>(in_val) ^ kSignBitDouble; |
| 314 return Double::New(bit_cast<double, int64_t>(bits)); | 313 return Double::New(bit_cast<double, int64_t>(bits)); |
| 315 } | 314 } |
| 316 | 315 |
| 317 // Add here only functions using/referring to old-style casts. | 316 // Add here only functions using/referring to old-style casts. |
| 318 | 317 |
| 319 } // namespace dart | 318 } // namespace dart |
| OLD | NEW |