/* * Copyright 2016 WebAssembly Community Group participants * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include "support/safe_integer.h" using namespace wasm; bool wasm::isInteger(double x) { return fmod(x, 1) == 0; } bool wasm::isUInteger32(double x) { return isInteger(x) && x >= 0 && x <= std::numeric_limits::max(); } bool wasm::isSInteger32(double x) { return isInteger(x) && x >= std::numeric_limits::min() && x <= std::numeric_limits::max(); } uint32_t wasm::toUInteger32(double x) { assert(isUInteger32(x)); return x < std::numeric_limits::max() ? x : std::numeric_limits::max(); } int32_t wasm::toSInteger32(double x) { assert(isSInteger32(x)); return x > std::numeric_limits::min() && x < std::numeric_limits::max() ? x : (x < 0 ? std::numeric_limits::min() : std::numeric_limits::max()); } bool wasm::isUInteger64(double x) { return isInteger(x) && x >= 0 && x <= std::numeric_limits::max(); } bool wasm::isSInteger64(double x) { return isInteger(x) && x >= std::numeric_limits::min() && x <= std::numeric_limits::max(); } uint64_t wasm::toUInteger64(double x) { assert(isUInteger64(x)); return x < (double)std::numeric_limits::max() ? (uint64_t)x : std::numeric_limits::max(); } int64_t wasm::toSInteger64(double x) { assert(isSInteger64(x)); return x > (double)std::numeric_limits::min() && x < (double)std::numeric_limits::max() ? (int64_t)x : (x < 0 ? std::numeric_limits::min() : std::numeric_limits::max()); }