1 /* 2 * Copyright (C) 2009 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 COMPUTER, 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 COMPUTER, 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 #ifndef JSWebGLArrayBufferConstructor_h 27 #define JSWebGLArrayBufferConstructor_h 28 29 #include "JSDOMBinding.h" 30 #include "JSDocument.h" 31 #include "JSWebGLArrayBuffer.h" 32 #include <runtime/Error.h> 33 34 namespace WebCore { 35 36 class WebGLArray; 37 38 // Template function used by CanvasXXXArrayConstructors 39 template<class C, typename T> 40 PassRefPtr<WebGLArray> construct(JSC::ExecState* exec, const JSC::ArgList& args) 41 { 42 // There are 3 constructors: 43 // 44 // 1) (in int size) 45 // 2) (in WebGLArrayBuffer buffer, [Optional] in int offset, [Optional] in unsigned int length) 46 // 3) (in sequence<T>) - This ends up being a JS "array-like" object 47 // 48 RefPtr<C> arrayObject; 49 50 // For the 0 args case, just create an object without a buffer 51 if (args.size() < 1) 52 return C::create(0, 0, 0); 53 54 if (args.at(0).isObject()) { 55 RefPtr<WebGLArrayBuffer> buffer = toWebGLArrayBuffer(args.at(0)); 56 if (buffer) { 57 int offset = (args.size() > 1) ? args.at(1).toInt32(exec) : 0; 58 unsigned int length = (args.size() > 2) ? static_cast<unsigned int>(args.at(2).toInt32(exec)) : 0; 59 return C::create(buffer, offset, length); 60 } 61 62 JSC::JSObject* array = asObject(args.at(0)); 63 int length = array->get(exec, JSC::Identifier(exec, "length")).toInt32(exec); 64 void* tempValues; 65 if (!tryFastMalloc(length * sizeof(T)).getValue(tempValues)) { 66 throwError(exec, JSC::GeneralError); 67 return 0; 68 } 69 70 OwnFastMallocPtr<T> values(static_cast<T*>(tempValues)); 71 for (int i = 0; i < length; ++i) { 72 JSC::JSValue v = array->get(exec, i); 73 if (exec->hadException()) 74 return 0; 75 values.get()[i] = static_cast<T>(v.toNumber(exec)); 76 } 77 78 return C::create(values.get(), length); 79 } 80 81 unsigned size = static_cast<unsigned>(args.at(0).toInt32(exec)); 82 return C::create(size); 83 } 84 85 class JSWebGLArrayBufferConstructor : public DOMConstructorObject { 86 public: 87 JSWebGLArrayBufferConstructor(JSC::ExecState*, JSDOMGlobalObject*); 88 static const JSC::ClassInfo s_info; 89 90 private: 91 virtual JSC::ConstructType getConstructData(JSC::ConstructData&); 92 virtual const JSC::ClassInfo* classInfo() const { return &s_info; } 93 }; 94 95 } 96 97 #endif // JSWebGLArrayBufferConstructor_h 98