2009-12-07 Kenneth Russell <kbr@google.com>
[WebKit-https.git] / WebCore / bindings / v8 / custom / V8WebGLArrayBufferCustom.cpp
index 699667edf7bffc7194386f165b997aa18cef3986..16a1f5188f3de04b1336174cebafdbeaa65bbbe1 100644 (file)
@@ -48,28 +48,31 @@ CALLBACK_FUNC_DECL(WebGLArrayBufferConstructor)
     if (!args.IsConstructCall())
         return throwError("DOM object constructor cannot be called as a function.");
 
-    int argLen = args.Length();
-    if (argLen == 0) {
-        // This happens when we return a previously constructed
-        // WebGLArrayBuffer, e.g. from the call to WebGLArray.buffer.
-        // The V8DOMWrapper will set the internal pointer in the
-        // created object. Unfortunately it doesn't look like it's
-        // possible to distinguish between this case and that where
-        // the user calls "new WebGLArrayBuffer()" from JavaScript.
-        return args.Holder();
-    }
+    // If we return a previously constructed WebGLArrayBuffer,
+    // e.g. from the call to WebGLArray.buffer, this code is called
+    // with a zero-length argument list. The V8DOMWrapper will then
+    // set the internal pointer in the newly-created object.
+    // Unfortunately it doesn't look like it's possible to distinguish
+    // between this case and that where the user calls "new
+    // WebGLArrayBuffer()" from JavaScript. To guard against problems,
+    // we always create at least a zero-length WebGLArrayBuffer, even
+    // if it is immediately overwritten by the V8DOMWrapper.
 
     // Supported constructors:
     // WebGLArrayBuffer(n) where n is an integer:
     //   -- create an empty buffer of n bytes
 
-    if (argLen != 1)
+    int argLen = args.Length();
+    if (argLen > 1)
         return throwError("Wrong number of arguments specified to constructor (requires 1)");
 
     int len = 0;
-    if (!args[0]->IsInt32())
-        return throwError("Argument to WebGLArrayBuffer constructor was not an integer");
-    len = toInt32(args[0]);
+    if (argLen > 0) {
+        if (!args[0]->IsInt32())
+            return throwError("Argument to WebGLArrayBuffer constructor was not an integer");
+        len = toInt32(args[0]);
+    }
+
     RefPtr<WebGLArrayBuffer> buffer = WebGLArrayBuffer::create(len);
     // Transform the holder into a wrapper object for the array.
     V8DOMWrapper::setDOMWrapper(args.Holder(), V8ClassIndex::ToInt(V8ClassIndex::WEBGLARRAYBUFFER), buffer.get());