Home | History | Annotate | Download | only in js
      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