private Scriptable alloc(Context cx, Object[] args) { ScriptableObject obj = objArg(args, 0, ScriptableObject.class, true); int size = intArg(args, 1); Object typeObj = objArg(args, 2, Object.class, false); int type; if ((typeObj == null) || Undefined.instance.equals(typeObj)) { type = 2; } else { type = ScriptRuntime.toInt32(typeObj); } if (obj.getExternalArrayData() != null) { throw Utils.makeTypeError(cx, this, "object already has external array data"); } ExternalArrayData array; // Switch needs to match constants in smalloc.js switch (type) { case 1: array = new NativeInt8Array(size); break; case 2: array = new NativeUint8Array(size); break; case 3: array = new NativeInt16Array(size); break; case 4: array = new NativeUint16Array(size); break; case 5: array = new NativeInt32Array(size); break; case 6: array = new NativeUint32Array(size); break; case 7: array = new NativeFloat32Array(size); break; case 8: array = new NativeFloat64Array(size); break; case 9: array = new NativeUint8ClampedArray(size); break; default: throw Utils.makeError(cx, this, "Invalid array type"); } obj.setExternalArrayData(array); return obj; }