| /* |
| * Copyright (C) 2016 Apple Inc. All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions |
| * are met: |
| * 1. Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * 2. Redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in the |
| * documentation and/or other materials provided with the distribution. |
| * |
| * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' |
| * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, |
| * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
| * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS |
| * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
| * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
| * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
| * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
| * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
| * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF |
| * THE POSSIBILITY OF SUCH DAMAGE. |
| */ |
| |
| #import "config.h" |
| #import "WKNSNumber.h" |
| |
| #if WK_API_ENABLED |
| |
| using namespace WebKit; |
| |
| @implementation WKNSNumber { |
| union { |
| API::ObjectStorage<API::Boolean> _boolean; |
| API::ObjectStorage<API::Double> _double; |
| API::ObjectStorage<API::UInt64> _uint64; |
| } _number; |
| } |
| |
| - (void)dealloc |
| { |
| switch (_type) { |
| case API::Object::Type::Boolean: |
| _number._boolean->~Number<bool, API::Object::Type::Boolean>(); |
| break; |
| |
| case API::Object::Type::Double: |
| _number._double->~Number<double, API::Object::Type::Double>(); |
| break; |
| |
| case API::Object::Type::UInt64: |
| _number._uint64->~Number<uint64_t, API::Object::Type::UInt64>(); |
| break; |
| |
| default: |
| ASSERT_NOT_REACHED(); |
| } |
| |
| [super dealloc]; |
| } |
| |
| // MARK: NSValue primitive methods |
| |
| - (const char *)objCType |
| { |
| switch (_type) { |
| case API::Object::Type::Boolean: |
| return @encode(bool); |
| break; |
| |
| case API::Object::Type::Double: |
| return @encode(double); |
| break; |
| |
| case API::Object::Type::UInt64: |
| return @encode(uint64_t); |
| break; |
| |
| default: |
| ASSERT_NOT_REACHED(); |
| } |
| |
| return nullptr; |
| } |
| |
| - (void)getValue:(void *)value |
| { |
| switch (_type) { |
| case API::Object::Type::Boolean: |
| *reinterpret_cast<bool*>(value) = _number._boolean->value(); |
| break; |
| |
| case API::Object::Type::Double: |
| *reinterpret_cast<double*>(value) = _number._double->value(); |
| break; |
| |
| case API::Object::Type::UInt64: |
| *reinterpret_cast<uint64_t*>(value) = _number._uint64->value(); |
| break; |
| |
| default: |
| ASSERT_NOT_REACHED(); |
| } |
| } |
| |
| // MARK: NSNumber primitive methods |
| |
| - (char)charValue |
| { |
| if (_type == API::Object::Type::Boolean) |
| return _number._boolean->value(); |
| |
| return super.charValue; |
| } |
| |
| - (double)doubleValue |
| { |
| if (_type == API::Object::Type::Double) |
| return _number._double->value(); |
| |
| return super.doubleValue; |
| } |
| |
| - (unsigned long long)unsignedLongLongValue |
| { |
| if (_type == API::Object::Type::UInt64) |
| return _number._uint64->value(); |
| |
| return super.unsignedLongLongValue; |
| } |
| |
| // MARK: NSCopying protocol implementation |
| |
| - (id)copyWithZone:(NSZone *)zone |
| { |
| return [self retain]; |
| } |
| |
| // MARK: WKObject protocol implementation |
| |
| - (API::Object&)_apiObject |
| { |
| switch (_type) { |
| case API::Object::Type::Boolean: |
| return *_number._boolean; |
| break; |
| |
| case API::Object::Type::Double: |
| return *_number._double; |
| break; |
| |
| case API::Object::Type::UInt64: |
| return *_number._uint64; |
| break; |
| |
| default: |
| ASSERT_NOT_REACHED(); |
| } |
| |
| return *_number._boolean; |
| } |
| |
| @end |
| |
| #endif // WK_API_ENABLED |