Example #1
0
    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;
    }