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

Side by Side Diff: runtime/lib/integers.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/double.cc ('k') | runtime/lib/math.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 "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 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
152 Mint& mint = Mint::Handle(); 152 Mint& mint = Mint::Handle();
153 mint ^= i.raw(); 153 mint ^= i.raw();
154 return !Smi::IsValid64(mint.value()); 154 return !Smi::IsValid64(mint.value());
155 } 155 }
156 return true; 156 return true;
157 } 157 }
158 158
159 159
160 DEFINE_NATIVE_ENTRY(Integer_bitAndFromInteger, 2) { 160 DEFINE_NATIVE_ENTRY(Integer_bitAndFromInteger, 2) {
161 const Integer& right = Integer::CheckedHandle(arguments->At(0)); 161 const Integer& right = Integer::CheckedHandle(arguments->At(0));
162 const Integer& left = Integer::CheckedHandle(arguments->At(1)); 162 GET_NATIVE_ARGUMENT(Integer, left, arguments->At(1));
163 ASSERT(CheckInteger(right)); 163 ASSERT(CheckInteger(right));
164 ASSERT(CheckInteger(left)); 164 ASSERT(CheckInteger(left));
165 if (FLAG_trace_intrinsified_natives) { 165 if (FLAG_trace_intrinsified_natives) {
166 OS::Print("Integer_bitAndFromInteger %s & %s\n", 166 OS::Print("Integer_bitAndFromInteger %s & %s\n",
167 right.ToCString(), left.ToCString()); 167 right.ToCString(), left.ToCString());
168 } 168 }
169 Integer& result = Integer::Handle( 169 Integer& result = Integer::Handle(
170 IntegerBitOperation(Token::kBIT_AND, left, right)); 170 IntegerBitOperation(Token::kBIT_AND, left, right));
171 arguments->SetReturn(Integer::Handle(AsInteger(result))); 171 arguments->SetReturn(Integer::Handle(AsInteger(result)));
172 } 172 }
173 173
174 174
175 DEFINE_NATIVE_ENTRY(Integer_bitOrFromInteger, 2) { 175 DEFINE_NATIVE_ENTRY(Integer_bitOrFromInteger, 2) {
176 const Integer& right = Integer::CheckedHandle(arguments->At(0)); 176 const Integer& right = Integer::CheckedHandle(arguments->At(0));
177 const Integer& left = Integer::CheckedHandle(arguments->At(1)); 177 GET_NATIVE_ARGUMENT(Integer, left, arguments->At(1));
178 ASSERT(CheckInteger(right)); 178 ASSERT(CheckInteger(right));
179 ASSERT(CheckInteger(left)); 179 ASSERT(CheckInteger(left));
180 if (FLAG_trace_intrinsified_natives) { 180 if (FLAG_trace_intrinsified_natives) {
181 OS::Print("Integer_bitOrFromInteger %s | %s\n", 181 OS::Print("Integer_bitOrFromInteger %s | %s\n",
182 left.ToCString(), right.ToCString()); 182 left.ToCString(), right.ToCString());
183 } 183 }
184 Integer& result = Integer::Handle( 184 Integer& result = Integer::Handle(
185 IntegerBitOperation(Token::kBIT_OR, left, right)); 185 IntegerBitOperation(Token::kBIT_OR, left, right));
186 arguments->SetReturn(Integer::Handle(AsInteger(result))); 186 arguments->SetReturn(Integer::Handle(AsInteger(result)));
187 } 187 }
188 188
189 189
190 DEFINE_NATIVE_ENTRY(Integer_bitXorFromInteger, 2) { 190 DEFINE_NATIVE_ENTRY(Integer_bitXorFromInteger, 2) {
191 const Integer& right = Integer::CheckedHandle(arguments->At(0)); 191 const Integer& right = Integer::CheckedHandle(arguments->At(0));
192 const Integer& left = Integer::CheckedHandle(arguments->At(1)); 192 GET_NATIVE_ARGUMENT(Integer, left, arguments->At(1));
193 ASSERT(CheckInteger(right)); 193 ASSERT(CheckInteger(right));
194 ASSERT(CheckInteger(left)); 194 ASSERT(CheckInteger(left));
195 if (FLAG_trace_intrinsified_natives) { 195 if (FLAG_trace_intrinsified_natives) {
196 OS::Print("Integer_bitXorFromInteger %s ^ %s\n", 196 OS::Print("Integer_bitXorFromInteger %s ^ %s\n",
197 left.ToCString(), right.ToCString()); 197 left.ToCString(), right.ToCString());
198 } 198 }
199 Integer& result = Integer::Handle( 199 Integer& result = Integer::Handle(
200 IntegerBitOperation(Token::kBIT_XOR, left, right)); 200 IntegerBitOperation(Token::kBIT_XOR, left, right));
201 arguments->SetReturn(Integer::Handle(AsInteger(result))); 201 arguments->SetReturn(Integer::Handle(AsInteger(result)));
202 } 202 }
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
323 const Bigint& left_big = Bigint::Handle(AsBigint(left_int)); 323 const Bigint& left_big = Bigint::Handle(AsBigint(left_int));
324 const Bigint& right_big = Bigint::Handle(AsBigint(right_int)); 324 const Bigint& right_big = Bigint::Handle(AsBigint(right_int));
325 const Bigint& result = 325 const Bigint& result =
326 Bigint::Handle(BinaryOpWithTwoBigints(operation, left_big, right_big)); 326 Bigint::Handle(BinaryOpWithTwoBigints(operation, left_big, right_big));
327 return Integer::Handle(AsInteger(result)).raw(); 327 return Integer::Handle(AsInteger(result)).raw();
328 } 328 }
329 329
330 330
331 DEFINE_NATIVE_ENTRY(Integer_addFromInteger, 2) { 331 DEFINE_NATIVE_ENTRY(Integer_addFromInteger, 2) {
332 const Integer& right_int = Integer::CheckedHandle(arguments->At(0)); 332 const Integer& right_int = Integer::CheckedHandle(arguments->At(0));
333 const Integer& left_int = Integer::CheckedHandle(arguments->At(1)); 333 GET_NATIVE_ARGUMENT(Integer, left_int, arguments->At(1));
334 ASSERT(CheckInteger(right_int)); 334 ASSERT(CheckInteger(right_int));
335 ASSERT(CheckInteger(left_int)); 335 ASSERT(CheckInteger(left_int));
336 if (FLAG_trace_intrinsified_natives) { 336 if (FLAG_trace_intrinsified_natives) {
337 OS::Print("Integer_addFromInteger %s + %s\n", 337 OS::Print("Integer_addFromInteger %s + %s\n",
338 left_int.ToCString(), right_int.ToCString()); 338 left_int.ToCString(), right_int.ToCString());
339 } 339 }
340 const Integer& result = 340 const Integer& result =
341 Integer::Handle(IntegerBinopHelper(Token::kADD, left_int, right_int)); 341 Integer::Handle(IntegerBinopHelper(Token::kADD, left_int, right_int));
342 arguments->SetReturn(result); 342 arguments->SetReturn(result);
343 } 343 }
344 344
345 345
346 DEFINE_NATIVE_ENTRY(Integer_subFromInteger, 2) { 346 DEFINE_NATIVE_ENTRY(Integer_subFromInteger, 2) {
347 const Integer& right_int = Integer::CheckedHandle(arguments->At(0)); 347 const Integer& right_int = Integer::CheckedHandle(arguments->At(0));
348 const Integer& left_int = Integer::CheckedHandle(arguments->At(1)); 348 GET_NATIVE_ARGUMENT(Integer, left_int, arguments->At(1));
349 ASSERT(CheckInteger(right_int)); 349 ASSERT(CheckInteger(right_int));
350 ASSERT(CheckInteger(left_int)); 350 ASSERT(CheckInteger(left_int));
351 if (FLAG_trace_intrinsified_natives) { 351 if (FLAG_trace_intrinsified_natives) {
352 OS::Print("Integer_subFromInteger %s - %s\n", 352 OS::Print("Integer_subFromInteger %s - %s\n",
353 left_int.ToCString(), right_int.ToCString()); 353 left_int.ToCString(), right_int.ToCString());
354 } 354 }
355 const Integer& result = 355 const Integer& result =
356 Integer::Handle(IntegerBinopHelper(Token::kSUB, left_int, right_int)); 356 Integer::Handle(IntegerBinopHelper(Token::kSUB, left_int, right_int));
357 arguments->SetReturn(result); 357 arguments->SetReturn(result);
358 } 358 }
359 359
360 360
361 DEFINE_NATIVE_ENTRY(Integer_mulFromInteger, 2) { 361 DEFINE_NATIVE_ENTRY(Integer_mulFromInteger, 2) {
362 const Integer& right_int = Integer::CheckedHandle(arguments->At(0)); 362 const Integer& right_int = Integer::CheckedHandle(arguments->At(0));
363 const Integer& left_int = Integer::CheckedHandle(arguments->At(1)); 363 GET_NATIVE_ARGUMENT(Integer, left_int, arguments->At(1));
364 ASSERT(CheckInteger(right_int)); 364 ASSERT(CheckInteger(right_int));
365 ASSERT(CheckInteger(left_int)); 365 ASSERT(CheckInteger(left_int));
366 if (FLAG_trace_intrinsified_natives) { 366 if (FLAG_trace_intrinsified_natives) {
367 OS::Print("Integer_mulFromInteger %s * %s\n", 367 OS::Print("Integer_mulFromInteger %s * %s\n",
368 left_int.ToCString(), right_int.ToCString()); 368 left_int.ToCString(), right_int.ToCString());
369 } 369 }
370 const Integer& result = 370 const Integer& result =
371 Integer::Handle(IntegerBinopHelper(Token::kMUL, left_int, right_int)); 371 Integer::Handle(IntegerBinopHelper(Token::kMUL, left_int, right_int));
372 arguments->SetReturn(result); 372 arguments->SetReturn(result);
373 } 373 }
374 374
375 375
376 DEFINE_NATIVE_ENTRY(Integer_truncDivFromInteger, 2) { 376 DEFINE_NATIVE_ENTRY(Integer_truncDivFromInteger, 2) {
377 const Integer& right_int = Integer::CheckedHandle(arguments->At(0)); 377 const Integer& right_int = Integer::CheckedHandle(arguments->At(0));
378 const Integer& left_int = Integer::CheckedHandle(arguments->At(1)); 378 GET_NATIVE_ARGUMENT(Integer, left_int, arguments->At(1));
379 ASSERT(CheckInteger(right_int)); 379 ASSERT(CheckInteger(right_int));
380 ASSERT(CheckInteger(left_int)); 380 ASSERT(CheckInteger(left_int));
381 ASSERT(!right_int.IsZero()); 381 ASSERT(!right_int.IsZero());
382 const Integer& result = Integer::Handle( 382 const Integer& result = Integer::Handle(
383 IntegerBinopHelper(Token::kTRUNCDIV, left_int, right_int)); 383 IntegerBinopHelper(Token::kTRUNCDIV, left_int, right_int));
384 arguments->SetReturn(result); 384 arguments->SetReturn(result);
385 } 385 }
386 386
387 387
388 DEFINE_NATIVE_ENTRY(Integer_moduloFromInteger, 2) { 388 DEFINE_NATIVE_ENTRY(Integer_moduloFromInteger, 2) {
389 const Integer& right_int = Integer::CheckedHandle(arguments->At(0)); 389 const Integer& right_int = Integer::CheckedHandle(arguments->At(0));
390 const Integer& left_int = Integer::CheckedHandle(arguments->At(1)); 390 GET_NATIVE_ARGUMENT(Integer, left_int, arguments->At(1));
391 ASSERT(CheckInteger(right_int)); 391 ASSERT(CheckInteger(right_int));
392 ASSERT(CheckInteger(right_int)); 392 ASSERT(CheckInteger(right_int));
393 if (FLAG_trace_intrinsified_natives) { 393 if (FLAG_trace_intrinsified_natives) {
394 OS::Print("Integer_moduloFromInteger %s mod %s\n", 394 OS::Print("Integer_moduloFromInteger %s mod %s\n",
395 left_int.ToCString(), right_int.ToCString()); 395 left_int.ToCString(), right_int.ToCString());
396 } 396 }
397 if (right_int.IsZero()) { 397 if (right_int.IsZero()) {
398 // Should have been caught before calling into runtime. 398 // Should have been caught before calling into runtime.
399 UNIMPLEMENTED(); 399 UNIMPLEMENTED();
400 } 400 }
401 const Integer& result = 401 const Integer& result =
402 Integer::Handle(IntegerBinopHelper(Token::kMOD, left_int, right_int)); 402 Integer::Handle(IntegerBinopHelper(Token::kMOD, left_int, right_int));
403 arguments->SetReturn(result); 403 arguments->SetReturn(result);
404 } 404 }
405 405
406 406
407 DEFINE_NATIVE_ENTRY(Integer_greaterThanFromInteger, 2) { 407 DEFINE_NATIVE_ENTRY(Integer_greaterThanFromInteger, 2) {
408 const Integer& right = Integer::CheckedHandle(arguments->At(0)); 408 const Integer& right = Integer::CheckedHandle(arguments->At(0));
409 const Integer& left = Integer::CheckedHandle(arguments->At(1)); 409 GET_NATIVE_ARGUMENT(Integer, left, arguments->At(1));
410 ASSERT(CheckInteger(right)); 410 ASSERT(CheckInteger(right));
411 ASSERT(CheckInteger(left)); 411 ASSERT(CheckInteger(left));
412 if (FLAG_trace_intrinsified_natives) { 412 if (FLAG_trace_intrinsified_natives) {
413 OS::Print("Integer_greaterThanFromInteger %s > %s\n", 413 OS::Print("Integer_greaterThanFromInteger %s > %s\n",
414 left.ToCString(), right.ToCString()); 414 left.ToCString(), right.ToCString());
415 } 415 }
416 const Bool& result = Bool::Handle(Bool::Get(left.CompareWith(right) == 1)); 416 const Bool& result = Bool::Handle(Bool::Get(left.CompareWith(right) == 1));
417 arguments->SetReturn(result); 417 arguments->SetReturn(result);
418 } 418 }
419 419
420 420
421 DEFINE_NATIVE_ENTRY(Integer_equalToInteger, 2) { 421 DEFINE_NATIVE_ENTRY(Integer_equalToInteger, 2) {
422 const Integer& left = Integer::CheckedHandle(arguments->At(0)); 422 const Integer& left = Integer::CheckedHandle(arguments->At(0));
423 const Integer& right = Integer::CheckedHandle(arguments->At(1)); 423 GET_NATIVE_ARGUMENT(Integer, right, arguments->At(1));
424 ASSERT(CheckInteger(left)); 424 ASSERT(CheckInteger(left));
425 ASSERT(CheckInteger(right)); 425 ASSERT(CheckInteger(right));
426 if (FLAG_trace_intrinsified_natives) { 426 if (FLAG_trace_intrinsified_natives) {
427 OS::Print("Integer_equalToInteger %s == %s\n", 427 OS::Print("Integer_equalToInteger %s == %s\n",
428 left.ToCString(), right.ToCString()); 428 left.ToCString(), right.ToCString());
429 } 429 }
430 const Bool& result = Bool::Handle(Bool::Get(left.CompareWith(right) == 0)); 430 const Bool& result = Bool::Handle(Bool::Get(left.CompareWith(right) == 0));
431 arguments->SetReturn(result); 431 arguments->SetReturn(result);
432 } 432 }
433 433
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
521 return BigintOperations::ShiftRight(big_value, amount.Value()); 521 return BigintOperations::ShiftRight(big_value, amount.Value());
522 default: 522 default:
523 UNIMPLEMENTED(); 523 UNIMPLEMENTED();
524 } 524 }
525 return Integer::null(); 525 return Integer::null();
526 } 526 }
527 527
528 528
529 DEFINE_NATIVE_ENTRY(Smi_sarFromInt, 2) { 529 DEFINE_NATIVE_ENTRY(Smi_sarFromInt, 2) {
530 const Smi& amount = Smi::CheckedHandle(arguments->At(0)); 530 const Smi& amount = Smi::CheckedHandle(arguments->At(0));
531 const Integer& value = Integer::CheckedHandle(arguments->At(1)); 531 GET_NATIVE_ARGUMENT(Integer, value, arguments->At(1));
532 ASSERT(CheckInteger(amount)); 532 ASSERT(CheckInteger(amount));
533 ASSERT(CheckInteger(value)); 533 ASSERT(CheckInteger(value));
534 Integer& result = Integer::Handle( 534 Integer& result = Integer::Handle(
535 ShiftOperationHelper(Token::kSAR, value, amount)); 535 ShiftOperationHelper(Token::kSAR, value, amount));
536 arguments->SetReturn(Integer::Handle(AsInteger(result))); 536 arguments->SetReturn(Integer::Handle(AsInteger(result)));
537 } 537 }
538 538
539 539
540 540
541 DEFINE_NATIVE_ENTRY(Smi_shlFromInt, 2) { 541 DEFINE_NATIVE_ENTRY(Smi_shlFromInt, 2) {
542 const Smi& amount = Smi::CheckedHandle(arguments->At(0)); 542 const Smi& amount = Smi::CheckedHandle(arguments->At(0));
543 const Integer& value = Integer::CheckedHandle(arguments->At(1)); 543 GET_NATIVE_ARGUMENT(Integer, value, arguments->At(1));
544 ASSERT(CheckInteger(amount)); 544 ASSERT(CheckInteger(amount));
545 ASSERT(CheckInteger(value)); 545 ASSERT(CheckInteger(value));
546 if (FLAG_trace_intrinsified_natives) { 546 if (FLAG_trace_intrinsified_natives) {
547 OS::Print("Smi_shlFromInt: %s << %s\n", 547 OS::Print("Smi_shlFromInt: %s << %s\n",
548 value.ToCString(), amount.ToCString()); 548 value.ToCString(), amount.ToCString());
549 } 549 }
550 Integer& result = Integer::Handle( 550 Integer& result = Integer::Handle(
551 ShiftOperationHelper(Token::kSHL, value, amount)); 551 ShiftOperationHelper(Token::kSHL, value, amount));
552 arguments->SetReturn(Integer::Handle(AsInteger(result))); 552 arguments->SetReturn(Integer::Handle(AsInteger(result)));
553 } 553 }
(...skipping 25 matching lines...) Expand all
579 579
580 DEFINE_NATIVE_ENTRY(Bigint_bitNegate, 1) { 580 DEFINE_NATIVE_ENTRY(Bigint_bitNegate, 1) {
581 const Bigint& value = Bigint::CheckedHandle(arguments->At(0)); 581 const Bigint& value = Bigint::CheckedHandle(arguments->At(0));
582 const Bigint& result = Bigint::Handle(BigintOperations::BitNot(value)); 582 const Bigint& result = Bigint::Handle(BigintOperations::BitNot(value));
583 ASSERT(CheckInteger(value)); 583 ASSERT(CheckInteger(value));
584 ASSERT(CheckInteger(result)); 584 ASSERT(CheckInteger(result));
585 arguments->SetReturn(Integer::Handle(AsInteger(result))); 585 arguments->SetReturn(Integer::Handle(AsInteger(result)));
586 } 586 }
587 587
588 } // namespace dart 588 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/lib/double.cc ('k') | runtime/lib/math.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698