| 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 "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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |