| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 1389 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1400 #define DATA_VIEW_GETTER(TypeName, Type, Converter) \ | 1400 #define DATA_VIEW_GETTER(TypeName, Type, Converter) \ |
| 1401 RUNTIME_FUNCTION(MaybeObject*, Runtime_DataViewGet##TypeName) { \ | 1401 RUNTIME_FUNCTION(MaybeObject*, Runtime_DataViewGet##TypeName) { \ |
| 1402 HandleScope scope(isolate); \ | 1402 HandleScope scope(isolate); \ |
| 1403 ASSERT(args.length() == 3); \ | 1403 ASSERT(args.length() == 3); \ |
| 1404 CONVERT_ARG_HANDLE_CHECKED(JSDataView, holder, 0); \ | 1404 CONVERT_ARG_HANDLE_CHECKED(JSDataView, holder, 0); \ |
| 1405 CONVERT_ARG_HANDLE_CHECKED(Object, offset, 1); \ | 1405 CONVERT_ARG_HANDLE_CHECKED(Object, offset, 1); \ |
| 1406 CONVERT_BOOLEAN_ARG_CHECKED(is_little_endian, 2); \ | 1406 CONVERT_BOOLEAN_ARG_CHECKED(is_little_endian, 2); \ |
| 1407 Type result; \ | 1407 Type result; \ |
| 1408 if (DataViewGetValue( \ | 1408 if (DataViewGetValue( \ |
| 1409 isolate, holder, offset, is_little_endian, &result)) { \ | 1409 isolate, holder, offset, is_little_endian, &result)) { \ |
| 1410 return isolate->heap()->Converter(result); \ | 1410 return *isolate->factory()->Converter(result); \ |
| 1411 } else { \ | 1411 } else { \ |
| 1412 return isolate->Throw(*isolate->factory()->NewRangeError( \ | 1412 return isolate->Throw(*isolate->factory()->NewRangeError( \ |
| 1413 "invalid_data_view_accessor_offset", \ | 1413 "invalid_data_view_accessor_offset", \ |
| 1414 HandleVector<Object>(NULL, 0))); \ | 1414 HandleVector<Object>(NULL, 0))); \ |
| 1415 } \ | 1415 } \ |
| 1416 } | 1416 } |
| 1417 | 1417 |
| 1418 DATA_VIEW_GETTER(Uint8, uint8_t, NumberFromUint32) | 1418 DATA_VIEW_GETTER(Uint8, uint8_t, NewNumberFromUint) |
| 1419 DATA_VIEW_GETTER(Int8, int8_t, NumberFromInt32) | 1419 DATA_VIEW_GETTER(Int8, int8_t, NewNumberFromInt) |
| 1420 DATA_VIEW_GETTER(Uint16, uint16_t, NumberFromUint32) | 1420 DATA_VIEW_GETTER(Uint16, uint16_t, NewNumberFromUint) |
| 1421 DATA_VIEW_GETTER(Int16, int16_t, NumberFromInt32) | 1421 DATA_VIEW_GETTER(Int16, int16_t, NewNumberFromInt) |
| 1422 DATA_VIEW_GETTER(Uint32, uint32_t, NumberFromUint32) | 1422 DATA_VIEW_GETTER(Uint32, uint32_t, NewNumberFromUint) |
| 1423 DATA_VIEW_GETTER(Int32, int32_t, NumberFromInt32) | 1423 DATA_VIEW_GETTER(Int32, int32_t, NewNumberFromInt) |
| 1424 DATA_VIEW_GETTER(Float32, float, NumberFromDouble) | 1424 DATA_VIEW_GETTER(Float32, float, NewNumber) |
| 1425 DATA_VIEW_GETTER(Float64, double, NumberFromDouble) | 1425 DATA_VIEW_GETTER(Float64, double, NewNumber) |
| 1426 | 1426 |
| 1427 #undef DATA_VIEW_GETTER | 1427 #undef DATA_VIEW_GETTER |
| 1428 | 1428 |
| 1429 | 1429 |
| 1430 template <typename T> | 1430 template <typename T> |
| 1431 static T DataViewConvertValue(double value); | 1431 static T DataViewConvertValue(double value); |
| 1432 | 1432 |
| 1433 | 1433 |
| 1434 template <> | 1434 template <> |
| 1435 int8_t DataViewConvertValue<int8_t>(double value) { | 1435 int8_t DataViewConvertValue<int8_t>(double value) { |
| (...skipping 5418 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6854 | 6854 |
| 6855 | 6855 |
| 6856 bool Runtime::IsUpperCaseChar(RuntimeState* runtime_state, uint16_t ch) { | 6856 bool Runtime::IsUpperCaseChar(RuntimeState* runtime_state, uint16_t ch) { |
| 6857 unibrow::uchar chars[unibrow::ToUppercase::kMaxWidth]; | 6857 unibrow::uchar chars[unibrow::ToUppercase::kMaxWidth]; |
| 6858 int char_length = runtime_state->to_upper_mapping()->get(ch, 0, chars); | 6858 int char_length = runtime_state->to_upper_mapping()->get(ch, 0, chars); |
| 6859 return char_length == 0; | 6859 return char_length == 0; |
| 6860 } | 6860 } |
| 6861 | 6861 |
| 6862 | 6862 |
| 6863 RUNTIME_FUNCTION(MaybeObject*, RuntimeHidden_NumberToString) { | 6863 RUNTIME_FUNCTION(MaybeObject*, RuntimeHidden_NumberToString) { |
| 6864 SealHandleScope shs(isolate); | 6864 HandleScope scope(isolate); |
| 6865 ASSERT(args.length() == 1); | 6865 ASSERT(args.length() == 1); |
| 6866 | 6866 |
| 6867 Object* number = args[0]; | 6867 Handle<Object> number = args.at<Object>(0); |
| 6868 RUNTIME_ASSERT(number->IsNumber()); | 6868 RUNTIME_ASSERT(number->IsNumber()); |
| 6869 | 6869 |
| 6870 return isolate->heap()->NumberToString(number); | 6870 return *isolate->factory()->NumberToString(number); |
| 6871 } | 6871 } |
| 6872 | 6872 |
| 6873 | 6873 |
| 6874 RUNTIME_FUNCTION(MaybeObject*, RuntimeHidden_NumberToStringSkipCache) { | 6874 RUNTIME_FUNCTION(MaybeObject*, RuntimeHidden_NumberToStringSkipCache) { |
| 6875 SealHandleScope shs(isolate); | 6875 HandleScope scope(isolate); |
| 6876 ASSERT(args.length() == 1); | 6876 ASSERT(args.length() == 1); |
| 6877 | 6877 |
| 6878 Object* number = args[0]; | 6878 Handle<Object> number = args.at<Object>(0); |
| 6879 RUNTIME_ASSERT(number->IsNumber()); | 6879 RUNTIME_ASSERT(number->IsNumber()); |
| 6880 | 6880 |
| 6881 return isolate->heap()->NumberToString(number, false); | 6881 return *isolate->factory()->NumberToString(number, false); |
| 6882 } | 6882 } |
| 6883 | 6883 |
| 6884 | 6884 |
| 6885 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberToInteger) { | 6885 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberToInteger) { |
| 6886 SealHandleScope shs(isolate); | 6886 HandleScope scope(isolate); |
| 6887 ASSERT(args.length() == 1); | 6887 ASSERT(args.length() == 1); |
| 6888 | 6888 |
| 6889 CONVERT_DOUBLE_ARG_CHECKED(number, 0); | 6889 CONVERT_DOUBLE_ARG_CHECKED(number, 0); |
| 6890 | 6890 return *isolate->factory()->NewNumber(DoubleToInteger(number)); |
| 6891 // We do not include 0 so that we don't have to treat +0 / -0 cases. | |
| 6892 if (number > 0 && number <= Smi::kMaxValue) { | |
| 6893 return Smi::FromInt(static_cast<int>(number)); | |
| 6894 } | |
| 6895 return isolate->heap()->NumberFromDouble(DoubleToInteger(number)); | |
| 6896 } | 6891 } |
| 6897 | 6892 |
| 6898 | 6893 |
| 6899 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberToIntegerMapMinusZero) { | 6894 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberToIntegerMapMinusZero) { |
| 6900 SealHandleScope shs(isolate); | 6895 HandleScope scope(isolate); |
| 6901 ASSERT(args.length() == 1); | 6896 ASSERT(args.length() == 1); |
| 6902 | 6897 |
| 6903 CONVERT_DOUBLE_ARG_CHECKED(number, 0); | 6898 CONVERT_DOUBLE_ARG_CHECKED(number, 0); |
| 6904 | |
| 6905 // We do not include 0 so that we don't have to treat +0 / -0 cases. | |
| 6906 if (number > 0 && number <= Smi::kMaxValue) { | |
| 6907 return Smi::FromInt(static_cast<int>(number)); | |
| 6908 } | |
| 6909 | |
| 6910 double double_value = DoubleToInteger(number); | 6899 double double_value = DoubleToInteger(number); |
| 6911 // Map both -0 and +0 to +0. | 6900 // Map both -0 and +0 to +0. |
| 6912 if (double_value == 0) double_value = 0; | 6901 if (double_value == 0) double_value = 0; |
| 6913 | 6902 |
| 6914 return isolate->heap()->NumberFromDouble(double_value); | 6903 return *isolate->factory()->NewNumber(double_value); |
| 6915 } | 6904 } |
| 6916 | 6905 |
| 6917 | 6906 |
| 6918 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberToJSUint32) { | 6907 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberToJSUint32) { |
| 6919 SealHandleScope shs(isolate); | 6908 HandleScope scope(isolate); |
| 6920 ASSERT(args.length() == 1); | 6909 ASSERT(args.length() == 1); |
| 6921 | 6910 |
| 6922 CONVERT_NUMBER_CHECKED(int32_t, number, Uint32, args[0]); | 6911 CONVERT_NUMBER_CHECKED(int32_t, number, Uint32, args[0]); |
| 6923 return isolate->heap()->NumberFromUint32(number); | 6912 return *isolate->factory()->NewNumberFromUint(number); |
| 6924 } | 6913 } |
| 6925 | 6914 |
| 6926 | 6915 |
| 6927 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberToJSInt32) { | 6916 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberToJSInt32) { |
| 6928 SealHandleScope shs(isolate); | 6917 HandleScope scope(isolate); |
| 6929 ASSERT(args.length() == 1); | 6918 ASSERT(args.length() == 1); |
| 6930 | 6919 |
| 6931 CONVERT_DOUBLE_ARG_CHECKED(number, 0); | 6920 CONVERT_DOUBLE_ARG_CHECKED(number, 0); |
| 6932 | 6921 return *isolate->factory()->NewNumberFromInt(DoubleToInt32(number)); |
| 6933 // We do not include 0 so that we don't have to treat +0 / -0 cases. | |
| 6934 if (number > 0 && number <= Smi::kMaxValue) { | |
| 6935 return Smi::FromInt(static_cast<int>(number)); | |
| 6936 } | |
| 6937 return isolate->heap()->NumberFromInt32(DoubleToInt32(number)); | |
| 6938 } | 6922 } |
| 6939 | 6923 |
| 6940 | 6924 |
| 6941 // Converts a Number to a Smi, if possible. Returns NaN if the number is not | 6925 // Converts a Number to a Smi, if possible. Returns NaN if the number is not |
| 6942 // a small integer. | 6926 // a small integer. |
| 6943 RUNTIME_FUNCTION(MaybeObject*, RuntimeHidden_NumberToSmi) { | 6927 RUNTIME_FUNCTION(MaybeObject*, RuntimeHidden_NumberToSmi) { |
| 6944 SealHandleScope shs(isolate); | 6928 SealHandleScope shs(isolate); |
| 6945 ASSERT(args.length() == 1); | 6929 ASSERT(args.length() == 1); |
| 6946 | 6930 |
| 6947 Object* obj = args[0]; | 6931 Object* obj = args[0]; |
| 6948 if (obj->IsSmi()) { | 6932 if (obj->IsSmi()) { |
| 6949 return obj; | 6933 return obj; |
| 6950 } | 6934 } |
| 6951 if (obj->IsHeapNumber()) { | 6935 if (obj->IsHeapNumber()) { |
| 6952 double value = HeapNumber::cast(obj)->value(); | 6936 double value = HeapNumber::cast(obj)->value(); |
| 6953 int int_value = FastD2I(value); | 6937 int int_value = FastD2I(value); |
| 6954 if (value == FastI2D(int_value) && Smi::IsValid(int_value)) { | 6938 if (value == FastI2D(int_value) && Smi::IsValid(int_value)) { |
| 6955 return Smi::FromInt(int_value); | 6939 return Smi::FromInt(int_value); |
| 6956 } | 6940 } |
| 6957 } | 6941 } |
| 6958 return isolate->heap()->nan_value(); | 6942 return isolate->heap()->nan_value(); |
| 6959 } | 6943 } |
| 6960 | 6944 |
| 6961 | 6945 |
| 6962 RUNTIME_FUNCTION(MaybeObject*, RuntimeHidden_AllocateHeapNumber) { | 6946 RUNTIME_FUNCTION(MaybeObject*, RuntimeHidden_AllocateHeapNumber) { |
| 6963 SealHandleScope shs(isolate); | 6947 HandleScope scope(isolate); |
| 6964 ASSERT(args.length() == 0); | 6948 ASSERT(args.length() == 0); |
| 6965 return isolate->heap()->AllocateHeapNumber(0); | 6949 return *isolate->factory()->NewHeapNumber(0); |
| 6966 } | 6950 } |
| 6967 | 6951 |
| 6968 | 6952 |
| 6969 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberAdd) { | 6953 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberAdd) { |
| 6970 SealHandleScope shs(isolate); | 6954 HandleScope scope(isolate); |
| 6971 ASSERT(args.length() == 2); | 6955 ASSERT(args.length() == 2); |
| 6972 | 6956 |
| 6973 CONVERT_DOUBLE_ARG_CHECKED(x, 0); | 6957 CONVERT_DOUBLE_ARG_CHECKED(x, 0); |
| 6974 CONVERT_DOUBLE_ARG_CHECKED(y, 1); | 6958 CONVERT_DOUBLE_ARG_CHECKED(y, 1); |
| 6975 return isolate->heap()->NumberFromDouble(x + y); | 6959 return *isolate->factory()->NewNumber(x + y); |
| 6976 } | 6960 } |
| 6977 | 6961 |
| 6978 | 6962 |
| 6979 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberSub) { | 6963 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberSub) { |
| 6980 SealHandleScope shs(isolate); | 6964 HandleScope scope(isolate); |
| 6981 ASSERT(args.length() == 2); | 6965 ASSERT(args.length() == 2); |
| 6982 | 6966 |
| 6983 CONVERT_DOUBLE_ARG_CHECKED(x, 0); | 6967 CONVERT_DOUBLE_ARG_CHECKED(x, 0); |
| 6984 CONVERT_DOUBLE_ARG_CHECKED(y, 1); | 6968 CONVERT_DOUBLE_ARG_CHECKED(y, 1); |
| 6985 return isolate->heap()->NumberFromDouble(x - y); | 6969 return *isolate->factory()->NewNumber(x - y); |
| 6986 } | 6970 } |
| 6987 | 6971 |
| 6988 | 6972 |
| 6989 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberMul) { | 6973 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberMul) { |
| 6990 SealHandleScope shs(isolate); | 6974 HandleScope scope(isolate); |
| 6991 ASSERT(args.length() == 2); | 6975 ASSERT(args.length() == 2); |
| 6992 | 6976 |
| 6993 CONVERT_DOUBLE_ARG_CHECKED(x, 0); | 6977 CONVERT_DOUBLE_ARG_CHECKED(x, 0); |
| 6994 CONVERT_DOUBLE_ARG_CHECKED(y, 1); | 6978 CONVERT_DOUBLE_ARG_CHECKED(y, 1); |
| 6995 return isolate->heap()->NumberFromDouble(x * y); | 6979 return *isolate->factory()->NewNumber(x * y); |
| 6996 } | 6980 } |
| 6997 | 6981 |
| 6998 | 6982 |
| 6999 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberUnaryMinus) { | 6983 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberUnaryMinus) { |
| 7000 SealHandleScope shs(isolate); | 6984 HandleScope scope(isolate); |
| 7001 ASSERT(args.length() == 1); | 6985 ASSERT(args.length() == 1); |
| 7002 | 6986 |
| 7003 CONVERT_DOUBLE_ARG_CHECKED(x, 0); | 6987 CONVERT_DOUBLE_ARG_CHECKED(x, 0); |
| 7004 return isolate->heap()->NumberFromDouble(-x); | 6988 return *isolate->factory()->NewNumber(-x); |
| 7005 } | |
| 7006 | |
| 7007 | |
| 7008 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberAlloc) { | |
| 7009 SealHandleScope shs(isolate); | |
| 7010 ASSERT(args.length() == 0); | |
| 7011 | |
| 7012 return isolate->heap()->NumberFromDouble(9876543210.0); | |
| 7013 } | 6989 } |
| 7014 | 6990 |
| 7015 | 6991 |
| 7016 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberDiv) { | 6992 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberDiv) { |
| 7017 SealHandleScope shs(isolate); | 6993 HandleScope scope(isolate); |
| 7018 ASSERT(args.length() == 2); | 6994 ASSERT(args.length() == 2); |
| 7019 | 6995 |
| 7020 CONVERT_DOUBLE_ARG_CHECKED(x, 0); | 6996 CONVERT_DOUBLE_ARG_CHECKED(x, 0); |
| 7021 CONVERT_DOUBLE_ARG_CHECKED(y, 1); | 6997 CONVERT_DOUBLE_ARG_CHECKED(y, 1); |
| 7022 return isolate->heap()->NumberFromDouble(x / y); | 6998 return *isolate->factory()->NewNumber(x / y); |
| 7023 } | 6999 } |
| 7024 | 7000 |
| 7025 | 7001 |
| 7026 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberMod) { | 7002 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberMod) { |
| 7027 SealHandleScope shs(isolate); | 7003 HandleScope scope(isolate); |
| 7028 ASSERT(args.length() == 2); | 7004 ASSERT(args.length() == 2); |
| 7029 | 7005 |
| 7030 CONVERT_DOUBLE_ARG_CHECKED(x, 0); | 7006 CONVERT_DOUBLE_ARG_CHECKED(x, 0); |
| 7031 CONVERT_DOUBLE_ARG_CHECKED(y, 1); | 7007 CONVERT_DOUBLE_ARG_CHECKED(y, 1); |
| 7032 | 7008 return *isolate->factory()->NewNumber(modulo(x, y)); |
| 7033 x = modulo(x, y); | |
| 7034 // NumberFromDouble may return a Smi instead of a Number object | |
| 7035 return isolate->heap()->NumberFromDouble(x); | |
| 7036 } | 7009 } |
| 7037 | 7010 |
| 7038 | 7011 |
| 7039 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberImul) { | 7012 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberImul) { |
| 7040 SealHandleScope shs(isolate); | 7013 HandleScope scope(isolate); |
| 7041 ASSERT(args.length() == 2); | 7014 ASSERT(args.length() == 2); |
| 7042 | 7015 |
| 7043 CONVERT_NUMBER_CHECKED(int32_t, x, Int32, args[0]); | 7016 CONVERT_NUMBER_CHECKED(int32_t, x, Int32, args[0]); |
| 7044 CONVERT_NUMBER_CHECKED(int32_t, y, Int32, args[1]); | 7017 CONVERT_NUMBER_CHECKED(int32_t, y, Int32, args[1]); |
| 7045 return isolate->heap()->NumberFromInt32(x * y); | 7018 return *isolate->factory()->NewNumberFromInt(x * y); |
| 7046 } | 7019 } |
| 7047 | 7020 |
| 7048 | 7021 |
| 7049 RUNTIME_FUNCTION(MaybeObject*, RuntimeHidden_StringAdd) { | 7022 RUNTIME_FUNCTION(MaybeObject*, RuntimeHidden_StringAdd) { |
| 7050 HandleScope scope(isolate); | 7023 HandleScope scope(isolate); |
| 7051 ASSERT(args.length() == 2); | 7024 ASSERT(args.length() == 2); |
| 7052 CONVERT_ARG_HANDLE_CHECKED(String, str1, 0); | 7025 CONVERT_ARG_HANDLE_CHECKED(String, str1, 0); |
| 7053 CONVERT_ARG_HANDLE_CHECKED(String, str2, 1); | 7026 CONVERT_ARG_HANDLE_CHECKED(String, str2, 1); |
| 7054 isolate->counters()->string_add_runtime()->Increment(); | 7027 isolate->counters()->string_add_runtime()->Increment(); |
| 7055 Handle<String> result; | 7028 Handle<String> result; |
| (...skipping 358 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7414 array_length, | 7387 array_length, |
| 7415 separator, | 7388 separator, |
| 7416 Vector<uc16>(result_string->GetChars(), | 7389 Vector<uc16>(result_string->GetChars(), |
| 7417 string_length)); | 7390 string_length)); |
| 7418 return result_string; | 7391 return result_string; |
| 7419 } | 7392 } |
| 7420 } | 7393 } |
| 7421 | 7394 |
| 7422 | 7395 |
| 7423 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberOr) { | 7396 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberOr) { |
| 7424 SealHandleScope shs(isolate); | 7397 HandleScope scope(isolate); |
| 7425 ASSERT(args.length() == 2); | 7398 ASSERT(args.length() == 2); |
| 7426 | 7399 |
| 7427 CONVERT_NUMBER_CHECKED(int32_t, x, Int32, args[0]); | 7400 CONVERT_NUMBER_CHECKED(int32_t, x, Int32, args[0]); |
| 7428 CONVERT_NUMBER_CHECKED(int32_t, y, Int32, args[1]); | 7401 CONVERT_NUMBER_CHECKED(int32_t, y, Int32, args[1]); |
| 7429 return isolate->heap()->NumberFromInt32(x | y); | 7402 return *isolate->factory()->NewNumberFromInt(x | y); |
| 7430 } | 7403 } |
| 7431 | 7404 |
| 7432 | 7405 |
| 7433 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberAnd) { | 7406 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberAnd) { |
| 7434 SealHandleScope shs(isolate); | 7407 HandleScope scope(isolate); |
| 7435 ASSERT(args.length() == 2); | 7408 ASSERT(args.length() == 2); |
| 7436 | 7409 |
| 7437 CONVERT_NUMBER_CHECKED(int32_t, x, Int32, args[0]); | 7410 CONVERT_NUMBER_CHECKED(int32_t, x, Int32, args[0]); |
| 7438 CONVERT_NUMBER_CHECKED(int32_t, y, Int32, args[1]); | 7411 CONVERT_NUMBER_CHECKED(int32_t, y, Int32, args[1]); |
| 7439 return isolate->heap()->NumberFromInt32(x & y); | 7412 return *isolate->factory()->NewNumberFromInt(x & y); |
| 7440 } | 7413 } |
| 7441 | 7414 |
| 7442 | 7415 |
| 7443 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberXor) { | 7416 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberXor) { |
| 7444 SealHandleScope shs(isolate); | 7417 HandleScope scope(isolate); |
| 7445 ASSERT(args.length() == 2); | 7418 ASSERT(args.length() == 2); |
| 7446 | 7419 |
| 7447 CONVERT_NUMBER_CHECKED(int32_t, x, Int32, args[0]); | 7420 CONVERT_NUMBER_CHECKED(int32_t, x, Int32, args[0]); |
| 7448 CONVERT_NUMBER_CHECKED(int32_t, y, Int32, args[1]); | 7421 CONVERT_NUMBER_CHECKED(int32_t, y, Int32, args[1]); |
| 7449 return isolate->heap()->NumberFromInt32(x ^ y); | 7422 return *isolate->factory()->NewNumberFromInt(x ^ y); |
| 7450 } | 7423 } |
| 7451 | 7424 |
| 7452 | 7425 |
| 7453 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberShl) { | 7426 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberShl) { |
| 7454 SealHandleScope shs(isolate); | 7427 HandleScope scope(isolate); |
| 7455 ASSERT(args.length() == 2); | 7428 ASSERT(args.length() == 2); |
| 7456 | 7429 |
| 7457 CONVERT_NUMBER_CHECKED(int32_t, x, Int32, args[0]); | 7430 CONVERT_NUMBER_CHECKED(int32_t, x, Int32, args[0]); |
| 7458 CONVERT_NUMBER_CHECKED(int32_t, y, Int32, args[1]); | 7431 CONVERT_NUMBER_CHECKED(int32_t, y, Int32, args[1]); |
| 7459 return isolate->heap()->NumberFromInt32(x << (y & 0x1f)); | 7432 return *isolate->factory()->NewNumberFromInt(x << (y & 0x1f)); |
| 7460 } | 7433 } |
| 7461 | 7434 |
| 7462 | 7435 |
| 7463 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberShr) { | 7436 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberShr) { |
| 7464 SealHandleScope shs(isolate); | 7437 HandleScope scope(isolate); |
| 7465 ASSERT(args.length() == 2); | 7438 ASSERT(args.length() == 2); |
| 7466 | 7439 |
| 7467 CONVERT_NUMBER_CHECKED(uint32_t, x, Uint32, args[0]); | 7440 CONVERT_NUMBER_CHECKED(uint32_t, x, Uint32, args[0]); |
| 7468 CONVERT_NUMBER_CHECKED(int32_t, y, Int32, args[1]); | 7441 CONVERT_NUMBER_CHECKED(int32_t, y, Int32, args[1]); |
| 7469 return isolate->heap()->NumberFromUint32(x >> (y & 0x1f)); | 7442 return *isolate->factory()->NewNumberFromUint(x >> (y & 0x1f)); |
| 7470 } | 7443 } |
| 7471 | 7444 |
| 7472 | 7445 |
| 7473 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberSar) { | 7446 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberSar) { |
| 7474 SealHandleScope shs(isolate); | 7447 HandleScope scope(isolate); |
| 7475 ASSERT(args.length() == 2); | 7448 ASSERT(args.length() == 2); |
| 7476 | 7449 |
| 7477 CONVERT_NUMBER_CHECKED(int32_t, x, Int32, args[0]); | 7450 CONVERT_NUMBER_CHECKED(int32_t, x, Int32, args[0]); |
| 7478 CONVERT_NUMBER_CHECKED(int32_t, y, Int32, args[1]); | 7451 CONVERT_NUMBER_CHECKED(int32_t, y, Int32, args[1]); |
| 7479 return isolate->heap()->NumberFromInt32(ArithmeticShiftRight(x, y & 0x1f)); | 7452 return *isolate->factory()->NewNumberFromInt( |
| 7453 ArithmeticShiftRight(x, y & 0x1f)); |
| 7480 } | 7454 } |
| 7481 | 7455 |
| 7482 | 7456 |
| 7483 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberEquals) { | 7457 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberEquals) { |
| 7484 SealHandleScope shs(isolate); | 7458 SealHandleScope shs(isolate); |
| 7485 ASSERT(args.length() == 2); | 7459 ASSERT(args.length() == 2); |
| 7486 | 7460 |
| 7487 CONVERT_DOUBLE_ARG_CHECKED(x, 0); | 7461 CONVERT_DOUBLE_ARG_CHECKED(x, 0); |
| 7488 CONVERT_DOUBLE_ARG_CHECKED(y, 1); | 7462 CONVERT_DOUBLE_ARG_CHECKED(y, 1); |
| 7489 if (std::isnan(x)) return Smi::FromInt(NOT_EQUAL); | 7463 if (std::isnan(x)) return Smi::FromInt(NOT_EQUAL); |
| (...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7669 result = equal_prefix_result; | 7643 result = equal_prefix_result; |
| 7670 } else { | 7644 } else { |
| 7671 result = (r < 0) ? Smi::FromInt(LESS) : Smi::FromInt(GREATER); | 7645 result = (r < 0) ? Smi::FromInt(LESS) : Smi::FromInt(GREATER); |
| 7672 } | 7646 } |
| 7673 return result; | 7647 return result; |
| 7674 } | 7648 } |
| 7675 | 7649 |
| 7676 | 7650 |
| 7677 #define RUNTIME_UNARY_MATH(Name, name) \ | 7651 #define RUNTIME_UNARY_MATH(Name, name) \ |
| 7678 RUNTIME_FUNCTION(MaybeObject*, Runtime_Math##Name) { \ | 7652 RUNTIME_FUNCTION(MaybeObject*, Runtime_Math##Name) { \ |
| 7679 SealHandleScope shs(isolate); \ | 7653 HandleScope scope(isolate); \ |
| 7680 ASSERT(args.length() == 1); \ | 7654 ASSERT(args.length() == 1); \ |
| 7681 isolate->counters()->math_##name()->Increment(); \ | 7655 isolate->counters()->math_##name()->Increment(); \ |
| 7682 CONVERT_DOUBLE_ARG_CHECKED(x, 0); \ | 7656 CONVERT_DOUBLE_ARG_CHECKED(x, 0); \ |
| 7683 return isolate->heap()->AllocateHeapNumber(std::name(x)); \ | 7657 return *isolate->factory()->NewHeapNumber(std::name(x)); \ |
| 7684 } | 7658 } |
| 7685 | 7659 |
| 7686 RUNTIME_UNARY_MATH(Acos, acos) | 7660 RUNTIME_UNARY_MATH(Acos, acos) |
| 7687 RUNTIME_UNARY_MATH(Asin, asin) | 7661 RUNTIME_UNARY_MATH(Asin, asin) |
| 7688 RUNTIME_UNARY_MATH(Atan, atan) | 7662 RUNTIME_UNARY_MATH(Atan, atan) |
| 7689 RUNTIME_UNARY_MATH(Log, log) | 7663 RUNTIME_UNARY_MATH(Log, log) |
| 7690 #undef RUNTIME_UNARY_MATH | 7664 #undef RUNTIME_UNARY_MATH |
| 7691 | 7665 |
| 7692 | 7666 |
| 7693 RUNTIME_FUNCTION(MaybeObject*, Runtime_DoubleHi) { | 7667 RUNTIME_FUNCTION(MaybeObject*, Runtime_DoubleHi) { |
| 7694 SealHandleScope shs(isolate); | 7668 HandleScope scope(isolate); |
| 7695 ASSERT(args.length() == 1); | 7669 ASSERT(args.length() == 1); |
| 7696 CONVERT_DOUBLE_ARG_CHECKED(x, 0); | 7670 CONVERT_DOUBLE_ARG_CHECKED(x, 0); |
| 7697 uint64_t integer = double_to_uint64(x); | 7671 uint64_t integer = double_to_uint64(x); |
| 7698 integer = (integer >> 32) & 0xFFFFFFFFu; | 7672 integer = (integer >> 32) & 0xFFFFFFFFu; |
| 7699 return isolate->heap()->NumberFromDouble(static_cast<int32_t>(integer)); | 7673 return *isolate->factory()->NewNumber(static_cast<int32_t>(integer)); |
| 7700 } | 7674 } |
| 7701 | 7675 |
| 7702 | 7676 |
| 7703 RUNTIME_FUNCTION(MaybeObject*, Runtime_DoubleLo) { | 7677 RUNTIME_FUNCTION(MaybeObject*, Runtime_DoubleLo) { |
| 7704 SealHandleScope shs(isolate); | 7678 HandleScope scope(isolate); |
| 7705 ASSERT(args.length() == 1); | 7679 ASSERT(args.length() == 1); |
| 7706 CONVERT_DOUBLE_ARG_CHECKED(x, 0); | 7680 CONVERT_DOUBLE_ARG_CHECKED(x, 0); |
| 7707 return isolate->heap()->NumberFromDouble( | 7681 return *isolate->factory()->NewNumber( |
| 7708 static_cast<int32_t>(double_to_uint64(x) & 0xFFFFFFFFu)); | 7682 static_cast<int32_t>(double_to_uint64(x) & 0xFFFFFFFFu)); |
| 7709 } | 7683 } |
| 7710 | 7684 |
| 7711 | 7685 |
| 7712 RUNTIME_FUNCTION(MaybeObject*, Runtime_ConstructDouble) { | 7686 RUNTIME_FUNCTION(MaybeObject*, Runtime_ConstructDouble) { |
| 7713 SealHandleScope shs(isolate); | 7687 HandleScope scope(isolate); |
| 7714 ASSERT(args.length() == 2); | 7688 ASSERT(args.length() == 2); |
| 7715 CONVERT_NUMBER_CHECKED(uint32_t, hi, Uint32, args[0]); | 7689 CONVERT_NUMBER_CHECKED(uint32_t, hi, Uint32, args[0]); |
| 7716 CONVERT_NUMBER_CHECKED(uint32_t, lo, Uint32, args[1]); | 7690 CONVERT_NUMBER_CHECKED(uint32_t, lo, Uint32, args[1]); |
| 7717 uint64_t result = (static_cast<uint64_t>(hi) << 32) | lo; | 7691 uint64_t result = (static_cast<uint64_t>(hi) << 32) | lo; |
| 7718 return isolate->heap()->AllocateHeapNumber(uint64_to_double(result)); | 7692 return *isolate->factory()->NewNumber(uint64_to_double(result)); |
| 7719 } | 7693 } |
| 7720 | 7694 |
| 7721 | 7695 |
| 7722 static const double kPiDividedBy4 = 0.78539816339744830962; | 7696 static const double kPiDividedBy4 = 0.78539816339744830962; |
| 7723 | 7697 |
| 7724 | 7698 |
| 7725 RUNTIME_FUNCTION(MaybeObject*, Runtime_MathAtan2) { | 7699 RUNTIME_FUNCTION(MaybeObject*, Runtime_MathAtan2) { |
| 7726 SealHandleScope shs(isolate); | 7700 HandleScope scope(isolate); |
| 7727 ASSERT(args.length() == 2); | 7701 ASSERT(args.length() == 2); |
| 7728 isolate->counters()->math_atan2()->Increment(); | 7702 isolate->counters()->math_atan2()->Increment(); |
| 7729 | 7703 |
| 7730 CONVERT_DOUBLE_ARG_CHECKED(x, 0); | 7704 CONVERT_DOUBLE_ARG_CHECKED(x, 0); |
| 7731 CONVERT_DOUBLE_ARG_CHECKED(y, 1); | 7705 CONVERT_DOUBLE_ARG_CHECKED(y, 1); |
| 7732 double result; | 7706 double result; |
| 7733 if (std::isinf(x) && std::isinf(y)) { | 7707 if (std::isinf(x) && std::isinf(y)) { |
| 7734 // Make sure that the result in case of two infinite arguments | 7708 // Make sure that the result in case of two infinite arguments |
| 7735 // is a multiple of Pi / 4. The sign of the result is determined | 7709 // is a multiple of Pi / 4. The sign of the result is determined |
| 7736 // by the first argument (x) and the sign of the second argument | 7710 // by the first argument (x) and the sign of the second argument |
| 7737 // determines the multiplier: one or three. | 7711 // determines the multiplier: one or three. |
| 7738 int multiplier = (x < 0) ? -1 : 1; | 7712 int multiplier = (x < 0) ? -1 : 1; |
| 7739 if (y < 0) multiplier *= 3; | 7713 if (y < 0) multiplier *= 3; |
| 7740 result = multiplier * kPiDividedBy4; | 7714 result = multiplier * kPiDividedBy4; |
| 7741 } else { | 7715 } else { |
| 7742 result = std::atan2(x, y); | 7716 result = std::atan2(x, y); |
| 7743 } | 7717 } |
| 7744 return isolate->heap()->AllocateHeapNumber(result); | 7718 return *isolate->factory()->NewNumber(result); |
| 7745 } | 7719 } |
| 7746 | 7720 |
| 7747 | 7721 |
| 7748 RUNTIME_FUNCTION(MaybeObject*, Runtime_MathExp) { | 7722 RUNTIME_FUNCTION(MaybeObject*, Runtime_MathExp) { |
| 7749 SealHandleScope shs(isolate); | 7723 HandleScope scope(isolate); |
| 7750 ASSERT(args.length() == 1); | 7724 ASSERT(args.length() == 1); |
| 7751 isolate->counters()->math_exp()->Increment(); | 7725 isolate->counters()->math_exp()->Increment(); |
| 7752 | 7726 |
| 7753 CONVERT_DOUBLE_ARG_CHECKED(x, 0); | 7727 CONVERT_DOUBLE_ARG_CHECKED(x, 0); |
| 7754 lazily_initialize_fast_exp(); | 7728 lazily_initialize_fast_exp(); |
| 7755 return isolate->heap()->NumberFromDouble(fast_exp(x)); | 7729 return *isolate->factory()->NewNumber(fast_exp(x)); |
| 7756 } | 7730 } |
| 7757 | 7731 |
| 7758 | 7732 |
| 7759 RUNTIME_FUNCTION(MaybeObject*, Runtime_MathFloor) { | 7733 RUNTIME_FUNCTION(MaybeObject*, Runtime_MathFloor) { |
| 7760 SealHandleScope shs(isolate); | 7734 HandleScope scope(isolate); |
| 7761 ASSERT(args.length() == 1); | 7735 ASSERT(args.length() == 1); |
| 7762 isolate->counters()->math_floor()->Increment(); | 7736 isolate->counters()->math_floor()->Increment(); |
| 7763 | 7737 |
| 7764 CONVERT_DOUBLE_ARG_CHECKED(x, 0); | 7738 CONVERT_DOUBLE_ARG_CHECKED(x, 0); |
| 7765 return isolate->heap()->NumberFromDouble(std::floor(x)); | 7739 return *isolate->factory()->NewNumber(std::floor(x)); |
| 7766 } | 7740 } |
| 7767 | 7741 |
| 7768 | 7742 |
| 7769 // Slow version of Math.pow. We check for fast paths for special cases. | 7743 // Slow version of Math.pow. We check for fast paths for special cases. |
| 7770 // Used if SSE2/VFP3 is not available. | 7744 // Used if SSE2/VFP3 is not available. |
| 7771 RUNTIME_FUNCTION(MaybeObject*, RuntimeHidden_MathPowSlow) { | 7745 RUNTIME_FUNCTION(MaybeObject*, RuntimeHidden_MathPowSlow) { |
| 7772 SealHandleScope shs(isolate); | 7746 HandleScope scope(isolate); |
| 7773 ASSERT(args.length() == 2); | 7747 ASSERT(args.length() == 2); |
| 7774 isolate->counters()->math_pow()->Increment(); | 7748 isolate->counters()->math_pow()->Increment(); |
| 7775 | 7749 |
| 7776 CONVERT_DOUBLE_ARG_CHECKED(x, 0); | 7750 CONVERT_DOUBLE_ARG_CHECKED(x, 0); |
| 7777 | 7751 |
| 7778 // If the second argument is a smi, it is much faster to call the | 7752 // If the second argument is a smi, it is much faster to call the |
| 7779 // custom powi() function than the generic pow(). | 7753 // custom powi() function than the generic pow(). |
| 7780 if (args[1]->IsSmi()) { | 7754 if (args[1]->IsSmi()) { |
| 7781 int y = args.smi_at(1); | 7755 int y = args.smi_at(1); |
| 7782 return isolate->heap()->NumberFromDouble(power_double_int(x, y)); | 7756 return *isolate->factory()->NewNumber(power_double_int(x, y)); |
| 7783 } | 7757 } |
| 7784 | 7758 |
| 7785 CONVERT_DOUBLE_ARG_CHECKED(y, 1); | 7759 CONVERT_DOUBLE_ARG_CHECKED(y, 1); |
| 7786 double result = power_helper(x, y); | 7760 double result = power_helper(x, y); |
| 7787 if (std::isnan(result)) return isolate->heap()->nan_value(); | 7761 if (std::isnan(result)) return isolate->heap()->nan_value(); |
| 7788 return isolate->heap()->AllocateHeapNumber(result); | 7762 return *isolate->factory()->NewNumber(result); |
| 7789 } | 7763 } |
| 7790 | 7764 |
| 7791 | 7765 |
| 7792 // Fast version of Math.pow if we know that y is not an integer and y is not | 7766 // Fast version of Math.pow if we know that y is not an integer and y is not |
| 7793 // -0.5 or 0.5. Used as slow case from full codegen. | 7767 // -0.5 or 0.5. Used as slow case from full codegen. |
| 7794 RUNTIME_FUNCTION(MaybeObject*, RuntimeHidden_MathPow) { | 7768 RUNTIME_FUNCTION(MaybeObject*, RuntimeHidden_MathPow) { |
| 7795 SealHandleScope shs(isolate); | 7769 HandleScope scope(isolate); |
| 7796 ASSERT(args.length() == 2); | 7770 ASSERT(args.length() == 2); |
| 7797 isolate->counters()->math_pow()->Increment(); | 7771 isolate->counters()->math_pow()->Increment(); |
| 7798 | 7772 |
| 7799 CONVERT_DOUBLE_ARG_CHECKED(x, 0); | 7773 CONVERT_DOUBLE_ARG_CHECKED(x, 0); |
| 7800 CONVERT_DOUBLE_ARG_CHECKED(y, 1); | 7774 CONVERT_DOUBLE_ARG_CHECKED(y, 1); |
| 7801 if (y == 0) { | 7775 if (y == 0) { |
| 7802 return Smi::FromInt(1); | 7776 return Smi::FromInt(1); |
| 7803 } else { | 7777 } else { |
| 7804 double result = power_double_double(x, y); | 7778 double result = power_double_double(x, y); |
| 7805 if (std::isnan(result)) return isolate->heap()->nan_value(); | 7779 if (std::isnan(result)) return isolate->heap()->nan_value(); |
| 7806 return isolate->heap()->AllocateHeapNumber(result); | 7780 return *isolate->factory()->NewNumber(result); |
| 7807 } | 7781 } |
| 7808 } | 7782 } |
| 7809 | 7783 |
| 7810 | 7784 |
| 7811 RUNTIME_FUNCTION(MaybeObject*, Runtime_RoundNumber) { | 7785 RUNTIME_FUNCTION(MaybeObject*, Runtime_RoundNumber) { |
| 7812 SealHandleScope shs(isolate); | 7786 HandleScope scope(isolate); |
| 7813 ASSERT(args.length() == 1); | 7787 ASSERT(args.length() == 1); |
| 7814 isolate->counters()->math_round()->Increment(); | 7788 isolate->counters()->math_round()->Increment(); |
| 7815 | 7789 |
| 7816 if (!args[0]->IsHeapNumber()) { | 7790 if (!args[0]->IsHeapNumber()) { |
| 7817 // Must be smi. Return the argument unchanged for all the other types | 7791 // Must be smi. Return the argument unchanged for all the other types |
| 7818 // to make fuzz-natives test happy. | 7792 // to make fuzz-natives test happy. |
| 7819 return args[0]; | 7793 return args[0]; |
| 7820 } | 7794 } |
| 7821 | 7795 |
| 7822 HeapNumber* number = reinterpret_cast<HeapNumber*>(args[0]); | 7796 HeapNumber* number = reinterpret_cast<HeapNumber*>(args[0]); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 7840 | 7814 |
| 7841 // If the magnitude is big enough, there's no place for fraction part. If we | 7815 // If the magnitude is big enough, there's no place for fraction part. If we |
| 7842 // try to add 0.5 to this number, 1.0 will be added instead. | 7816 // try to add 0.5 to this number, 1.0 will be added instead. |
| 7843 if (exponent >= 52) { | 7817 if (exponent >= 52) { |
| 7844 return number; | 7818 return number; |
| 7845 } | 7819 } |
| 7846 | 7820 |
| 7847 if (sign && value >= -0.5) return isolate->heap()->minus_zero_value(); | 7821 if (sign && value >= -0.5) return isolate->heap()->minus_zero_value(); |
| 7848 | 7822 |
| 7849 // Do not call NumberFromDouble() to avoid extra checks. | 7823 // Do not call NumberFromDouble() to avoid extra checks. |
| 7850 return isolate->heap()->AllocateHeapNumber(std::floor(value + 0.5)); | 7824 return *isolate->factory()->NewNumber(std::floor(value + 0.5)); |
| 7851 } | 7825 } |
| 7852 | 7826 |
| 7853 | 7827 |
| 7854 RUNTIME_FUNCTION(MaybeObject*, Runtime_MathSqrt) { | 7828 RUNTIME_FUNCTION(MaybeObject*, Runtime_MathSqrt) { |
| 7855 SealHandleScope shs(isolate); | 7829 HandleScope scope(isolate); |
| 7856 ASSERT(args.length() == 1); | 7830 ASSERT(args.length() == 1); |
| 7857 isolate->counters()->math_sqrt()->Increment(); | 7831 isolate->counters()->math_sqrt()->Increment(); |
| 7858 | 7832 |
| 7859 CONVERT_DOUBLE_ARG_CHECKED(x, 0); | 7833 CONVERT_DOUBLE_ARG_CHECKED(x, 0); |
| 7860 return isolate->heap()->AllocateHeapNumber(fast_sqrt(x)); | 7834 return *isolate->factory()->NewNumber(fast_sqrt(x)); |
| 7861 } | 7835 } |
| 7862 | 7836 |
| 7863 | 7837 |
| 7864 RUNTIME_FUNCTION(MaybeObject*, Runtime_MathFround) { | 7838 RUNTIME_FUNCTION(MaybeObject*, Runtime_MathFround) { |
| 7865 SealHandleScope shs(isolate); | 7839 HandleScope scope(isolate); |
| 7866 ASSERT(args.length() == 1); | 7840 ASSERT(args.length() == 1); |
| 7867 | 7841 |
| 7868 CONVERT_DOUBLE_ARG_CHECKED(x, 0); | 7842 CONVERT_DOUBLE_ARG_CHECKED(x, 0); |
| 7869 float xf = static_cast<float>(x); | 7843 float xf = static_cast<float>(x); |
| 7870 return isolate->heap()->AllocateHeapNumber(xf); | 7844 return *isolate->factory()->NewNumber(xf); |
| 7871 } | 7845 } |
| 7872 | 7846 |
| 7873 | 7847 |
| 7874 RUNTIME_FUNCTION(MaybeObject*, Runtime_DateMakeDay) { | 7848 RUNTIME_FUNCTION(MaybeObject*, Runtime_DateMakeDay) { |
| 7875 SealHandleScope shs(isolate); | 7849 SealHandleScope shs(isolate); |
| 7876 ASSERT(args.length() == 2); | 7850 ASSERT(args.length() == 2); |
| 7877 | 7851 |
| 7878 CONVERT_SMI_ARG_CHECKED(year, 0); | 7852 CONVERT_SMI_ARG_CHECKED(year, 0); |
| 7879 CONVERT_SMI_ARG_CHECKED(month, 1); | 7853 CONVERT_SMI_ARG_CHECKED(month, 1); |
| 7880 | 7854 |
| 7881 return Smi::FromInt(isolate->date_cache()->DaysFromYearMonth(year, month)); | 7855 return Smi::FromInt(isolate->date_cache()->DaysFromYearMonth(year, month)); |
| 7882 } | 7856 } |
| 7883 | 7857 |
| 7884 | 7858 |
| 7885 RUNTIME_FUNCTION(MaybeObject*, Runtime_DateSetValue) { | 7859 RUNTIME_FUNCTION(MaybeObject*, Runtime_DateSetValue) { |
| 7886 HandleScope scope(isolate); | 7860 HandleScope scope(isolate); |
| 7887 ASSERT(args.length() == 3); | 7861 ASSERT(args.length() == 3); |
| 7888 | 7862 |
| 7889 CONVERT_ARG_HANDLE_CHECKED(JSDate, date, 0); | 7863 CONVERT_ARG_HANDLE_CHECKED(JSDate, date, 0); |
| 7890 CONVERT_DOUBLE_ARG_CHECKED(time, 1); | 7864 CONVERT_DOUBLE_ARG_CHECKED(time, 1); |
| 7891 CONVERT_SMI_ARG_CHECKED(is_utc, 2); | 7865 CONVERT_SMI_ARG_CHECKED(is_utc, 2); |
| 7892 | 7866 |
| 7893 DateCache* date_cache = isolate->date_cache(); | 7867 DateCache* date_cache = isolate->date_cache(); |
| 7894 | 7868 |
| 7895 Object* value = NULL; | 7869 Handle<Object> value;; |
| 7896 bool is_value_nan = false; | 7870 bool is_value_nan = false; |
| 7897 if (std::isnan(time)) { | 7871 if (std::isnan(time)) { |
| 7898 value = isolate->heap()->nan_value(); | 7872 value = isolate->factory()->nan_value(); |
| 7899 is_value_nan = true; | 7873 is_value_nan = true; |
| 7900 } else if (!is_utc && | 7874 } else if (!is_utc && |
| 7901 (time < -DateCache::kMaxTimeBeforeUTCInMs || | 7875 (time < -DateCache::kMaxTimeBeforeUTCInMs || |
| 7902 time > DateCache::kMaxTimeBeforeUTCInMs)) { | 7876 time > DateCache::kMaxTimeBeforeUTCInMs)) { |
| 7903 value = isolate->heap()->nan_value(); | 7877 value = isolate->factory()->nan_value(); |
| 7904 is_value_nan = true; | 7878 is_value_nan = true; |
| 7905 } else { | 7879 } else { |
| 7906 time = is_utc ? time : date_cache->ToUTC(static_cast<int64_t>(time)); | 7880 time = is_utc ? time : date_cache->ToUTC(static_cast<int64_t>(time)); |
| 7907 if (time < -DateCache::kMaxTimeInMs || | 7881 if (time < -DateCache::kMaxTimeInMs || |
| 7908 time > DateCache::kMaxTimeInMs) { | 7882 time > DateCache::kMaxTimeInMs) { |
| 7909 value = isolate->heap()->nan_value(); | 7883 value = isolate->factory()->nan_value(); |
| 7910 is_value_nan = true; | 7884 is_value_nan = true; |
| 7911 } else { | 7885 } else { |
| 7912 MaybeObject* maybe_result = | 7886 value = isolate->factory()->NewNumber(DoubleToInteger(time)); |
| 7913 isolate->heap()->AllocateHeapNumber(DoubleToInteger(time)); | |
| 7914 if (!maybe_result->ToObject(&value)) return maybe_result; | |
| 7915 } | 7887 } |
| 7916 } | 7888 } |
| 7917 date->SetValue(value, is_value_nan); | 7889 date->SetValue(*value, is_value_nan); |
| 7918 return value; | 7890 return *value; |
| 7919 } | 7891 } |
| 7920 | 7892 |
| 7921 | 7893 |
| 7922 RUNTIME_FUNCTION(MaybeObject*, RuntimeHidden_NewArgumentsFast) { | 7894 RUNTIME_FUNCTION(MaybeObject*, RuntimeHidden_NewArgumentsFast) { |
| 7923 HandleScope scope(isolate); | 7895 HandleScope scope(isolate); |
| 7924 ASSERT(args.length() == 3); | 7896 ASSERT(args.length() == 3); |
| 7925 | 7897 |
| 7926 Handle<JSFunction> callee = args.at<JSFunction>(0); | 7898 Handle<JSFunction> callee = args.at<JSFunction>(0); |
| 7927 Object** parameters = reinterpret_cast<Object**>(args[1]); | 7899 Object** parameters = reinterpret_cast<Object**>(args[1]); |
| 7928 const int argument_count = Smi::cast(args[2])->value(); | 7900 const int argument_count = Smi::cast(args[2])->value(); |
| (...skipping 1646 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9575 | 9547 |
| 9576 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugTrace) { | 9548 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugTrace) { |
| 9577 SealHandleScope shs(isolate); | 9549 SealHandleScope shs(isolate); |
| 9578 ASSERT(args.length() == 0); | 9550 ASSERT(args.length() == 0); |
| 9579 isolate->PrintStack(stdout); | 9551 isolate->PrintStack(stdout); |
| 9580 return isolate->heap()->undefined_value(); | 9552 return isolate->heap()->undefined_value(); |
| 9581 } | 9553 } |
| 9582 | 9554 |
| 9583 | 9555 |
| 9584 RUNTIME_FUNCTION(MaybeObject*, Runtime_DateCurrentTime) { | 9556 RUNTIME_FUNCTION(MaybeObject*, Runtime_DateCurrentTime) { |
| 9585 SealHandleScope shs(isolate); | 9557 HandleScope scope(isolate); |
| 9586 ASSERT(args.length() == 0); | 9558 ASSERT(args.length() == 0); |
| 9587 | 9559 |
| 9588 // According to ECMA-262, section 15.9.1, page 117, the precision of | 9560 // According to ECMA-262, section 15.9.1, page 117, the precision of |
| 9589 // the number in a Date object representing a particular instant in | 9561 // the number in a Date object representing a particular instant in |
| 9590 // time is milliseconds. Therefore, we floor the result of getting | 9562 // time is milliseconds. Therefore, we floor the result of getting |
| 9591 // the OS time. | 9563 // the OS time. |
| 9592 double millis = std::floor(OS::TimeCurrentMillis()); | 9564 double millis = std::floor(OS::TimeCurrentMillis()); |
| 9593 return isolate->heap()->NumberFromDouble(millis); | 9565 return *isolate->factory()->NewNumber(millis); |
| 9594 } | 9566 } |
| 9595 | 9567 |
| 9596 | 9568 |
| 9597 RUNTIME_FUNCTION(MaybeObject*, Runtime_DateParseString) { | 9569 RUNTIME_FUNCTION(MaybeObject*, Runtime_DateParseString) { |
| 9598 HandleScope scope(isolate); | 9570 HandleScope scope(isolate); |
| 9599 ASSERT(args.length() == 2); | 9571 ASSERT(args.length() == 2); |
| 9600 CONVERT_ARG_HANDLE_CHECKED(String, str, 0); | 9572 CONVERT_ARG_HANDLE_CHECKED(String, str, 0); |
| 9601 CONVERT_ARG_HANDLE_CHECKED(JSArray, output, 1); | 9573 CONVERT_ARG_HANDLE_CHECKED(JSArray, output, 1); |
| 9602 | 9574 |
| 9603 JSObject::EnsureCanContainHeapObjectElements(output); | 9575 JSObject::EnsureCanContainHeapObjectElements(output); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 9634 ASSERT(args.length() == 1); | 9606 ASSERT(args.length() == 1); |
| 9635 | 9607 |
| 9636 CONVERT_DOUBLE_ARG_CHECKED(x, 0); | 9608 CONVERT_DOUBLE_ARG_CHECKED(x, 0); |
| 9637 const char* zone = | 9609 const char* zone = |
| 9638 isolate->date_cache()->LocalTimezone(static_cast<int64_t>(x)); | 9610 isolate->date_cache()->LocalTimezone(static_cast<int64_t>(x)); |
| 9639 return isolate->heap()->AllocateStringFromUtf8(CStrVector(zone)); | 9611 return isolate->heap()->AllocateStringFromUtf8(CStrVector(zone)); |
| 9640 } | 9612 } |
| 9641 | 9613 |
| 9642 | 9614 |
| 9643 RUNTIME_FUNCTION(MaybeObject*, Runtime_DateToUTC) { | 9615 RUNTIME_FUNCTION(MaybeObject*, Runtime_DateToUTC) { |
| 9644 SealHandleScope shs(isolate); | 9616 HandleScope scope(isolate); |
| 9645 ASSERT(args.length() == 1); | 9617 ASSERT(args.length() == 1); |
| 9646 | 9618 |
| 9647 CONVERT_DOUBLE_ARG_CHECKED(x, 0); | 9619 CONVERT_DOUBLE_ARG_CHECKED(x, 0); |
| 9648 int64_t time = isolate->date_cache()->ToUTC(static_cast<int64_t>(x)); | 9620 int64_t time = isolate->date_cache()->ToUTC(static_cast<int64_t>(x)); |
| 9649 | 9621 |
| 9650 return isolate->heap()->NumberFromDouble(static_cast<double>(time)); | 9622 return *isolate->factory()->NewNumber(static_cast<double>(time)); |
| 9651 } | 9623 } |
| 9652 | 9624 |
| 9653 | 9625 |
| 9654 RUNTIME_FUNCTION(MaybeObject*, Runtime_DateCacheVersion) { | 9626 RUNTIME_FUNCTION(MaybeObject*, Runtime_DateCacheVersion) { |
| 9655 HandleScope hs(isolate); | 9627 HandleScope hs(isolate); |
| 9656 ASSERT(args.length() == 0); | 9628 ASSERT(args.length() == 0); |
| 9657 if (!isolate->eternal_handles()->Exists(EternalHandles::DATE_CACHE_VERSION)) { | 9629 if (!isolate->eternal_handles()->Exists(EternalHandles::DATE_CACHE_VERSION)) { |
| 9658 Handle<FixedArray> date_cache_version = | 9630 Handle<FixedArray> date_cache_version = |
| 9659 isolate->factory()->NewFixedArray(1, TENURED); | 9631 isolate->factory()->NewFixedArray(1, TENURED); |
| 9660 date_cache_version->set(0, Smi::FromInt(0)); | 9632 date_cache_version->set(0, Smi::FromInt(0)); |
| (...skipping 5447 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 15108 } | 15080 } |
| 15109 } | 15081 } |
| 15110 | 15082 |
| 15111 | 15083 |
| 15112 void Runtime::OutOfMemory() { | 15084 void Runtime::OutOfMemory() { |
| 15113 Heap::FatalProcessOutOfMemory("CALL_AND_RETRY_LAST", true); | 15085 Heap::FatalProcessOutOfMemory("CALL_AND_RETRY_LAST", true); |
| 15114 UNREACHABLE(); | 15086 UNREACHABLE(); |
| 15115 } | 15087 } |
| 15116 | 15088 |
| 15117 } } // namespace v8::internal | 15089 } } // namespace v8::internal |
| OLD | NEW |