summaryrefslogtreecommitdiff
path: root/examples/scala-js/tools/scalajsenv.js
diff options
context:
space:
mode:
Diffstat (limited to 'examples/scala-js/tools/scalajsenv.js')
-rw-r--r--examples/scala-js/tools/scalajsenv.js772
1 files changed, 772 insertions, 0 deletions
diff --git a/examples/scala-js/tools/scalajsenv.js b/examples/scala-js/tools/scalajsenv.js
new file mode 100644
index 0000000..01a84ba
--- /dev/null
+++ b/examples/scala-js/tools/scalajsenv.js
@@ -0,0 +1,772 @@
+/* Scala.js runtime support
+ * Copyright 2013 LAMP/EPFL
+ * Author: Sébastien Doeraene
+ */
+
+/* ---------------------------------- *
+ * The top-level Scala.js environment *
+ * ---------------------------------- */
+
+var ScalaJS = {};
+
+// Get the environment info
+ScalaJS.env = (typeof __ScalaJSEnv === "object" && __ScalaJSEnv) ? __ScalaJSEnv : {};
+
+// Global scope
+ScalaJS.g =
+ (typeof ScalaJS.env["global"] === "object" && ScalaJS.env["global"])
+ ? ScalaJS.env["global"]
+ : ((typeof global === "object" && global && global["Object"] === Object) ? global : this);
+ScalaJS.env["global"] = ScalaJS.g;
+
+// Where to send exports
+ScalaJS.e =
+ (typeof ScalaJS.env["exportsNamespace"] === "object" && ScalaJS.env["exportsNamespace"])
+ ? ScalaJS.env["exportsNamespace"] : ScalaJS.g;
+ScalaJS.env["exportsNamespace"] = ScalaJS.e;
+
+// Freeze the environment info
+ScalaJS.g["Object"]["freeze"](ScalaJS.env);
+
+// Other fields
+ScalaJS.d = {}; // Data for types
+ScalaJS.c = {}; // Scala.js constructors
+ScalaJS.h = {}; // Inheritable constructors (without initialization code)
+ScalaJS.i = {}; // Implementation class modules
+ScalaJS.n = {}; // Module instances
+ScalaJS.m = {}; // Module accessors
+ScalaJS.is = {}; // isInstanceOf methods
+ScalaJS.isArrayOf = {}; // isInstanceOfArrayOf methods
+//!if asInstanceOfs != Unchecked
+ScalaJS.as = {}; // asInstanceOf methods
+ScalaJS.asArrayOf = {}; // asInstanceOfArrayOf methods
+//!endif
+ScalaJS.lastIDHash = 0; // last value attributed to an id hash code
+
+// Core mechanism
+
+ScalaJS.makeIsArrayOfPrimitive = function(primitiveData) {
+ return function(obj, depth) {
+ return !!(obj && obj.$classData &&
+ (obj.$classData.arrayDepth === depth) &&
+ (obj.$classData.arrayBase === primitiveData));
+ }
+};
+
+//!if asInstanceOfs != Unchecked
+ScalaJS.makeAsArrayOfPrimitive = function(isInstanceOfFunction, arrayEncodedName) {
+ return function(obj, depth) {
+ if (isInstanceOfFunction(obj, depth) || (obj === null))
+ return obj;
+ else
+ ScalaJS.throwArrayCastException(obj, arrayEncodedName, depth);
+ }
+};
+//!endif
+
+/** Encode a property name for runtime manipulation
+ * Usage:
+ * env.propertyName({someProp:0})
+ * Returns:
+ * "someProp"
+ * Useful when the property is renamed by a global optimizer (like Closure)
+ * but we must still get hold of a string of that name for runtime
+ * reflection.
+ */
+ScalaJS.propertyName = function(obj) {
+ var result;
+ for (var prop in obj)
+ result = prop;
+ return result;
+};
+
+// Runtime functions
+
+ScalaJS.isScalaJSObject = function(obj) {
+ return !!(obj && obj.$classData);
+};
+
+//!if asInstanceOfs != Unchecked
+ScalaJS.throwClassCastException = function(instance, classFullName) {
+//!if asInstanceOfs == Compliant
+ throw new ScalaJS.c.jl_ClassCastException().init___T(
+ instance + " is not an instance of " + classFullName);
+//!else
+ throw new ScalaJS.c.sjsr_UndefinedBehaviorError().init___jl_Throwable(
+ new ScalaJS.c.jl_ClassCastException().init___T(
+ instance + " is not an instance of " + classFullName));
+//!endif
+};
+
+ScalaJS.throwArrayCastException = function(instance, classArrayEncodedName, depth) {
+ for (; depth; --depth)
+ classArrayEncodedName = "[" + classArrayEncodedName;
+ ScalaJS.throwClassCastException(instance, classArrayEncodedName);
+};
+//!endif
+
+ScalaJS.makeNativeArrayWrapper = function(arrayClassData, nativeArray) {
+ return new arrayClassData.constr(nativeArray);
+};
+
+ScalaJS.newArrayObject = function(arrayClassData, lengths) {
+ return ScalaJS.newArrayObjectInternal(arrayClassData, lengths, 0);
+};
+
+ScalaJS.newArrayObjectInternal = function(arrayClassData, lengths, lengthIndex) {
+ var result = new arrayClassData.constr(lengths[lengthIndex]);
+
+ if (lengthIndex < lengths.length-1) {
+ var subArrayClassData = arrayClassData.componentData;
+ var subLengthIndex = lengthIndex+1;
+ var underlying = result.u;
+ for (var i = 0; i < underlying.length; i++) {
+ underlying[i] = ScalaJS.newArrayObjectInternal(
+ subArrayClassData, lengths, subLengthIndex);
+ }
+ }
+
+ return result;
+};
+
+ScalaJS.checkNonNull = function(obj) {
+ return obj !== null ? obj : ScalaJS.throwNullPointerException();
+};
+
+ScalaJS.throwNullPointerException = function() {
+ throw new ScalaJS.c.jl_NullPointerException().init___();
+};
+
+ScalaJS.objectToString = function(instance) {
+ if (instance === void 0)
+ return "undefined";
+ else
+ return instance.toString();
+};
+
+ScalaJS.objectGetClass = function(instance) {
+ switch (typeof instance) {
+ case "string":
+ return ScalaJS.d.T.getClassOf();
+ case "number":
+ var v = instance | 0;
+ if (v === instance) { // is the value integral?
+ if (ScalaJS.isByte(v))
+ return ScalaJS.d.jl_Byte.getClassOf();
+ else if (ScalaJS.isShort(v))
+ return ScalaJS.d.jl_Short.getClassOf();
+ else
+ return ScalaJS.d.jl_Integer.getClassOf();
+ } else {
+ if (ScalaJS.isFloat(instance))
+ return ScalaJS.d.jl_Float.getClassOf();
+ else
+ return ScalaJS.d.jl_Double.getClassOf();
+ }
+ case "boolean":
+ return ScalaJS.d.jl_Boolean.getClassOf();
+ case "undefined":
+ return ScalaJS.d.sr_BoxedUnit.getClassOf();
+ default:
+ if (instance === null)
+ ScalaJS.throwNullPointerException();
+ else if (ScalaJS.is.sjsr_RuntimeLong(instance))
+ return ScalaJS.d.jl_Long.getClassOf();
+ else if (ScalaJS.isScalaJSObject(instance))
+ return instance.$classData.getClassOf();
+ else
+ return null; // Exception?
+ }
+};
+
+ScalaJS.objectClone = function(instance) {
+ if (ScalaJS.isScalaJSObject(instance) || (instance === null))
+ return instance.clone__O();
+ else
+ throw new ScalaJS.c.jl_CloneNotSupportedException().init___();
+};
+
+ScalaJS.objectNotify = function(instance) {
+ // final and no-op in java.lang.Object
+ if (instance === null)
+ instance.notify__V();
+};
+
+ScalaJS.objectNotifyAll = function(instance) {
+ // final and no-op in java.lang.Object
+ if (instance === null)
+ instance.notifyAll__V();
+};
+
+ScalaJS.objectFinalize = function(instance) {
+ if (ScalaJS.isScalaJSObject(instance) || (instance === null))
+ instance.finalize__V();
+ // else no-op
+};
+
+ScalaJS.objectEquals = function(instance, rhs) {
+ if (ScalaJS.isScalaJSObject(instance) || (instance === null))
+ return instance.equals__O__Z(rhs);
+ else if (typeof instance === "number")
+ return typeof rhs === "number" && ScalaJS.numberEquals(instance, rhs);
+ else
+ return instance === rhs;
+};
+
+ScalaJS.numberEquals = function(lhs, rhs) {
+ return (
+ lhs === rhs // 0.0 === -0.0 to prioritize the Int case over the Double case
+ ) || (
+ // are they both NaN?
+ (lhs !== lhs) && (rhs !== rhs)
+ );
+};
+
+ScalaJS.objectHashCode = function(instance) {
+ switch (typeof instance) {
+ case "string":
+ return ScalaJS.m.sjsr_RuntimeString().hashCode__T__I(instance);
+ case "number":
+ return ScalaJS.m.sjsr_Bits().numberHashCode__D__I(instance);
+ case "boolean":
+ return instance ? 1231 : 1237;
+ case "undefined":
+ return 0;
+ default:
+ if (ScalaJS.isScalaJSObject(instance) || instance === null)
+ return instance.hashCode__I();
+ else
+ return 42; // TODO?
+ }
+};
+
+ScalaJS.comparableCompareTo = function(instance, rhs) {
+ switch (typeof instance) {
+ case "string":
+//!if asInstanceOfs != Unchecked
+ ScalaJS.as.T(rhs);
+//!endif
+ return instance === rhs ? 0 : (instance < rhs ? -1 : 1);
+ case "number":
+//!if asInstanceOfs != Unchecked
+ ScalaJS.as.jl_Number(rhs);
+//!endif
+ return ScalaJS.numberEquals(instance, rhs) ? 0 : (instance < rhs ? -1 : 1);
+ case "boolean":
+//!if asInstanceOfs != Unchecked
+ ScalaJS.asBoolean(rhs);
+//!endif
+ return instance - rhs; // yes, this gives the right result
+ default:
+ return instance.compareTo__O__I(rhs);
+ }
+};
+
+ScalaJS.charSequenceLength = function(instance) {
+ if (typeof(instance) === "string")
+//!if asInstanceOfs != Unchecked
+ return ScalaJS.uI(instance["length"]);
+//!else
+ return instance["length"] | 0;
+//!endif
+ else
+ return instance.length__I();
+};
+
+ScalaJS.charSequenceCharAt = function(instance, index) {
+ if (typeof(instance) === "string")
+//!if asInstanceOfs != Unchecked
+ return ScalaJS.uI(instance["charCodeAt"](index)) & 0xffff;
+//!else
+ return instance["charCodeAt"](index) & 0xffff;
+//!endif
+ else
+ return instance.charAt__I__C(index);
+};
+
+ScalaJS.charSequenceSubSequence = function(instance, start, end) {
+ if (typeof(instance) === "string")
+//!if asInstanceOfs != Unchecked
+ return ScalaJS.as.T(instance["substring"](start, end));
+//!else
+ return instance["substring"](start, end);
+//!endif
+ else
+ return instance.subSequence__I__I__jl_CharSequence(start, end);
+};
+
+ScalaJS.booleanBooleanValue = function(instance) {
+ if (typeof instance === "boolean") return instance;
+ else return instance.booleanValue__Z();
+};
+
+ScalaJS.numberByteValue = function(instance) {
+ if (typeof instance === "number") return (instance << 24) >> 24;
+ else return instance.byteValue__B();
+};
+ScalaJS.numberShortValue = function(instance) {
+ if (typeof instance === "number") return (instance << 16) >> 16;
+ else return instance.shortValue__S();
+};
+ScalaJS.numberIntValue = function(instance) {
+ if (typeof instance === "number") return instance | 0;
+ else return instance.intValue__I();
+};
+ScalaJS.numberLongValue = function(instance) {
+ if (typeof instance === "number")
+ return ScalaJS.m.sjsr_RuntimeLong().fromDouble__D__sjsr_RuntimeLong(instance);
+ else
+ return instance.longValue__J();
+};
+ScalaJS.numberFloatValue = function(instance) {
+ if (typeof instance === "number") return ScalaJS.fround(instance);
+ else return instance.floatValue__F();
+};
+ScalaJS.numberDoubleValue = function(instance) {
+ if (typeof instance === "number") return instance;
+ else return instance.doubleValue__D();
+};
+
+ScalaJS.isNaN = function(instance) {
+ return instance !== instance;
+};
+
+ScalaJS.isInfinite = function(instance) {
+ return !ScalaJS.g["isFinite"](instance) && !ScalaJS.isNaN(instance);
+};
+
+ScalaJS.propertiesOf = function(obj) {
+ var result = [];
+ for (var prop in obj)
+ result["push"](prop);
+ return result;
+};
+
+ScalaJS.systemArraycopy = function(src, srcPos, dest, destPos, length) {
+ var srcu = src.u;
+ var destu = dest.u;
+ if (srcu !== destu || destPos < srcPos || srcPos + length < destPos) {
+ for (var i = 0; i < length; i++)
+ destu[destPos+i] = srcu[srcPos+i];
+ } else {
+ for (var i = length-1; i >= 0; i--)
+ destu[destPos+i] = srcu[srcPos+i];
+ }
+};
+
+ScalaJS.systemIdentityHashCode = function(obj) {
+ if (ScalaJS.isScalaJSObject(obj)) {
+ var hash = obj["$idHashCode$0"];
+ if (hash !== void 0) {
+ return hash;
+ } else {
+ hash = (ScalaJS.lastIDHash + 1) | 0;
+ ScalaJS.lastIDHash = hash;
+ obj["$idHashCode$0"] = hash;
+ return hash;
+ }
+ } else if (obj === null) {
+ return 0;
+ } else {
+ return ScalaJS.objectHashCode(obj);
+ }
+};
+
+// is/as for hijacked boxed classes (the non-trivial ones)
+
+ScalaJS.isByte = function(v) {
+ return (v << 24 >> 24) === v;
+};
+
+ScalaJS.isShort = function(v) {
+ return (v << 16 >> 16) === v;
+};
+
+ScalaJS.isInt = function(v) {
+ return (v | 0) === v;
+};
+
+ScalaJS.isFloat = function(v) {
+ return v !== v || ScalaJS.fround(v) === v;
+};
+
+//!if asInstanceOfs != Unchecked
+ScalaJS.asUnit = function(v) {
+ if (v === void 0)
+ return v;
+ else
+ ScalaJS.throwClassCastException(v, "scala.runtime.BoxedUnit");
+};
+
+ScalaJS.asBoolean = function(v) {
+ if (typeof v === "boolean" || v === null)
+ return v;
+ else
+ ScalaJS.throwClassCastException(v, "java.lang.Boolean");
+};
+
+ScalaJS.asByte = function(v) {
+ if (ScalaJS.isByte(v) || v === null)
+ return v;
+ else
+ ScalaJS.throwClassCastException(v, "java.lang.Byte");
+};
+
+ScalaJS.asShort = function(v) {
+ if (ScalaJS.isShort(v) || v === null)
+ return v;
+ else
+ ScalaJS.throwClassCastException(v, "java.lang.Short");
+};
+
+ScalaJS.asInt = function(v) {
+ if (ScalaJS.isInt(v) || v === null)
+ return v;
+ else
+ ScalaJS.throwClassCastException(v, "java.lang.Integer");
+};
+
+ScalaJS.asFloat = function(v) {
+ if (ScalaJS.isFloat(v) || v === null)
+ return v;
+ else
+ ScalaJS.throwClassCastException(v, "java.lang.Float");
+};
+
+ScalaJS.asDouble = function(v) {
+ if (typeof v === "number" || v === null)
+ return v;
+ else
+ ScalaJS.throwClassCastException(v, "java.lang.Double");
+};
+//!endif
+
+// Unboxes
+
+//!if asInstanceOfs != Unchecked
+ScalaJS.uZ = function(value) {
+ return !!ScalaJS.asBoolean(value);
+};
+ScalaJS.uB = function(value) {
+ return ScalaJS.asByte(value) | 0;
+};
+ScalaJS.uS = function(value) {
+ return ScalaJS.asShort(value) | 0;
+};
+ScalaJS.uI = function(value) {
+ return ScalaJS.asInt(value) | 0;
+};
+ScalaJS.uJ = function(value) {
+ return null === value ? ScalaJS.m.sjsr_RuntimeLong().Zero$1
+ : ScalaJS.as.sjsr_RuntimeLong(value);
+};
+ScalaJS.uF = function(value) {
+ /* Here, it is fine to use + instead of fround, because asFloat already
+ * ensures that the result is either null or a float.
+ */
+ return +ScalaJS.asFloat(value);
+};
+ScalaJS.uD = function(value) {
+ return +ScalaJS.asDouble(value);
+};
+//!else
+ScalaJS.uJ = function(value) {
+ return null === value ? ScalaJS.m.sjsr_RuntimeLong().Zero$1 : value;
+};
+//!endif
+
+// TypeArray conversions
+
+ScalaJS.byteArray2TypedArray = function(value) { return new Int8Array(value.u); };
+ScalaJS.shortArray2TypedArray = function(value) { return new Int16Array(value.u); };
+ScalaJS.charArray2TypedArray = function(value) { return new Uint16Array(value.u); };
+ScalaJS.intArray2TypedArray = function(value) { return new Int32Array(value.u); };
+ScalaJS.floatArray2TypedArray = function(value) { return new Float32Array(value.u); };
+ScalaJS.doubleArray2TypedArray = function(value) { return new Float64Array(value.u); };
+
+ScalaJS.typedArray2ByteArray = function(value) {
+ var arrayClassData = ScalaJS.d.B.getArrayOf();
+ return new arrayClassData.constr(new Int8Array(value));
+};
+ScalaJS.typedArray2ShortArray = function(value) {
+ var arrayClassData = ScalaJS.d.S.getArrayOf();
+ return new arrayClassData.constr(new Int16Array(value));
+};
+ScalaJS.typedArray2CharArray = function(value) {
+ var arrayClassData = ScalaJS.d.C.getArrayOf();
+ return new arrayClassData.constr(new Uint16Array(value));
+};
+ScalaJS.typedArray2IntArray = function(value) {
+ var arrayClassData = ScalaJS.d.I.getArrayOf();
+ return new arrayClassData.constr(new Int32Array(value));
+};
+ScalaJS.typedArray2FloatArray = function(value) {
+ var arrayClassData = ScalaJS.d.F.getArrayOf();
+ return new arrayClassData.constr(new Float32Array(value));
+};
+ScalaJS.typedArray2DoubleArray = function(value) {
+ var arrayClassData = ScalaJS.d.D.getArrayOf();
+ return new arrayClassData.constr(new Float64Array(value));
+};
+
+/* We have to force a non-elidable *read* of ScalaJS.e, otherwise Closure will
+ * eliminate it altogether, along with all the exports, which is ... er ...
+ * plain wrong.
+ */
+this["__ScalaJSExportsNamespace"] = ScalaJS.e;
+
+// Type data constructors
+
+/** @constructor */
+ScalaJS.PrimitiveTypeData = function(zero, arrayEncodedName, displayName) {
+ // Runtime support
+ this.constr = undefined;
+ this.parentData = undefined;
+ this.ancestors = {};
+ this.componentData = null;
+ this.zero = zero;
+ this.arrayEncodedName = arrayEncodedName;
+ this._classOf = undefined;
+ this._arrayOf = undefined;
+ this.isArrayOf = function(obj, depth) { return false; };
+
+ // java.lang.Class support
+ this["name"] = displayName;
+ this["isPrimitive"] = true;
+ this["isInterface"] = false;
+ this["isArrayClass"] = false;
+ this["isInstance"] = function(obj) { return false; };
+};
+
+/** @constructor */
+ScalaJS.ClassTypeData = function(internalNameObj, isInterface, fullName,
+ parentData, ancestors, isInstance, isArrayOf) {
+ var internalName = ScalaJS.propertyName(internalNameObj);
+
+ isInstance = isInstance || function(obj) {
+ return !!(obj && obj.$classData && obj.$classData.ancestors[internalName]);
+ };
+
+ isArrayOf = isArrayOf || function(obj, depth) {
+ return !!(obj && obj.$classData && (obj.$classData.arrayDepth === depth)
+ && obj.$classData.arrayBase.ancestors[internalName])
+ };
+
+ // Runtime support
+ this.constr = undefined;
+ this.parentData = parentData;
+ this.ancestors = ancestors;
+ this.componentData = null;
+ this.zero = null;
+ this.arrayEncodedName = "L"+fullName+";";
+ this._classOf = undefined;
+ this._arrayOf = undefined;
+ this.isArrayOf = isArrayOf;
+
+ // java.lang.Class support
+ this["name"] = fullName;
+ this["isPrimitive"] = false;
+ this["isInterface"] = isInterface;
+ this["isArrayClass"] = false;
+ this["isInstance"] = isInstance;
+};
+
+/** @constructor */
+ScalaJS.ArrayTypeData = function(componentData) {
+ // The constructor
+
+ var componentZero = componentData.zero;
+
+ // The zero for the Long runtime representation
+ // is a special case here, since the class has not
+ // been defined yet, when this file is read
+ if (componentZero == "longZero")
+ componentZero = ScalaJS.m.sjsr_RuntimeLong().Zero$1;
+
+ /** @constructor */
+ var ArrayClass = function(arg) {
+ if (typeof(arg) === "number") {
+ // arg is the length of the array
+ this.u = new Array(arg);
+ for (var i = 0; i < arg; i++)
+ this.u[i] = componentZero;
+ } else {
+ // arg is a native array that we wrap
+ this.u = arg;
+ }
+ }
+ ArrayClass.prototype = new ScalaJS.h.O;
+ ArrayClass.prototype.constructor = ArrayClass;
+ ArrayClass.prototype.$classData = this;
+
+ ArrayClass.prototype.clone__O = function() {
+ if (this.u instanceof Array)
+ return new ArrayClass(this.u["slice"](0));
+ else
+ // The underlying Array is a TypedArray
+ return new ArrayClass(this.u.constructor(this.u));
+ };
+
+ // Don't generate reflective call proxies. The compiler special cases
+ // reflective calls to methods on scala.Array
+
+ // The data
+
+ var encodedName = "[" + componentData.arrayEncodedName;
+ var componentBase = componentData.arrayBase || componentData;
+ var componentDepth = componentData.arrayDepth || 0;
+ var arrayDepth = componentDepth + 1;
+
+ var isInstance = function(obj) {
+ return componentBase.isArrayOf(obj, arrayDepth);
+ }
+
+ // Runtime support
+ this.constr = ArrayClass;
+ this.parentData = ScalaJS.d.O;
+ this.ancestors = {O: 1};
+ this.componentData = componentData;
+ this.arrayBase = componentBase;
+ this.arrayDepth = arrayDepth;
+ this.zero = null;
+ this.arrayEncodedName = encodedName;
+ this._classOf = undefined;
+ this._arrayOf = undefined;
+ this.isArrayOf = undefined;
+
+ // java.lang.Class support
+ this["name"] = encodedName;
+ this["isPrimitive"] = false;
+ this["isInterface"] = false;
+ this["isArrayClass"] = true;
+ this["isInstance"] = isInstance;
+};
+
+ScalaJS.ClassTypeData.prototype.getClassOf = function() {
+ if (!this._classOf)
+ this._classOf = new ScalaJS.c.jl_Class().init___jl_ScalaJSClassData(this);
+ return this._classOf;
+};
+
+ScalaJS.ClassTypeData.prototype.getArrayOf = function() {
+ if (!this._arrayOf)
+ this._arrayOf = new ScalaJS.ArrayTypeData(this);
+ return this._arrayOf;
+};
+
+// java.lang.Class support
+
+ScalaJS.ClassTypeData.prototype["getFakeInstance"] = function() {
+ if (this === ScalaJS.d.T)
+ return "some string";
+ else if (this === ScalaJS.d.jl_Boolean)
+ return false;
+ else if (this === ScalaJS.d.jl_Byte ||
+ this === ScalaJS.d.jl_Short ||
+ this === ScalaJS.d.jl_Integer ||
+ this === ScalaJS.d.jl_Float ||
+ this === ScalaJS.d.jl_Double)
+ return 0;
+ else if (this === ScalaJS.d.jl_Long)
+ return ScalaJS.m.sjsr_RuntimeLong().Zero$1;
+ else if (this === ScalaJS.d.sr_BoxedUnit)
+ return void 0;
+ else
+ return {$classData: this};
+};
+
+ScalaJS.ClassTypeData.prototype["getSuperclass"] = function() {
+ return this.parentData ? this.parentData.getClassOf() : null;
+};
+
+ScalaJS.ClassTypeData.prototype["getComponentType"] = function() {
+ return this.componentData ? this.componentData.getClassOf() : null;
+};
+
+ScalaJS.ClassTypeData.prototype["newArrayOfThisClass"] = function(lengths) {
+ var arrayClassData = this;
+ for (var i = 0; i < lengths.length; i++)
+ arrayClassData = arrayClassData.getArrayOf();
+ return ScalaJS.newArrayObject(arrayClassData, lengths);
+};
+
+ScalaJS.PrimitiveTypeData.prototype = ScalaJS.ClassTypeData.prototype;
+ScalaJS.ArrayTypeData.prototype = ScalaJS.ClassTypeData.prototype;
+
+// Create primitive types
+
+ScalaJS.d.V = new ScalaJS.PrimitiveTypeData(undefined, "V", "void");
+ScalaJS.d.Z = new ScalaJS.PrimitiveTypeData(false, "Z", "boolean");
+ScalaJS.d.C = new ScalaJS.PrimitiveTypeData(0, "C", "char");
+ScalaJS.d.B = new ScalaJS.PrimitiveTypeData(0, "B", "byte");
+ScalaJS.d.S = new ScalaJS.PrimitiveTypeData(0, "S", "short");
+ScalaJS.d.I = new ScalaJS.PrimitiveTypeData(0, "I", "int");
+ScalaJS.d.J = new ScalaJS.PrimitiveTypeData("longZero", "J", "long");
+ScalaJS.d.F = new ScalaJS.PrimitiveTypeData(0.0, "F", "float");
+ScalaJS.d.D = new ScalaJS.PrimitiveTypeData(0.0, "D", "double");
+
+// Instance tests for array of primitives
+
+ScalaJS.isArrayOf.Z = ScalaJS.makeIsArrayOfPrimitive(ScalaJS.d.Z);
+ScalaJS.d.Z.isArrayOf = ScalaJS.isArrayOf.Z;
+
+ScalaJS.isArrayOf.C = ScalaJS.makeIsArrayOfPrimitive(ScalaJS.d.C);
+ScalaJS.d.C.isArrayOf = ScalaJS.isArrayOf.C;
+
+ScalaJS.isArrayOf.B = ScalaJS.makeIsArrayOfPrimitive(ScalaJS.d.B);
+ScalaJS.d.B.isArrayOf = ScalaJS.isArrayOf.B;
+
+ScalaJS.isArrayOf.S = ScalaJS.makeIsArrayOfPrimitive(ScalaJS.d.S);
+ScalaJS.d.S.isArrayOf = ScalaJS.isArrayOf.S;
+
+ScalaJS.isArrayOf.I = ScalaJS.makeIsArrayOfPrimitive(ScalaJS.d.I);
+ScalaJS.d.I.isArrayOf = ScalaJS.isArrayOf.I;
+
+ScalaJS.isArrayOf.J = ScalaJS.makeIsArrayOfPrimitive(ScalaJS.d.J);
+ScalaJS.d.J.isArrayOf = ScalaJS.isArrayOf.J;
+
+ScalaJS.isArrayOf.F = ScalaJS.makeIsArrayOfPrimitive(ScalaJS.d.F);
+ScalaJS.d.F.isArrayOf = ScalaJS.isArrayOf.F;
+
+ScalaJS.isArrayOf.D = ScalaJS.makeIsArrayOfPrimitive(ScalaJS.d.D);
+ScalaJS.d.D.isArrayOf = ScalaJS.isArrayOf.D;
+
+//!if asInstanceOfs != Unchecked
+// asInstanceOfs for array of primitives
+ScalaJS.asArrayOf.Z = ScalaJS.makeAsArrayOfPrimitive(ScalaJS.isArrayOf.Z, "Z");
+ScalaJS.asArrayOf.C = ScalaJS.makeAsArrayOfPrimitive(ScalaJS.isArrayOf.C, "C");
+ScalaJS.asArrayOf.B = ScalaJS.makeAsArrayOfPrimitive(ScalaJS.isArrayOf.B, "B");
+ScalaJS.asArrayOf.S = ScalaJS.makeAsArrayOfPrimitive(ScalaJS.isArrayOf.S, "S");
+ScalaJS.asArrayOf.I = ScalaJS.makeAsArrayOfPrimitive(ScalaJS.isArrayOf.I, "I");
+ScalaJS.asArrayOf.J = ScalaJS.makeAsArrayOfPrimitive(ScalaJS.isArrayOf.J, "J");
+ScalaJS.asArrayOf.F = ScalaJS.makeAsArrayOfPrimitive(ScalaJS.isArrayOf.F, "F");
+ScalaJS.asArrayOf.D = ScalaJS.makeAsArrayOfPrimitive(ScalaJS.isArrayOf.D, "D");
+//!endif
+
+// Polyfills
+
+ScalaJS.imul = ScalaJS.g["Math"]["imul"] || (function(a, b) {
+ // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/imul
+ var ah = (a >>> 16) & 0xffff;
+ var al = a & 0xffff;
+ var bh = (b >>> 16) & 0xffff;
+ var bl = b & 0xffff;
+ // the shift by 0 fixes the sign on the high part
+ // the final |0 converts the unsigned value into a signed value
+ return ((al * bl) + (((ah * bl + al * bh) << 16) >>> 0) | 0);
+});
+
+ScalaJS.fround = ScalaJS.g["Math"]["fround"] ||
+//!if floats == Strict
+ (ScalaJS.g["Float32Array"] ? (function(v) {
+ var array = new ScalaJS.g["Float32Array"](1);
+ array[0] = v;
+ return array[0];
+ }) : (function(v) {
+ return ScalaJS.m.sjsr_package().froundPolyfill__D__D(+v);
+ }));
+//!else
+ (function(v) {
+ return +v;
+ });
+//!endif