LCOV - code coverage report
Current view: top level - src/runtime - runtime-bigint.cc (source / functions) Hit Total Coverage
Test: app.info Lines: 83 85 97.6 %
Date: 2019-01-20 Functions: 13 24 54.2 %

          Line data    Source code
       1             : // Copyright 2017 the V8 project authors. All rights reserved.
       2             : // Use of this source code is governed by a BSD-style license that can be
       3             : // found in the LICENSE file.
       4             : 
       5             : #include "src/arguments-inl.h"
       6             : #include "src/counters.h"
       7             : #include "src/objects-inl.h"
       8             : #include "src/objects/bigint.h"
       9             : #include "src/runtime/runtime-utils.h"
      10             : 
      11             : namespace v8 {
      12             : namespace internal {
      13             : 
      14        1746 : RUNTIME_FUNCTION(Runtime_BigIntCompareToBigInt) {
      15             :   SealHandleScope shs(isolate);
      16             :   DCHECK_EQ(3, args.length());
      17        3492 :   CONVERT_ARG_HANDLE_CHECKED(Smi, mode, 0);
      18        3492 :   CONVERT_ARG_HANDLE_CHECKED(BigInt, lhs, 1);
      19        3492 :   CONVERT_ARG_HANDLE_CHECKED(BigInt, rhs, 2);
      20        3492 :   bool result = ComparisonResultToBool(static_cast<Operation>(mode->value()),
      21        3492 :                                        BigInt::CompareToBigInt(lhs, rhs));
      22        3492 :   return *isolate->factory()->ToBoolean(result);
      23             : }
      24             : 
      25         720 : RUNTIME_FUNCTION(Runtime_BigIntCompareToNumber) {
      26             :   SealHandleScope shs(isolate);
      27             :   DCHECK_EQ(3, args.length());
      28        1440 :   CONVERT_ARG_HANDLE_CHECKED(Smi, mode, 0);
      29        1440 :   CONVERT_ARG_HANDLE_CHECKED(BigInt, lhs, 1);
      30         720 :   CONVERT_ARG_HANDLE_CHECKED(Object, rhs, 2);
      31        1440 :   bool result = ComparisonResultToBool(static_cast<Operation>(mode->value()),
      32        1440 :                                        BigInt::CompareToNumber(lhs, rhs));
      33        1440 :   return *isolate->factory()->ToBoolean(result);
      34             : }
      35             : 
      36         252 : RUNTIME_FUNCTION(Runtime_BigIntCompareToString) {
      37         252 :   HandleScope scope(isolate);
      38             :   DCHECK_EQ(3, args.length());
      39         504 :   CONVERT_ARG_HANDLE_CHECKED(Smi, mode, 0);
      40         504 :   CONVERT_ARG_HANDLE_CHECKED(BigInt, lhs, 1);
      41         504 :   CONVERT_ARG_HANDLE_CHECKED(String, rhs, 2);
      42             :   bool result =
      43         504 :       ComparisonResultToBool(static_cast<Operation>(mode->value()),
      44         504 :                              BigInt::CompareToString(isolate, lhs, rhs));
      45         504 :   return *isolate->factory()->ToBoolean(result);
      46             : }
      47             : 
      48       15011 : RUNTIME_FUNCTION(Runtime_BigIntEqualToBigInt) {
      49             :   SealHandleScope shs(isolate);
      50             :   DCHECK_EQ(2, args.length());
      51       30022 :   CONVERT_ARG_HANDLE_CHECKED(BigInt, lhs, 0);
      52       30022 :   CONVERT_ARG_HANDLE_CHECKED(BigInt, rhs, 1);
      53       15011 :   bool result = BigInt::EqualToBigInt(*lhs, *rhs);
      54       30022 :   return *isolate->factory()->ToBoolean(result);
      55             : }
      56             : 
      57         864 : RUNTIME_FUNCTION(Runtime_BigIntEqualToNumber) {
      58             :   SealHandleScope shs(isolate);
      59             :   DCHECK_EQ(2, args.length());
      60        1728 :   CONVERT_ARG_HANDLE_CHECKED(BigInt, lhs, 0);
      61         864 :   CONVERT_ARG_HANDLE_CHECKED(Object, rhs, 1);
      62         864 :   bool result = BigInt::EqualToNumber(lhs, rhs);
      63        1728 :   return *isolate->factory()->ToBoolean(result);
      64             : }
      65             : 
      66         333 : RUNTIME_FUNCTION(Runtime_BigIntEqualToString) {
      67         333 :   HandleScope scope(isolate);
      68             :   DCHECK_EQ(2, args.length());
      69         666 :   CONVERT_ARG_HANDLE_CHECKED(BigInt, lhs, 0);
      70         666 :   CONVERT_ARG_HANDLE_CHECKED(String, rhs, 1);
      71         333 :   bool result = BigInt::EqualToString(isolate, lhs, rhs);
      72         666 :   return *isolate->factory()->ToBoolean(result);
      73             : }
      74             : 
      75         283 : RUNTIME_FUNCTION(Runtime_BigIntToBoolean) {
      76             :   SealHandleScope shs(isolate);
      77             :   DCHECK_EQ(1, args.length());
      78         566 :   CONVERT_ARG_HANDLE_CHECKED(BigInt, bigint, 0);
      79         566 :   return *isolate->factory()->ToBoolean(bigint->ToBoolean());
      80             : }
      81             : 
      82         468 : RUNTIME_FUNCTION(Runtime_BigIntToNumber) {
      83         468 :   HandleScope scope(isolate);
      84             :   DCHECK_EQ(1, args.length());
      85         936 :   CONVERT_ARG_HANDLE_CHECKED(BigInt, x, 0);
      86         936 :   return *BigInt::ToNumber(isolate, x);
      87             : }
      88             : 
      89         504 : RUNTIME_FUNCTION(Runtime_ToBigInt) {
      90         504 :   HandleScope scope(isolate);
      91             :   DCHECK_EQ(1, args.length());
      92         504 :   CONVERT_ARG_HANDLE_CHECKED(Object, x, 0);
      93        1512 :   RETURN_RESULT_OR_FAILURE(isolate, BigInt::FromObject(isolate, x));
      94             : }
      95             : 
      96      100055 : RUNTIME_FUNCTION(Runtime_BigIntBinaryOp) {
      97      100055 :   HandleScope scope(isolate);
      98             :   DCHECK_EQ(3, args.length());
      99      100055 :   CONVERT_ARG_HANDLE_CHECKED(Object, left_obj, 0);
     100      100055 :   CONVERT_ARG_HANDLE_CHECKED(Object, right_obj, 1);
     101      200110 :   CONVERT_SMI_ARG_CHECKED(opcode, 2);
     102             :   Operation op = static_cast<Operation>(opcode);
     103             : 
     104      396404 :   if (!left_obj->IsBigInt() || !right_obj->IsBigInt()) {
     105        6240 :     THROW_NEW_ERROR_RETURN_FAILURE(
     106             :         isolate, NewTypeError(MessageTemplate::kBigIntMixedTypes));
     107             :   }
     108       96935 :   Handle<BigInt> left(Handle<BigInt>::cast(left_obj));
     109       96935 :   Handle<BigInt> right(Handle<BigInt>::cast(right_obj));
     110             :   MaybeHandle<BigInt> result;
     111       96935 :   switch (op) {
     112             :     case Operation::kAdd:
     113       46548 :       result = BigInt::Add(isolate, left, right);
     114             :       break;
     115             :     case Operation::kSubtract:
     116         810 :       result = BigInt::Subtract(isolate, left, right);
     117             :       break;
     118             :     case Operation::kMultiply:
     119       46251 :       result = BigInt::Multiply(isolate, left, right);
     120             :       break;
     121             :     case Operation::kDivide:
     122         387 :       result = BigInt::Divide(isolate, left, right);
     123             :       break;
     124             :     case Operation::kModulus:
     125         387 :       result = BigInt::Remainder(isolate, left, right);
     126             :       break;
     127             :     case Operation::kExponentiate:
     128         617 :       result = BigInt::Exponentiate(isolate, left, right);
     129             :       break;
     130             :     case Operation::kBitwiseAnd:
     131         369 :       result = BigInt::BitwiseAnd(isolate, left, right);
     132             :       break;
     133             :     case Operation::kBitwiseOr:
     134         342 :       result = BigInt::BitwiseOr(isolate, left, right);
     135             :       break;
     136             :     case Operation::kBitwiseXor:
     137         342 :       result = BigInt::BitwiseXor(isolate, left, right);
     138             :       break;
     139             :     case Operation::kShiftLeft:
     140         423 :       result = BigInt::LeftShift(isolate, left, right);
     141             :       break;
     142             :     case Operation::kShiftRight:
     143         342 :       result = BigInt::SignedRightShift(isolate, left, right);
     144             :       break;
     145             :     case Operation::kShiftRightLogical:
     146         117 :       result = BigInt::UnsignedRightShift(isolate, left, right);
     147             :       break;
     148             :     default:
     149           0 :       UNREACHABLE();
     150             :   }
     151      196990 :   RETURN_RESULT_OR_FAILURE(isolate, result);
     152             : }
     153             : 
     154        7650 : RUNTIME_FUNCTION(Runtime_BigIntUnaryOp) {
     155        7650 :   HandleScope scope(isolate);
     156             :   DCHECK_EQ(2, args.length());
     157       15300 :   CONVERT_ARG_HANDLE_CHECKED(BigInt, x, 0);
     158       15300 :   CONVERT_SMI_ARG_CHECKED(opcode, 1);
     159             :   Operation op = static_cast<Operation>(opcode);
     160             : 
     161             :   MaybeHandle<BigInt> result;
     162        7650 :   switch (op) {
     163             :     case Operation::kBitwiseNot:
     164         342 :       result = BigInt::BitwiseNot(isolate, x);
     165             :       break;
     166             :     case Operation::kNegate:
     167        6344 :       result = BigInt::UnaryMinus(isolate, x);
     168             :       break;
     169             :     case Operation::kIncrement:
     170         482 :       result = BigInt::Increment(isolate, x);
     171             :       break;
     172             :     case Operation::kDecrement:
     173         482 :       result = BigInt::Decrement(isolate, x);
     174             :       break;
     175             :     default:
     176           0 :       UNREACHABLE();
     177             :   }
     178       15300 :   RETURN_RESULT_OR_FAILURE(isolate, result);
     179             : }
     180             : 
     181             : }  // namespace internal
     182      183867 : }  // namespace v8

Generated by: LCOV version 1.10