summaryrefslogtreecommitdiff
path: root/deps/v8/src/conversions-inl.h
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/conversions-inl.h')
-rw-r--r--deps/v8/src/conversions-inl.h68
1 files changed, 68 insertions, 0 deletions
diff --git a/deps/v8/src/conversions-inl.h b/deps/v8/src/conversions-inl.h
index ae87dc4d31..42d617d017 100644
--- a/deps/v8/src/conversions-inl.h
+++ b/deps/v8/src/conversions-inl.h
@@ -18,6 +18,7 @@
#include "src/base/platform/platform.h"
#include "src/conversions.h"
#include "src/double.h"
+#include "src/objects-inl.h"
#include "src/scanner.h"
#include "src/strtod.h"
@@ -97,6 +98,73 @@ int32_t DoubleToInt32(double x) {
}
+bool IsSmiDouble(double value) {
+ return !IsMinusZero(value) && value >= Smi::kMinValue &&
+ value <= Smi::kMaxValue && value == FastI2D(FastD2I(value));
+}
+
+
+bool IsInt32Double(double value) {
+ return !IsMinusZero(value) && value >= kMinInt && value <= kMaxInt &&
+ value == FastI2D(FastD2I(value));
+}
+
+
+bool IsUint32Double(double value) {
+ return !IsMinusZero(value) && value >= 0 && value <= kMaxUInt32 &&
+ value == FastUI2D(FastD2UI(value));
+}
+
+
+int32_t NumberToInt32(Object* number) {
+ if (number->IsSmi()) return Smi::cast(number)->value();
+ return DoubleToInt32(number->Number());
+}
+
+
+uint32_t NumberToUint32(Object* number) {
+ if (number->IsSmi()) return Smi::cast(number)->value();
+ return DoubleToUint32(number->Number());
+}
+
+
+bool TryNumberToSize(Isolate* isolate, Object* number, size_t* result) {
+ SealHandleScope shs(isolate);
+ if (number->IsSmi()) {
+ int value = Smi::cast(number)->value();
+ DCHECK(static_cast<unsigned>(Smi::kMaxValue) <=
+ std::numeric_limits<size_t>::max());
+ if (value >= 0) {
+ *result = static_cast<size_t>(value);
+ return true;
+ }
+ return false;
+ } else {
+ DCHECK(number->IsHeapNumber());
+ double value = HeapNumber::cast(number)->value();
+ if (value >= 0 && value <= std::numeric_limits<size_t>::max()) {
+ *result = static_cast<size_t>(value);
+ return true;
+ } else {
+ return false;
+ }
+ }
+}
+
+
+size_t NumberToSize(Isolate* isolate, Object* number) {
+ size_t result = 0;
+ bool is_valid = TryNumberToSize(isolate, number, &result);
+ CHECK(is_valid);
+ return result;
+}
+
+
+uint32_t DoubleToUint32(double x) {
+ return static_cast<uint32_t>(DoubleToInt32(x));
+}
+
+
template <class Iterator, class EndMark>
bool SubStringEquals(Iterator* current,
EndMark end,