/ runtime / JSGenericTypedArrayViewConstructor.h
JSGenericTypedArrayViewConstructor.h
  1  /*
  2   * Copyright (C) 2013-2015 Apple Inc. All rights reserved.
  3   *
  4   * Redistribution and use in source and binary forms, with or without
  5   * modification, are permitted provided that the following conditions
  6   * are met:
  7   * 1. Redistributions of source code must retain the above copyright
  8   *    notice, this list of conditions and the following disclaimer.
  9   * 2. Redistributions in binary form must reproduce the above copyright
 10   *    notice, this list of conditions and the following disclaimer in the
 11   *    documentation and/or other materials provided with the distribution.
 12   *
 13   * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
 14   * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 15   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 16   * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
 17   * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 18   * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 19   * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 20   * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 21   * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 22   * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 23   * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
 24   */
 25  
 26  #pragma once
 27  
 28  #include "InternalFunction.h"
 29  
 30  namespace JSC {
 31  
 32  JS_EXPORT_PRIVATE JSC_DECLARE_HOST_FUNCTION(callInt8Array);
 33  JS_EXPORT_PRIVATE JSC_DECLARE_HOST_FUNCTION(callInt16Array);
 34  JS_EXPORT_PRIVATE JSC_DECLARE_HOST_FUNCTION(callInt32Array);
 35  JS_EXPORT_PRIVATE JSC_DECLARE_HOST_FUNCTION(callUint8Array);
 36  JS_EXPORT_PRIVATE JSC_DECLARE_HOST_FUNCTION(callUint8ClampedArray);
 37  JS_EXPORT_PRIVATE JSC_DECLARE_HOST_FUNCTION(callUint16Array);
 38  JS_EXPORT_PRIVATE JSC_DECLARE_HOST_FUNCTION(callUint32Array);
 39  JS_EXPORT_PRIVATE JSC_DECLARE_HOST_FUNCTION(callFloat32Array);
 40  JS_EXPORT_PRIVATE JSC_DECLARE_HOST_FUNCTION(callFloat64Array);
 41  JS_EXPORT_PRIVATE JSC_DECLARE_HOST_FUNCTION(callDataView);
 42  
 43  JS_EXPORT_PRIVATE JSC_DECLARE_HOST_FUNCTION(constructInt8Array);
 44  JS_EXPORT_PRIVATE JSC_DECLARE_HOST_FUNCTION(constructInt16Array);
 45  JS_EXPORT_PRIVATE JSC_DECLARE_HOST_FUNCTION(constructInt32Array);
 46  JS_EXPORT_PRIVATE JSC_DECLARE_HOST_FUNCTION(constructUint8Array);
 47  JS_EXPORT_PRIVATE JSC_DECLARE_HOST_FUNCTION(constructUint8ClampedArray);
 48  JS_EXPORT_PRIVATE JSC_DECLARE_HOST_FUNCTION(constructUint16Array);
 49  JS_EXPORT_PRIVATE JSC_DECLARE_HOST_FUNCTION(constructUint32Array);
 50  JS_EXPORT_PRIVATE JSC_DECLARE_HOST_FUNCTION(constructFloat32Array);
 51  JS_EXPORT_PRIVATE JSC_DECLARE_HOST_FUNCTION(constructFloat64Array);
 52  JS_EXPORT_PRIVATE JSC_DECLARE_HOST_FUNCTION(constructDataView);
 53  
 54  template<typename ViewClass>
 55  class JSGenericTypedArrayViewConstructor final : public InternalFunction {
 56  public:
 57      using Base = InternalFunction;
 58  
 59      static JSGenericTypedArrayViewConstructor* create(
 60          VM&, JSGlobalObject*, Structure*, JSObject* prototype, const String& name);
 61  
 62      // FIXME: We should fix the warnings for extern-template in JSObject template classes: https://bugs.webkit.org/show_bug.cgi?id=161979
 63      IGNORE_CLANG_WARNINGS_BEGIN("undefined-var-template")
 64      DECLARE_INFO;
 65      IGNORE_CLANG_WARNINGS_END
 66  
 67      static Structure* createStructure(VM&, JSGlobalObject*, JSValue prototype);
 68  
 69      static constexpr RawNativeFunction callConstructor()
 70      {
 71          switch (ViewClass::TypedArrayStorageType) {
 72          case TypeInt8:
 73              return callInt8Array;
 74          case TypeInt16:
 75              return callInt16Array;
 76          case TypeInt32:
 77              return callInt32Array;
 78          case TypeUint8:
 79              return callUint8Array;
 80          case TypeUint8Clamped:
 81              return callUint8ClampedArray;
 82          case TypeUint16:
 83              return callUint16Array;
 84          case TypeUint32:
 85              return callUint32Array;
 86          case TypeFloat32:
 87              return callFloat32Array;
 88          case TypeFloat64:
 89              return callFloat64Array;
 90          case TypeDataView:
 91              return callDataView;
 92          default:
 93              CRASH_UNDER_CONSTEXPR_CONTEXT();
 94              return nullptr;
 95          }
 96      }
 97  
 98      static constexpr RawNativeFunction constructConstructor()
 99      {
100          switch (ViewClass::TypedArrayStorageType) {
101          case TypeInt8:
102              return constructInt8Array;
103          case TypeInt16:
104              return constructInt16Array;
105          case TypeInt32:
106              return constructInt32Array;
107          case TypeUint8:
108              return constructUint8Array;
109          case TypeUint8Clamped:
110              return constructUint8ClampedArray;
111          case TypeUint16:
112              return constructUint16Array;
113          case TypeUint32:
114              return constructUint32Array;
115          case TypeFloat32:
116              return constructFloat32Array;
117          case TypeFloat64:
118              return constructFloat64Array;
119          case TypeDataView:
120              return constructDataView;
121          default:
122              CRASH_UNDER_CONSTEXPR_CONTEXT();
123              return nullptr;
124          }
125      }
126  
127  private:
128      JSGenericTypedArrayViewConstructor(VM&, Structure*);
129      void finishCreation(VM&, JSGlobalObject*, JSObject* prototype, const String& name);
130  };
131  
132  } // namespace JSC