| Index: src/runtime/runtime-numbers.cc
|
| diff --git a/src/runtime/runtime-numbers.cc b/src/runtime/runtime-numbers.cc
|
| index 9f43c0acfceeeff5bfec4d3fca72ebbf41830f2d..edd83bc5e80adb19b31ec41ff1dbe1a738658e54 100644
|
| --- a/src/runtime/runtime-numbers.cc
|
| +++ b/src/runtime/runtime-numbers.cc
|
| @@ -12,6 +12,90 @@
|
|
|
| namespace v8 {
|
| namespace internal {
|
| +
|
| +RUNTIME_FUNCTION(Runtime_NumberToRadixString) {
|
| + HandleScope scope(isolate);
|
| + DCHECK(args.length() == 2);
|
| + CONVERT_SMI_ARG_CHECKED(radix, 1);
|
| + CHECK(2 <= radix && radix <= 36);
|
| +
|
| + // Fast case where the result is a one character string.
|
| + if (args[0]->IsSmi()) {
|
| + int value = args.smi_at(0);
|
| + if (value >= 0 && value < radix) {
|
| + // Character array used for conversion.
|
| + static const char kCharTable[] = "0123456789abcdefghijklmnopqrstuvwxyz";
|
| + return *isolate->factory()->LookupSingleCharacterStringFromCode(
|
| + kCharTable[value]);
|
| + }
|
| + }
|
| +
|
| + // Slow case.
|
| + CONVERT_DOUBLE_ARG_CHECKED(value, 0);
|
| + if (std::isnan(value)) {
|
| + return isolate->heap()->nan_string();
|
| + }
|
| + if (std::isinf(value)) {
|
| + if (value < 0) {
|
| + return isolate->heap()->minus_infinity_string();
|
| + }
|
| + return isolate->heap()->infinity_string();
|
| + }
|
| + char* str = DoubleToRadixCString(value, radix);
|
| + Handle<String> result = isolate->factory()->NewStringFromAsciiChecked(str);
|
| + DeleteArray(str);
|
| + return *result;
|
| +}
|
| +
|
| +
|
| +RUNTIME_FUNCTION(Runtime_NumberToFixed) {
|
| + HandleScope scope(isolate);
|
| + DCHECK(args.length() == 2);
|
| +
|
| + CONVERT_DOUBLE_ARG_CHECKED(value, 0);
|
| + CONVERT_DOUBLE_ARG_CHECKED(f_number, 1);
|
| + int f = FastD2IChecked(f_number);
|
| + // See DoubleToFixedCString for these constants:
|
| + CHECK(f >= 0 && f <= 20);
|
| + CHECK(!Double(value).IsSpecial());
|
| + char* str = DoubleToFixedCString(value, f);
|
| + Handle<String> result = isolate->factory()->NewStringFromAsciiChecked(str);
|
| + DeleteArray(str);
|
| + return *result;
|
| +}
|
| +
|
| +
|
| +RUNTIME_FUNCTION(Runtime_NumberToExponential) {
|
| + HandleScope scope(isolate);
|
| + DCHECK(args.length() == 2);
|
| +
|
| + CONVERT_DOUBLE_ARG_CHECKED(value, 0);
|
| + CONVERT_DOUBLE_ARG_CHECKED(f_number, 1);
|
| + int f = FastD2IChecked(f_number);
|
| + CHECK(f >= -1 && f <= 20);
|
| + CHECK(!Double(value).IsSpecial());
|
| + char* str = DoubleToExponentialCString(value, f);
|
| + Handle<String> result = isolate->factory()->NewStringFromAsciiChecked(str);
|
| + DeleteArray(str);
|
| + return *result;
|
| +}
|
| +
|
| +
|
| +RUNTIME_FUNCTION(Runtime_NumberToPrecision) {
|
| + HandleScope scope(isolate);
|
| + DCHECK(args.length() == 2);
|
| +
|
| + CONVERT_DOUBLE_ARG_CHECKED(value, 0);
|
| + CONVERT_DOUBLE_ARG_CHECKED(f_number, 1);
|
| + int f = FastD2IChecked(f_number);
|
| + CHECK(f >= 1 && f <= 21);
|
| + CHECK(!Double(value).IsSpecial());
|
| + char* str = DoubleToPrecisionCString(value, f);
|
| + Handle<String> result = isolate->factory()->NewStringFromAsciiChecked(str);
|
| + DeleteArray(str);
|
| + return *result;
|
| +}
|
| +
|
|
|
| RUNTIME_FUNCTION(Runtime_IsValidSmi) {
|
| SealHandleScope shs(isolate);
|
|
|