| 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 <math.h> | 5 #include <math.h> |
| 6 | 6 |
| 7 #include "vm/bootstrap_natives.h" | 7 #include "vm/bootstrap_natives.h" |
| 8 | 8 |
| 9 #include "vm/bigint_operations.h" | 9 #include "vm/bigint_operations.h" |
| 10 #include "vm/double_conversion.h" | 10 #include "vm/double_conversion.h" |
| 11 #include "vm/exceptions.h" | 11 #include "vm/exceptions.h" |
| 12 #include "vm/native_entry.h" | 12 #include "vm/native_entry.h" |
| 13 #include "vm/object.h" | 13 #include "vm/object.h" |
| 14 | 14 |
| 15 namespace dart { | 15 namespace dart { |
| 16 | 16 |
| 17 DECLARE_FLAG(bool, trace_intrinsified_natives); |
| 18 |
| 17 DEFINE_NATIVE_ENTRY(Double_doubleFromInteger, 2) { | 19 DEFINE_NATIVE_ENTRY(Double_doubleFromInteger, 2) { |
| 18 ASSERT(AbstractTypeArguments::CheckedHandle(arguments->At(0)).IsNull()); | 20 ASSERT(AbstractTypeArguments::CheckedHandle(arguments->At(0)).IsNull()); |
| 19 const Integer& value = Integer::CheckedHandle(arguments->At(1)); | 21 const Integer& value = Integer::CheckedHandle(arguments->At(1)); |
| 22 if (FLAG_trace_intrinsified_natives) { |
| 23 OS::Print("Double_doubleFromInteger %s\n", value.ToCString()); |
| 24 } |
| 20 return Double::New(value.AsDoubleValue()); | 25 return Double::New(value.AsDoubleValue()); |
| 21 } | 26 } |
| 22 | 27 |
| 23 | 28 |
| 24 DEFINE_NATIVE_ENTRY(Double_add, 2) { | 29 DEFINE_NATIVE_ENTRY(Double_add, 2) { |
| 25 double left = Double::CheckedHandle(arguments->At(0)).value(); | 30 double left = Double::CheckedHandle(arguments->At(0)).value(); |
| 26 GET_NATIVE_ARGUMENT(Double, right_object, arguments->At(1)); | 31 GET_NATIVE_ARGUMENT(Double, right_object, arguments->At(1)); |
| 27 double right = right_object.value(); | 32 double right = right_object.value(); |
| 33 if (FLAG_trace_intrinsified_natives) { |
| 34 OS::Print("Double_add %f + %f\n", left, right); |
| 35 } |
| 28 return Double::New(left + right); | 36 return Double::New(left + right); |
| 29 } | 37 } |
| 30 | 38 |
| 31 | 39 |
| 32 DEFINE_NATIVE_ENTRY(Double_sub, 2) { | 40 DEFINE_NATIVE_ENTRY(Double_sub, 2) { |
| 33 double left = Double::CheckedHandle(arguments->At(0)).value(); | 41 double left = Double::CheckedHandle(arguments->At(0)).value(); |
| 34 GET_NATIVE_ARGUMENT(Double, right_object, arguments->At(1)); | 42 GET_NATIVE_ARGUMENT(Double, right_object, arguments->At(1)); |
| 35 double right = right_object.value(); | 43 double right = right_object.value(); |
| 44 if (FLAG_trace_intrinsified_natives) { |
| 45 OS::Print("Double_sub %f - %f\n", left, right); |
| 46 } |
| 36 return Double::New(left - right); | 47 return Double::New(left - right); |
| 37 } | 48 } |
| 38 | 49 |
| 39 | 50 |
| 40 DEFINE_NATIVE_ENTRY(Double_mul, 2) { | 51 DEFINE_NATIVE_ENTRY(Double_mul, 2) { |
| 41 double left = Double::CheckedHandle(arguments->At(0)).value(); | 52 double left = Double::CheckedHandle(arguments->At(0)).value(); |
| 42 GET_NATIVE_ARGUMENT(Double, right_object, arguments->At(1)); | 53 GET_NATIVE_ARGUMENT(Double, right_object, arguments->At(1)); |
| 43 double right = right_object.value(); | 54 double right = right_object.value(); |
| 55 if (FLAG_trace_intrinsified_natives) { |
| 56 OS::Print("Double_mul %f * %f\n", left, right); |
| 57 } |
| 44 return Double::New(left * right); | 58 return Double::New(left * right); |
| 45 } | 59 } |
| 46 | 60 |
| 47 | 61 |
| 48 DEFINE_NATIVE_ENTRY(Double_div, 2) { | 62 DEFINE_NATIVE_ENTRY(Double_div, 2) { |
| 49 double left = Double::CheckedHandle(arguments->At(0)).value(); | 63 double left = Double::CheckedHandle(arguments->At(0)).value(); |
| 50 GET_NATIVE_ARGUMENT(Double, right_object, arguments->At(1)); | 64 GET_NATIVE_ARGUMENT(Double, right_object, arguments->At(1)); |
| 51 double right = right_object.value(); | 65 double right = right_object.value(); |
| 66 if (FLAG_trace_intrinsified_natives) { |
| 67 OS::Print("Double_div %f / %f\n", left, right); |
| 68 } |
| 52 return Double::New(left / right); | 69 return Double::New(left / right); |
| 53 } | 70 } |
| 54 | 71 |
| 55 | 72 |
| 56 DEFINE_NATIVE_ENTRY(Double_trunc_div, 2) { | 73 DEFINE_NATIVE_ENTRY(Double_trunc_div, 2) { |
| 57 double left = Double::CheckedHandle(arguments->At(0)).value(); | 74 double left = Double::CheckedHandle(arguments->At(0)).value(); |
| 58 GET_NATIVE_ARGUMENT(Double, right_object, arguments->At(1)); | 75 GET_NATIVE_ARGUMENT(Double, right_object, arguments->At(1)); |
| 59 double right = right_object.value(); | 76 double right = right_object.value(); |
| 77 if (FLAG_trace_intrinsified_natives) { |
| 78 OS::Print("Double_trunc_div %f ~/ %f\n", left, right); |
| 79 } |
| 60 return Double::New(trunc(left / right)); | 80 return Double::New(trunc(left / right)); |
| 61 } | 81 } |
| 62 | 82 |
| 63 | 83 |
| 64 DEFINE_NATIVE_ENTRY(Double_modulo, 2) { | 84 DEFINE_NATIVE_ENTRY(Double_modulo, 2) { |
| 65 double left = Double::CheckedHandle(arguments->At(0)).value(); | 85 double left = Double::CheckedHandle(arguments->At(0)).value(); |
| 66 GET_NATIVE_ARGUMENT(Double, right_object, arguments->At(1)); | 86 GET_NATIVE_ARGUMENT(Double, right_object, arguments->At(1)); |
| 67 double right = right_object.value(); | 87 double right = right_object.value(); |
| 68 double remainder = fmod(left, right); | 88 double remainder = fmod(left, right); |
| 69 if (remainder == 0.0) { | 89 if (remainder == 0.0) { |
| (...skipping 15 matching lines...) Expand all Loading... |
| 85 GET_NATIVE_ARGUMENT(Double, right_object, arguments->At(1)); | 105 GET_NATIVE_ARGUMENT(Double, right_object, arguments->At(1)); |
| 86 double right = right_object.value(); | 106 double right = right_object.value(); |
| 87 return Double::New(fmod(left, right)); | 107 return Double::New(fmod(left, right)); |
| 88 } | 108 } |
| 89 | 109 |
| 90 | 110 |
| 91 DEFINE_NATIVE_ENTRY(Double_greaterThan, 2) { | 111 DEFINE_NATIVE_ENTRY(Double_greaterThan, 2) { |
| 92 const Double& left = Double::CheckedHandle(arguments->At(0)); | 112 const Double& left = Double::CheckedHandle(arguments->At(0)); |
| 93 GET_NATIVE_ARGUMENT(Double, right, arguments->At(1)); | 113 GET_NATIVE_ARGUMENT(Double, right, arguments->At(1)); |
| 94 bool result = right.IsNull() ? false : (left.value() > right.value()); | 114 bool result = right.IsNull() ? false : (left.value() > right.value()); |
| 115 if (FLAG_trace_intrinsified_natives) { |
| 116 OS::Print("Double_greaterThan %s > %s\n", |
| 117 left.ToCString(), right.ToCString()); |
| 118 } |
| 95 return Bool::Get(result); | 119 return Bool::Get(result); |
| 96 } | 120 } |
| 97 | 121 |
| 98 | 122 |
| 99 DEFINE_NATIVE_ENTRY(Double_greaterThanFromInteger, 2) { | 123 DEFINE_NATIVE_ENTRY(Double_greaterThanFromInteger, 2) { |
| 100 const Double& right = Double::CheckedHandle(arguments->At(0)); | 124 const Double& right = Double::CheckedHandle(arguments->At(0)); |
| 101 GET_NATIVE_ARGUMENT(Integer, left, arguments->At(1)); | 125 GET_NATIVE_ARGUMENT(Integer, left, arguments->At(1)); |
| 102 return Bool::Get(left.AsDoubleValue() > right.value()); | 126 return Bool::Get(left.AsDoubleValue() > right.value()); |
| 103 } | 127 } |
| 104 | 128 |
| 105 | 129 |
| 106 DEFINE_NATIVE_ENTRY(Double_equal, 2) { | 130 DEFINE_NATIVE_ENTRY(Double_equal, 2) { |
| 107 const Double& left = Double::CheckedHandle(arguments->At(0)); | 131 const Double& left = Double::CheckedHandle(arguments->At(0)); |
| 108 GET_NATIVE_ARGUMENT(Double, right, arguments->At(1)); | 132 GET_NATIVE_ARGUMENT(Double, right, arguments->At(1)); |
| 109 bool result = right.IsNull() ? false : (left.value() == right.value()); | 133 bool result = right.IsNull() ? false : (left.value() == right.value()); |
| 134 if (FLAG_trace_intrinsified_natives) { |
| 135 OS::Print("Double_equal %s == %s\n", |
| 136 left.ToCString(), right.ToCString()); |
| 137 } |
| 110 return Bool::Get(result); | 138 return Bool::Get(result); |
| 111 } | 139 } |
| 112 | 140 |
| 113 | 141 |
| 114 DEFINE_NATIVE_ENTRY(Double_equalToInteger, 2) { | 142 DEFINE_NATIVE_ENTRY(Double_equalToInteger, 2) { |
| 115 const Double& left = Double::CheckedHandle(arguments->At(0)); | 143 const Double& left = Double::CheckedHandle(arguments->At(0)); |
| 116 GET_NATIVE_ARGUMENT(Integer, right, arguments->At(1)); | 144 GET_NATIVE_ARGUMENT(Integer, right, arguments->At(1)); |
| 117 return Bool::Get(left.value() == right.AsDoubleValue()); | 145 return Bool::Get(left.value() == right.AsDoubleValue()); |
| 118 } | 146 } |
| 119 | 147 |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 243 | 271 |
| 244 DEFINE_NATIVE_ENTRY(Double_isNegative, 1) { | 272 DEFINE_NATIVE_ENTRY(Double_isNegative, 1) { |
| 245 const Double& arg = Double::CheckedHandle(arguments->At(0)); | 273 const Double& arg = Double::CheckedHandle(arguments->At(0)); |
| 246 // Include negative zero, infinity. | 274 // Include negative zero, infinity. |
| 247 return Bool::Get(signbit(arg.value()) && !isnan(arg.value())); | 275 return Bool::Get(signbit(arg.value()) && !isnan(arg.value())); |
| 248 } | 276 } |
| 249 | 277 |
| 250 // Add here only functions using/referring to old-style casts. | 278 // Add here only functions using/referring to old-style casts. |
| 251 | 279 |
| 252 } // namespace dart | 280 } // namespace dart |
| OLD | NEW |