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

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

Issue 11421064: Cleanups and added more checks for valid Integer allocation (must be Smi, Mint or Bigint for their … (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 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 | « no previous file | runtime/vm/object.h » ('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) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, 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 "vm/bigint_operations.h" 7 #include "vm/bigint_operations.h"
8 #include "vm/dart_entry.h" 8 #include "vm/dart_entry.h"
9 #include "vm/exceptions.h" 9 #include "vm/exceptions.h"
10 #include "vm/native_entry.h" 10 #include "vm/native_entry.h"
(...skipping 27 matching lines...) Expand all
38 38
39 DEFINE_NATIVE_ENTRY(Integer_bitAndFromInteger, 2) { 39 DEFINE_NATIVE_ENTRY(Integer_bitAndFromInteger, 2) {
40 const Integer& right = Integer::CheckedHandle(arguments->NativeArgAt(0)); 40 const Integer& right = Integer::CheckedHandle(arguments->NativeArgAt(0));
41 GET_NATIVE_ARGUMENT(Integer, left, arguments->NativeArgAt(1)); 41 GET_NATIVE_ARGUMENT(Integer, left, arguments->NativeArgAt(1));
42 ASSERT(CheckInteger(right)); 42 ASSERT(CheckInteger(right));
43 ASSERT(CheckInteger(left)); 43 ASSERT(CheckInteger(left));
44 if (FLAG_trace_intrinsified_natives) { 44 if (FLAG_trace_intrinsified_natives) {
45 OS::Print("Integer_bitAndFromInteger %s & %s\n", 45 OS::Print("Integer_bitAndFromInteger %s & %s\n",
46 right.ToCString(), left.ToCString()); 46 right.ToCString(), left.ToCString());
47 } 47 }
48 Integer& result = 48 const Integer& result =
49 Integer::Handle(left.BitOp(Token::kBIT_AND, right)); 49 Integer::Handle(left.BitOp(Token::kBIT_AND, right));
50 return result.AsInteger(); 50 return result.AsValidInteger();
51 } 51 }
52 52
53 53
54 DEFINE_NATIVE_ENTRY(Integer_bitOrFromInteger, 2) { 54 DEFINE_NATIVE_ENTRY(Integer_bitOrFromInteger, 2) {
55 const Integer& right = Integer::CheckedHandle(arguments->NativeArgAt(0)); 55 const Integer& right = Integer::CheckedHandle(arguments->NativeArgAt(0));
56 GET_NATIVE_ARGUMENT(Integer, left, arguments->NativeArgAt(1)); 56 GET_NATIVE_ARGUMENT(Integer, left, arguments->NativeArgAt(1));
57 ASSERT(CheckInteger(right)); 57 ASSERT(CheckInteger(right));
58 ASSERT(CheckInteger(left)); 58 ASSERT(CheckInteger(left));
59 if (FLAG_trace_intrinsified_natives) { 59 if (FLAG_trace_intrinsified_natives) {
60 OS::Print("Integer_bitOrFromInteger %s | %s\n", 60 OS::Print("Integer_bitOrFromInteger %s | %s\n",
61 left.ToCString(), right.ToCString()); 61 left.ToCString(), right.ToCString());
62 } 62 }
63 Integer& result = 63 const Integer& result =
64 Integer::Handle(left.BitOp(Token::kBIT_OR, right)); 64 Integer::Handle(left.BitOp(Token::kBIT_OR, right));
65 return result.AsInteger(); 65 return result.AsValidInteger();
66 } 66 }
67 67
68 68
69 DEFINE_NATIVE_ENTRY(Integer_bitXorFromInteger, 2) { 69 DEFINE_NATIVE_ENTRY(Integer_bitXorFromInteger, 2) {
70 const Integer& right = Integer::CheckedHandle(arguments->NativeArgAt(0)); 70 const Integer& right = Integer::CheckedHandle(arguments->NativeArgAt(0));
71 GET_NATIVE_ARGUMENT(Integer, left, arguments->NativeArgAt(1)); 71 GET_NATIVE_ARGUMENT(Integer, left, arguments->NativeArgAt(1));
72 ASSERT(CheckInteger(right)); 72 ASSERT(CheckInteger(right));
73 ASSERT(CheckInteger(left)); 73 ASSERT(CheckInteger(left));
74 if (FLAG_trace_intrinsified_natives) { 74 if (FLAG_trace_intrinsified_natives) {
75 OS::Print("Integer_bitXorFromInteger %s ^ %s\n", 75 OS::Print("Integer_bitXorFromInteger %s ^ %s\n",
76 left.ToCString(), right.ToCString()); 76 left.ToCString(), right.ToCString());
77 } 77 }
78 Integer& result = 78 const Integer& result =
79 Integer::Handle(left.BitOp(Token::kBIT_XOR, right)); 79 Integer::Handle(left.BitOp(Token::kBIT_XOR, right));
80 return result.AsInteger(); 80 return result.AsValidInteger();
81 } 81 }
82 82
83 83
84 DEFINE_NATIVE_ENTRY(Integer_addFromInteger, 2) { 84 DEFINE_NATIVE_ENTRY(Integer_addFromInteger, 2) {
85 const Integer& right_int = Integer::CheckedHandle(arguments->NativeArgAt(0)); 85 const Integer& right_int = Integer::CheckedHandle(arguments->NativeArgAt(0));
86 GET_NATIVE_ARGUMENT(Integer, left_int, arguments->NativeArgAt(1)); 86 GET_NATIVE_ARGUMENT(Integer, left_int, arguments->NativeArgAt(1));
87 ASSERT(CheckInteger(right_int)); 87 ASSERT(CheckInteger(right_int));
88 ASSERT(CheckInteger(left_int)); 88 ASSERT(CheckInteger(left_int));
89 if (FLAG_trace_intrinsified_natives) { 89 if (FLAG_trace_intrinsified_natives) {
90 OS::Print("Integer_addFromInteger %s + %s\n", 90 OS::Print("Integer_addFromInteger %s + %s\n",
91 left_int.ToCString(), right_int.ToCString()); 91 left_int.ToCString(), right_int.ToCString());
92 } 92 }
93 return left_int.ArithmeticOp(Token::kADD, right_int); 93 const Integer& result =
94 Integer::Handle(left_int.ArithmeticOp(Token::kADD, right_int));
95 return result.AsValidInteger();
94 } 96 }
95 97
96 98
97 DEFINE_NATIVE_ENTRY(Integer_subFromInteger, 2) { 99 DEFINE_NATIVE_ENTRY(Integer_subFromInteger, 2) {
98 const Integer& right_int = Integer::CheckedHandle(arguments->NativeArgAt(0)); 100 const Integer& right_int = Integer::CheckedHandle(arguments->NativeArgAt(0));
99 GET_NATIVE_ARGUMENT(Integer, left_int, arguments->NativeArgAt(1)); 101 GET_NATIVE_ARGUMENT(Integer, left_int, arguments->NativeArgAt(1));
100 ASSERT(CheckInteger(right_int)); 102 ASSERT(CheckInteger(right_int));
101 ASSERT(CheckInteger(left_int)); 103 ASSERT(CheckInteger(left_int));
102 if (FLAG_trace_intrinsified_natives) { 104 if (FLAG_trace_intrinsified_natives) {
103 OS::Print("Integer_subFromInteger %s - %s\n", 105 OS::Print("Integer_subFromInteger %s - %s\n",
104 left_int.ToCString(), right_int.ToCString()); 106 left_int.ToCString(), right_int.ToCString());
105 } 107 }
106 return left_int.ArithmeticOp(Token::kSUB, right_int); 108 const Integer& result =
109 Integer::Handle(left_int.ArithmeticOp(Token::kSUB, right_int));
110 return result.AsValidInteger();
107 } 111 }
108 112
109 113
110 DEFINE_NATIVE_ENTRY(Integer_mulFromInteger, 2) { 114 DEFINE_NATIVE_ENTRY(Integer_mulFromInteger, 2) {
111 const Integer& right_int = Integer::CheckedHandle(arguments->NativeArgAt(0)); 115 const Integer& right_int = Integer::CheckedHandle(arguments->NativeArgAt(0));
112 GET_NATIVE_ARGUMENT(Integer, left_int, arguments->NativeArgAt(1)); 116 GET_NATIVE_ARGUMENT(Integer, left_int, arguments->NativeArgAt(1));
113 ASSERT(CheckInteger(right_int)); 117 ASSERT(CheckInteger(right_int));
114 ASSERT(CheckInteger(left_int)); 118 ASSERT(CheckInteger(left_int));
115 if (FLAG_trace_intrinsified_natives) { 119 if (FLAG_trace_intrinsified_natives) {
116 OS::Print("Integer_mulFromInteger %s * %s\n", 120 OS::Print("Integer_mulFromInteger %s * %s\n",
117 left_int.ToCString(), right_int.ToCString()); 121 left_int.ToCString(), right_int.ToCString());
118 } 122 }
119 return left_int.ArithmeticOp(Token::kMUL, right_int); 123 const Integer& result =
124 Integer::Handle(left_int.ArithmeticOp(Token::kMUL, right_int));
125 return result.AsValidInteger();
120 } 126 }
121 127
122 128
123 DEFINE_NATIVE_ENTRY(Integer_truncDivFromInteger, 2) { 129 DEFINE_NATIVE_ENTRY(Integer_truncDivFromInteger, 2) {
124 const Integer& right_int = Integer::CheckedHandle(arguments->NativeArgAt(0)); 130 const Integer& right_int = Integer::CheckedHandle(arguments->NativeArgAt(0));
125 GET_NATIVE_ARGUMENT(Integer, left_int, arguments->NativeArgAt(1)); 131 GET_NATIVE_ARGUMENT(Integer, left_int, arguments->NativeArgAt(1));
126 ASSERT(CheckInteger(right_int)); 132 ASSERT(CheckInteger(right_int));
127 ASSERT(CheckInteger(left_int)); 133 ASSERT(CheckInteger(left_int));
128 ASSERT(!right_int.IsZero()); 134 ASSERT(!right_int.IsZero());
129 return left_int.ArithmeticOp(Token::kTRUNCDIV, right_int); 135 const Integer& result =
136 Integer::Handle(left_int.ArithmeticOp(Token::kTRUNCDIV, right_int));
137 return result.AsValidInteger();
130 } 138 }
131 139
132 140
133 DEFINE_NATIVE_ENTRY(Integer_moduloFromInteger, 2) { 141 DEFINE_NATIVE_ENTRY(Integer_moduloFromInteger, 2) {
134 const Integer& right_int = Integer::CheckedHandle(arguments->NativeArgAt(0)); 142 const Integer& right_int = Integer::CheckedHandle(arguments->NativeArgAt(0));
135 GET_NATIVE_ARGUMENT(Integer, left_int, arguments->NativeArgAt(1)); 143 GET_NATIVE_ARGUMENT(Integer, left_int, arguments->NativeArgAt(1));
136 ASSERT(CheckInteger(right_int)); 144 ASSERT(CheckInteger(right_int));
137 ASSERT(CheckInteger(right_int)); 145 ASSERT(CheckInteger(right_int));
138 if (FLAG_trace_intrinsified_natives) { 146 if (FLAG_trace_intrinsified_natives) {
139 OS::Print("Integer_moduloFromInteger %s mod %s\n", 147 OS::Print("Integer_moduloFromInteger %s mod %s\n",
140 left_int.ToCString(), right_int.ToCString()); 148 left_int.ToCString(), right_int.ToCString());
141 } 149 }
142 if (right_int.IsZero()) { 150 if (right_int.IsZero()) {
143 // Should have been caught before calling into runtime. 151 // Should have been caught before calling into runtime.
144 UNIMPLEMENTED(); 152 UNIMPLEMENTED();
145 } 153 }
146 return left_int.ArithmeticOp(Token::kMOD, right_int); 154 const Integer& result =
155 Integer::Handle(left_int.ArithmeticOp(Token::kMOD, right_int));
156 return result.AsValidInteger();
147 } 157 }
148 158
149 159
150 DEFINE_NATIVE_ENTRY(Integer_greaterThanFromInteger, 2) { 160 DEFINE_NATIVE_ENTRY(Integer_greaterThanFromInteger, 2) {
151 const Integer& right = Integer::CheckedHandle(arguments->NativeArgAt(0)); 161 const Integer& right = Integer::CheckedHandle(arguments->NativeArgAt(0));
152 GET_NATIVE_ARGUMENT(Integer, left, arguments->NativeArgAt(1)); 162 GET_NATIVE_ARGUMENT(Integer, left, arguments->NativeArgAt(1));
153 ASSERT(CheckInteger(right)); 163 ASSERT(CheckInteger(right));
154 ASSERT(CheckInteger(left)); 164 ASSERT(CheckInteger(left));
155 if (FLAG_trace_intrinsified_natives) { 165 if (FLAG_trace_intrinsified_natives) {
156 OS::Print("Integer_greaterThanFromInteger %s > %s\n", 166 OS::Print("Integer_greaterThanFromInteger %s > %s\n",
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
243 } 253 }
244 return Integer::null(); 254 return Integer::null();
245 } 255 }
246 256
247 257
248 DEFINE_NATIVE_ENTRY(Smi_shrFromInt, 2) { 258 DEFINE_NATIVE_ENTRY(Smi_shrFromInt, 2) {
249 const Smi& amount = Smi::CheckedHandle(arguments->NativeArgAt(0)); 259 const Smi& amount = Smi::CheckedHandle(arguments->NativeArgAt(0));
250 GET_NATIVE_ARGUMENT(Integer, value, arguments->NativeArgAt(1)); 260 GET_NATIVE_ARGUMENT(Integer, value, arguments->NativeArgAt(1));
251 ASSERT(CheckInteger(amount)); 261 ASSERT(CheckInteger(amount));
252 ASSERT(CheckInteger(value)); 262 ASSERT(CheckInteger(value));
253 Integer& result = Integer::Handle( 263 const Integer& result = Integer::Handle(
254 ShiftOperationHelper(Token::kSHR, value, amount)); 264 ShiftOperationHelper(Token::kSHR, value, amount));
255 return result.AsInteger(); 265 return result.AsValidInteger();
256 } 266 }
257 267
258 268
259 269
260 DEFINE_NATIVE_ENTRY(Smi_shlFromInt, 2) { 270 DEFINE_NATIVE_ENTRY(Smi_shlFromInt, 2) {
261 const Smi& amount = Smi::CheckedHandle(arguments->NativeArgAt(0)); 271 const Smi& amount = Smi::CheckedHandle(arguments->NativeArgAt(0));
262 GET_NATIVE_ARGUMENT(Integer, value, arguments->NativeArgAt(1)); 272 GET_NATIVE_ARGUMENT(Integer, value, arguments->NativeArgAt(1));
263 ASSERT(CheckInteger(amount)); 273 ASSERT(CheckInteger(amount));
264 ASSERT(CheckInteger(value)); 274 ASSERT(CheckInteger(value));
265 if (FLAG_trace_intrinsified_natives) { 275 if (FLAG_trace_intrinsified_natives) {
266 OS::Print("Smi_shlFromInt: %s << %s\n", 276 OS::Print("Smi_shlFromInt: %s << %s\n",
267 value.ToCString(), amount.ToCString()); 277 value.ToCString(), amount.ToCString());
268 } 278 }
269 Integer& result = Integer::Handle( 279 const Integer& result = Integer::Handle(
270 ShiftOperationHelper(Token::kSHL, value, amount)); 280 ShiftOperationHelper(Token::kSHL, value, amount));
271 return result.AsInteger(); 281 return result.AsValidInteger();
272 } 282 }
273 283
274 284
275 DEFINE_NATIVE_ENTRY(Smi_bitNegate, 1) { 285 DEFINE_NATIVE_ENTRY(Smi_bitNegate, 1) {
276 const Smi& operand = Smi::CheckedHandle(arguments->NativeArgAt(0)); 286 const Smi& operand = Smi::CheckedHandle(arguments->NativeArgAt(0));
277 if (FLAG_trace_intrinsified_natives) { 287 if (FLAG_trace_intrinsified_natives) {
278 OS::Print("Smi_bitNegate: %s\n", operand.ToCString()); 288 OS::Print("Smi_bitNegate: %s\n", operand.ToCString());
279 } 289 }
280 intptr_t result = ~operand.Value(); 290 intptr_t result = ~operand.Value();
281 ASSERT(Smi::IsValid(result)); 291 ASSERT(Smi::IsValid(result));
(...skipping 12 matching lines...) Expand all
294 return Integer::New(result); 304 return Integer::New(result);
295 } 305 }
296 306
297 // Bigint natives. 307 // Bigint natives.
298 308
299 DEFINE_NATIVE_ENTRY(Bigint_bitNegate, 1) { 309 DEFINE_NATIVE_ENTRY(Bigint_bitNegate, 1) {
300 const Bigint& value = Bigint::CheckedHandle(arguments->NativeArgAt(0)); 310 const Bigint& value = Bigint::CheckedHandle(arguments->NativeArgAt(0));
301 const Bigint& result = Bigint::Handle(BigintOperations::BitNot(value)); 311 const Bigint& result = Bigint::Handle(BigintOperations::BitNot(value));
302 ASSERT(CheckInteger(value)); 312 ASSERT(CheckInteger(value));
303 ASSERT(CheckInteger(result)); 313 ASSERT(CheckInteger(result));
304 return result.AsInteger(); 314 return result.AsValidInteger();
305 } 315 }
306 316
307 } // namespace dart 317 } // namespace dart
OLDNEW
« no previous file with comments | « no previous file | runtime/vm/object.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698