Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(293)

Side by Side Diff: runtime/lib/double.cc

Issue 8678025: Fix crashes when going to natives. Throw an exception instead. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 9 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « runtime/lib/byte_buffer.cc ('k') | runtime/lib/integers.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/exceptions.h" 10 #include "vm/exceptions.h"
11 #include "vm/native_entry.h" 11 #include "vm/native_entry.h"
12 #include "vm/object.h" 12 #include "vm/object.h"
13 13
14 namespace dart { 14 namespace dart {
15 15
16 DEFINE_NATIVE_ENTRY(Double_doubleFromInteger, 2) { 16 DEFINE_NATIVE_ENTRY(Double_doubleFromInteger, 2) {
17 ASSERT(TypeArguments::CheckedHandle(arguments->At(0)).IsNull()); 17 ASSERT(TypeArguments::CheckedHandle(arguments->At(0)).IsNull());
18 const Integer& value = Integer::CheckedHandle(arguments->At(1)); 18 const Integer& value = Integer::CheckedHandle(arguments->At(1));
19 const Double& result = Double::Handle(Double::New(value.AsDoubleValue())); 19 const Double& result = Double::Handle(Double::New(value.AsDoubleValue()));
20 arguments->SetReturn(result); 20 arguments->SetReturn(result);
21 } 21 }
22 22
23 23
24 DEFINE_NATIVE_ENTRY(Double_add, 2) { 24 DEFINE_NATIVE_ENTRY(Double_add, 2) {
25 double left = Double::CheckedHandle(arguments->At(0)).value(); 25 double left = Double::CheckedHandle(arguments->At(0)).value();
26 double right = Double::CheckedHandle(arguments->At(1)).value(); 26 GET_NATIVE_ARGUMENT(Double, right_object, arguments->At(1));
27 double right = right_object.value();
27 const Double& result = Double::Handle(Double::New(left + right)); 28 const Double& result = Double::Handle(Double::New(left + right));
28 arguments->SetReturn(result); 29 arguments->SetReturn(result);
29 } 30 }
30 31
31 32
32 DEFINE_NATIVE_ENTRY(Double_sub, 2) { 33 DEFINE_NATIVE_ENTRY(Double_sub, 2) {
33 double left = Double::CheckedHandle(arguments->At(0)).value(); 34 double left = Double::CheckedHandle(arguments->At(0)).value();
34 double right = Double::CheckedHandle(arguments->At(1)).value(); 35 GET_NATIVE_ARGUMENT(Double, right_object, arguments->At(1));
36 double right = right_object.value();
35 const Double& result = Double::Handle(Double::New(left - right)); 37 const Double& result = Double::Handle(Double::New(left - right));
36 arguments->SetReturn(result); 38 arguments->SetReturn(result);
37 } 39 }
38 40
39 41
40 DEFINE_NATIVE_ENTRY(Double_mul, 2) { 42 DEFINE_NATIVE_ENTRY(Double_mul, 2) {
41 double left = Double::CheckedHandle(arguments->At(0)).value(); 43 double left = Double::CheckedHandle(arguments->At(0)).value();
42 double right = Double::CheckedHandle(arguments->At(1)).value(); 44 GET_NATIVE_ARGUMENT(Double, right_object, arguments->At(1));
45 double right = right_object.value();
43 const Double& result = Double::Handle(Double::New(left * right)); 46 const Double& result = Double::Handle(Double::New(left * right));
44 arguments->SetReturn(result); 47 arguments->SetReturn(result);
45 } 48 }
46 49
47 50
48 DEFINE_NATIVE_ENTRY(Double_div, 2) { 51 DEFINE_NATIVE_ENTRY(Double_div, 2) {
49 double left = Double::CheckedHandle(arguments->At(0)).value(); 52 double left = Double::CheckedHandle(arguments->At(0)).value();
50 double right = Double::CheckedHandle(arguments->At(1)).value(); 53 GET_NATIVE_ARGUMENT(Double, right_object, arguments->At(1));
54 double right = right_object.value();
51 const Double& result = Double::Handle(Double::New(left / right)); 55 const Double& result = Double::Handle(Double::New(left / right));
52 arguments->SetReturn(result); 56 arguments->SetReturn(result);
53 } 57 }
54 58
55 59
56 DEFINE_NATIVE_ENTRY(Double_trunc_div, 2) { 60 DEFINE_NATIVE_ENTRY(Double_trunc_div, 2) {
57 double left = Double::CheckedHandle(arguments->At(0)).value(); 61 double left = Double::CheckedHandle(arguments->At(0)).value();
58 double right = Double::CheckedHandle(arguments->At(1)).value(); 62 GET_NATIVE_ARGUMENT(Double, right_object, arguments->At(1));
63 double right = right_object.value();
59 const Double& result = Double::Handle(Double::New(trunc(left / right))); 64 const Double& result = Double::Handle(Double::New(trunc(left / right)));
60 arguments->SetReturn(result); 65 arguments->SetReturn(result);
61 } 66 }
62 67
63 68
64 DEFINE_NATIVE_ENTRY(Double_modulo, 2) { 69 DEFINE_NATIVE_ENTRY(Double_modulo, 2) {
65 double left = Double::CheckedHandle(arguments->At(0)).value(); 70 double left = Double::CheckedHandle(arguments->At(0)).value();
66 double right = Double::CheckedHandle(arguments->At(1)).value(); 71 GET_NATIVE_ARGUMENT(Double, right_object, arguments->At(1));
72 double right = right_object.value();
67 double remainder = fmod(left, right); 73 double remainder = fmod(left, right);
68 if (remainder == 0.0) { 74 if (remainder == 0.0) {
69 // We explicitely switch to the positive 0.0 (just in case it was negative). 75 // We explicitely switch to the positive 0.0 (just in case it was negative).
70 remainder = +0.0; 76 remainder = +0.0;
71 } else if (remainder < 0) { 77 } else if (remainder < 0) {
72 if (right < 0) { 78 if (right < 0) {
73 remainder -= right; 79 remainder -= right;
74 } else { 80 } else {
75 remainder += right; 81 remainder += right;
76 } 82 }
77 } 83 }
78 const Double& result = Double::Handle(Double::New(remainder)); 84 const Double& result = Double::Handle(Double::New(remainder));
79 arguments->SetReturn(result); 85 arguments->SetReturn(result);
80 } 86 }
81 87
82 88
83 DEFINE_NATIVE_ENTRY(Double_remainder, 2) { 89 DEFINE_NATIVE_ENTRY(Double_remainder, 2) {
84 double left = Double::CheckedHandle(arguments->At(0)).value(); 90 double left = Double::CheckedHandle(arguments->At(0)).value();
85 double right = Double::CheckedHandle(arguments->At(1)).value(); 91 GET_NATIVE_ARGUMENT(Double, right_object, arguments->At(1));
92 double right = right_object.value();
86 const Double& result = Double::Handle(Double::New(fmod(left, right))); 93 const Double& result = Double::Handle(Double::New(fmod(left, right)));
87 arguments->SetReturn(result); 94 arguments->SetReturn(result);
88 } 95 }
89 96
90 97
91 DEFINE_NATIVE_ENTRY(Double_greaterThan, 2) { 98 DEFINE_NATIVE_ENTRY(Double_greaterThan, 2) {
92 const Double& left = Double::CheckedHandle(arguments->At(0)); 99 const Double& left = Double::CheckedHandle(arguments->At(0));
93 const Double& right = Double::CheckedHandle(arguments->At(1)); 100 GET_NATIVE_ARGUMENT(Double, right, arguments->At(1));
94 bool result = right.IsNull() ? false : (left.value() > right.value()); 101 bool result = right.IsNull() ? false : (left.value() > right.value());
95 arguments->SetReturn(Bool::Handle(Bool::Get(result))); 102 arguments->SetReturn(Bool::Handle(Bool::Get(result)));
96 } 103 }
97 104
98 105
99 DEFINE_NATIVE_ENTRY(Double_greaterThanFromInteger, 2) { 106 DEFINE_NATIVE_ENTRY(Double_greaterThanFromInteger, 2) {
100 const Double& right = Double::CheckedHandle(arguments->At(0)); 107 const Double& right = Double::CheckedHandle(arguments->At(0));
101 const Integer& left = Integer::CheckedHandle(arguments->At(1)); 108 GET_NATIVE_ARGUMENT(Integer, left, arguments->At(1));
102 const Bool& result = Bool::Handle(Bool::Get( 109 const Bool& result = Bool::Handle(Bool::Get(
103 left.AsDoubleValue() > right.value())); 110 left.AsDoubleValue() > right.value()));
104 arguments->SetReturn(result); 111 arguments->SetReturn(result);
105 } 112 }
106 113
107 114
108 DEFINE_NATIVE_ENTRY(Double_equal, 2) { 115 DEFINE_NATIVE_ENTRY(Double_equal, 2) {
109 const Double& left = Double::CheckedHandle(arguments->At(0)); 116 const Double& left = Double::CheckedHandle(arguments->At(0));
110 const Double& right = Double::CheckedHandle(arguments->At(1)); 117 GET_NATIVE_ARGUMENT(Double, right, arguments->At(1));
111 bool result = right.IsNull() ? false : (left.value() == right.value()); 118 bool result = right.IsNull() ? false : (left.value() == right.value());
112 arguments->SetReturn(Bool::Handle(Bool::Get(result))); 119 arguments->SetReturn(Bool::Handle(Bool::Get(result)));
113 } 120 }
114 121
115 122
116 DEFINE_NATIVE_ENTRY(Double_equalToInteger, 2) { 123 DEFINE_NATIVE_ENTRY(Double_equalToInteger, 2) {
117 const Double& left = Double::CheckedHandle(arguments->At(0)); 124 const Double& left = Double::CheckedHandle(arguments->At(0));
118 const Integer& right = Integer::CheckedHandle(arguments->At(1)); 125 GET_NATIVE_ARGUMENT(Integer, right, arguments->At(1));
119 const Bool& result = 126 const Bool& result =
120 Bool::Handle(Bool::Get(left.value() == right.AsDoubleValue())); 127 Bool::Handle(Bool::Get(left.value() == right.AsDoubleValue()));
121 arguments->SetReturn(result); 128 arguments->SetReturn(result);
122 } 129 }
123 130
124 131
125 DEFINE_NATIVE_ENTRY(Double_round, 1) { 132 DEFINE_NATIVE_ENTRY(Double_round, 1) {
126 const Double& arg = Double::CheckedHandle(arguments->At(0)); 133 const Double& arg = Double::CheckedHandle(arguments->At(0));
127 arguments->SetReturn(Double::Handle(Double::New(round(arg.value())))); 134 arguments->SetReturn(Double::Handle(Double::New(round(arg.value()))));
128 } 135 }
(...skipping 10 matching lines...) Expand all
139 146
140 147
141 DEFINE_NATIVE_ENTRY(Double_truncate, 1) { 148 DEFINE_NATIVE_ENTRY(Double_truncate, 1) {
142 const Double& arg = Double::CheckedHandle(arguments->At(0)); 149 const Double& arg = Double::CheckedHandle(arguments->At(0));
143 arguments->SetReturn(Double::Handle(Double::New(trunc(arg.value())))); 150 arguments->SetReturn(Double::Handle(Double::New(trunc(arg.value()))));
144 } 151 }
145 152
146 153
147 DEFINE_NATIVE_ENTRY(Double_pow, 2) { 154 DEFINE_NATIVE_ENTRY(Double_pow, 2) {
148 const double operand = Double::CheckedHandle(arguments->At(0)).value(); 155 const double operand = Double::CheckedHandle(arguments->At(0)).value();
149 const double exponent = Double::CheckedHandle(arguments->At(1)).value(); 156 GET_NATIVE_ARGUMENT(Double, exponent_object, arguments->At(1));
157 const double exponent = exponent_object.value();
150 arguments->SetReturn(Double::Handle(Double::New(pow(operand, exponent)))); 158 arguments->SetReturn(Double::Handle(Double::New(pow(operand, exponent))));
151 } 159 }
152 160
153 161
154 #if defined(TARGET_OS_MACOS) 162 #if defined(TARGET_OS_MACOS)
155 // MAC OSX math library produces old style cast warning. 163 // MAC OSX math library produces old style cast warning.
156 #pragma GCC diagnostic ignored "-Wold-style-cast" 164 #pragma GCC diagnostic ignored "-Wold-style-cast"
157 #endif 165 #endif
158 166
159 DEFINE_NATIVE_ENTRY(Double_toInt, 1) { 167 DEFINE_NATIVE_ENTRY(Double_toInt, 1) {
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
203 arguments->SetReturn(Bool::Handle(Bool::True())); 211 arguments->SetReturn(Bool::Handle(Bool::True()));
204 } else { 212 } else {
205 arguments->SetReturn(Bool::Handle(Bool::False())); 213 arguments->SetReturn(Bool::Handle(Bool::False()));
206 } 214 }
207 } 215 }
208 216
209 // Add here only functions using/referring to old-style casts. 217 // Add here only functions using/referring to old-style casts.
210 218
211 } // namespace dart 219 } // namespace dart
212 220
OLDNEW
« no previous file with comments | « runtime/lib/byte_buffer.cc ('k') | runtime/lib/integers.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698