Spaces:
Running
Running
| /* Smalltalk from Squeak4.5 with VMMaker 4.13.6 translated as JS source on 3 November 2014 1:52:20 pm */ | |
| /* Automatically generated by | |
| JSPluginCodeGenerator VMMakerJS-bf.15 uuid: fd4e10f2-3773-4e80-8bb5-c4b471a014e5 | |
| from | |
| FloatArrayPlugin VMMaker-bf.353 uuid: 8ae25e7e-8d2c-451e-8277-598b30e9c002 | |
| */ | |
| (function FloatArrayPlugin() { | |
| ; | |
| var VM_PROXY_MAJOR = 1; | |
| var VM_PROXY_MINOR = 11; | |
| /*** Functions ***/ | |
| function CLASSOF(obj) { return typeof obj === "number" ? interpreterProxy.classSmallInteger() : obj.sqClass } | |
| function SIZEOF(obj) { return obj.pointers ? obj.pointers.length : obj.words ? obj.words.length : obj.bytes ? obj.bytes.length : 0 } | |
| function BYTESIZEOF(obj) { return obj.bytes ? obj.bytes.length : obj.words ? obj.words.length * 4 : 0 } | |
| function DIV(a, b) { return Math.floor(a / b) | 0; } // integer division | |
| function MOD(a, b) { return a - DIV(a, b) * b | 0; } // signed modulus | |
| function SHL(a, b) { return b > 31 ? 0 : a << b; } // fix JS shift | |
| function SHR(a, b) { return b > 31 ? 0 : a >>> b; } // fix JS shift | |
| function SHIFT(a, b) { return b < 0 ? (b < -31 ? 0 : a >>> (0-b) ) : (b > 31 ? 0 : a << b); } | |
| /*** Variables ***/ | |
| var interpreterProxy = null; | |
| var moduleName = "FloatArrayPlugin 3 November 2014 (e)"; | |
| /* Note: This is hardcoded so it can be run from Squeak. | |
| The module name is used for validating a module *after* | |
| it is loaded to check if it does really contain the module | |
| we're thinking it contains. This is important! */ | |
| function getModuleName() { | |
| return moduleName; | |
| } | |
| function halt() { | |
| ; | |
| } | |
| /* Primitive. Add the receiver and the argument, both FloatArrays and store the result into the receiver. */ | |
| function primitiveAddFloatArray() { | |
| var arg; | |
| var argPtr; | |
| var i; | |
| var length; | |
| var rcvr; | |
| var rcvrPtr; | |
| arg = interpreterProxy.stackObjectValue(0); | |
| rcvr = interpreterProxy.stackObjectValue(1); | |
| if (interpreterProxy.failed()) { | |
| return null; | |
| } | |
| interpreterProxy.success(interpreterProxy.isWords(arg)); | |
| interpreterProxy.success(interpreterProxy.isWords(rcvr)); | |
| if (interpreterProxy.failed()) { | |
| return null; | |
| } | |
| length = SIZEOF(arg); | |
| interpreterProxy.success(length === SIZEOF(rcvr)); | |
| if (interpreterProxy.failed()) { | |
| return null; | |
| } | |
| rcvrPtr = rcvr.wordsAsFloat32Array(); | |
| argPtr = arg.wordsAsFloat32Array(); | |
| for (i = 0; i <= (length - 1); i++) { | |
| rcvrPtr[i] = (rcvrPtr[i] + argPtr[i]); | |
| } | |
| interpreterProxy.pop(1); | |
| } | |
| /* Primitive. Add the argument, a scalar value to the receiver, a FloatArray */ | |
| function primitiveAddScalar() { | |
| var i; | |
| var length; | |
| var rcvr; | |
| var rcvrPtr; | |
| var value; | |
| value = interpreterProxy.stackFloatValue(0); | |
| rcvr = interpreterProxy.stackObjectValue(1); | |
| if (interpreterProxy.failed()) { | |
| return null; | |
| } | |
| interpreterProxy.success(interpreterProxy.isWords(rcvr)); | |
| if (interpreterProxy.failed()) { | |
| return null; | |
| } | |
| length = SIZEOF(rcvr); | |
| rcvrPtr = rcvr.wordsAsFloat32Array(); | |
| for (i = 0; i <= (length - 1); i++) { | |
| rcvrPtr[i] = (rcvrPtr[i] + value); | |
| } | |
| interpreterProxy.pop(1); | |
| } | |
| function primitiveAt() { | |
| var floatPtr; | |
| var floatValue; | |
| var index; | |
| var rcvr; | |
| index = interpreterProxy.stackIntegerValue(0); | |
| rcvr = interpreterProxy.stackObjectValue(1); | |
| if (interpreterProxy.failed()) { | |
| return null; | |
| } | |
| interpreterProxy.success(interpreterProxy.isWords(rcvr)); | |
| interpreterProxy.success((index > 0) && (index <= SIZEOF(rcvr))); | |
| if (interpreterProxy.failed()) { | |
| return null; | |
| } | |
| floatPtr = rcvr.wordsAsFloat32Array(); | |
| floatValue = floatPtr[index - 1]; | |
| interpreterProxy.pop(2); | |
| interpreterProxy.pushFloat(floatValue); | |
| } | |
| function primitiveAtPut() { | |
| var floatPtr; | |
| var floatValue; | |
| var index; | |
| var rcvr; | |
| var value; | |
| value = interpreterProxy.stackValue(0); | |
| if (typeof value === "number") { | |
| floatValue = value; | |
| } else { | |
| floatValue = interpreterProxy.floatValueOf(value); | |
| } | |
| index = interpreterProxy.stackIntegerValue(1); | |
| rcvr = interpreterProxy.stackObjectValue(2); | |
| if (interpreterProxy.failed()) { | |
| return null; | |
| } | |
| interpreterProxy.success(interpreterProxy.isWords(rcvr)); | |
| interpreterProxy.success((index > 0) && (index <= SIZEOF(rcvr))); | |
| if (interpreterProxy.failed()) { | |
| return null; | |
| } | |
| floatPtr = rcvr.wordsAsFloat32Array(); | |
| floatPtr[index - 1] = floatValue; | |
| if (!interpreterProxy.failed()) { | |
| interpreterProxy.popthenPush(3, value); | |
| } | |
| } | |
| /* Primitive. Add the receiver and the argument, both FloatArrays and store the result into the receiver. */ | |
| function primitiveDivFloatArray() { | |
| var arg; | |
| var argPtr; | |
| var i; | |
| var length; | |
| var rcvr; | |
| var rcvrPtr; | |
| arg = interpreterProxy.stackObjectValue(0); | |
| rcvr = interpreterProxy.stackObjectValue(1); | |
| if (interpreterProxy.failed()) { | |
| return null; | |
| } | |
| interpreterProxy.success(interpreterProxy.isWords(arg)); | |
| interpreterProxy.success(interpreterProxy.isWords(rcvr)); | |
| if (interpreterProxy.failed()) { | |
| return null; | |
| } | |
| length = SIZEOF(arg); | |
| interpreterProxy.success(length === SIZEOF(rcvr)); | |
| if (interpreterProxy.failed()) { | |
| return null; | |
| } | |
| rcvrPtr = rcvr.wordsAsFloat32Array(); | |
| /* Check if any of the argument's values is zero */ | |
| argPtr = arg.wordsAsFloat32Array(); | |
| for (i = 0; i <= (length - 1); i++) { | |
| if (argPtr[i] === 0) { | |
| return interpreterProxy.primitiveFail(); | |
| } | |
| } | |
| for (i = 0; i <= (length - 1); i++) { | |
| rcvrPtr[i] = (rcvrPtr[i] / argPtr[i]); | |
| } | |
| interpreterProxy.pop(1); | |
| } | |
| /* Primitive. Add the argument, a scalar value to the receiver, a FloatArray */ | |
| function primitiveDivScalar() { | |
| var i; | |
| var inverse; | |
| var length; | |
| var rcvr; | |
| var rcvrPtr; | |
| var value; | |
| value = interpreterProxy.stackFloatValue(0); | |
| rcvr = interpreterProxy.stackObjectValue(1); | |
| if (interpreterProxy.failed()) { | |
| return null; | |
| } | |
| if (value === 0.0) { | |
| return interpreterProxy.primitiveFail(); | |
| } | |
| interpreterProxy.success(interpreterProxy.isWords(rcvr)); | |
| if (interpreterProxy.failed()) { | |
| return null; | |
| } | |
| length = SIZEOF(rcvr); | |
| rcvrPtr = rcvr.wordsAsFloat32Array(); | |
| inverse = 1.0 / value; | |
| for (i = 0; i <= (length - 1); i++) { | |
| rcvrPtr[i] = (rcvrPtr[i] * inverse); | |
| } | |
| interpreterProxy.pop(1); | |
| } | |
| /* Primitive. Compute the dot product of the receiver and the argument. | |
| The dot product is defined as the sum of the products of the individual elements. */ | |
| function primitiveDotProduct() { | |
| var arg; | |
| var argPtr; | |
| var i; | |
| var length; | |
| var rcvr; | |
| var rcvrPtr; | |
| var result; | |
| arg = interpreterProxy.stackObjectValue(0); | |
| rcvr = interpreterProxy.stackObjectValue(1); | |
| if (interpreterProxy.failed()) { | |
| return null; | |
| } | |
| interpreterProxy.success(interpreterProxy.isWords(arg)); | |
| interpreterProxy.success(interpreterProxy.isWords(rcvr)); | |
| if (interpreterProxy.failed()) { | |
| return null; | |
| } | |
| length = SIZEOF(arg); | |
| interpreterProxy.success(length === SIZEOF(rcvr)); | |
| if (interpreterProxy.failed()) { | |
| return null; | |
| } | |
| rcvrPtr = rcvr.wordsAsFloat32Array(); | |
| argPtr = arg.wordsAsFloat32Array(); | |
| result = 0.0; | |
| for (i = 0; i <= (length - 1); i++) { | |
| result += rcvrPtr[i] * argPtr[i]; | |
| } | |
| interpreterProxy.pop(2); | |
| interpreterProxy.pushFloat(result); | |
| } | |
| function primitiveEqual() { | |
| var arg; | |
| var argPtr; | |
| var i; | |
| var length; | |
| var rcvr; | |
| var rcvrPtr; | |
| arg = interpreterProxy.stackObjectValue(0); | |
| rcvr = interpreterProxy.stackObjectValue(1); | |
| if (interpreterProxy.failed()) { | |
| return null; | |
| } | |
| interpreterProxy.success(interpreterProxy.isWords(arg)); | |
| interpreterProxy.success(interpreterProxy.isWords(rcvr)); | |
| if (interpreterProxy.failed()) { | |
| return null; | |
| } | |
| interpreterProxy.pop(2); | |
| length = SIZEOF(arg); | |
| if (length !== SIZEOF(rcvr)) { | |
| return interpreterProxy.pushBool(false); | |
| } | |
| rcvrPtr = rcvr.wordsAsFloat32Array(); | |
| argPtr = arg.wordsAsFloat32Array(); | |
| for (i = 0; i <= (length - 1); i++) { | |
| if (rcvrPtr[i] !== argPtr[i]) { | |
| return interpreterProxy.pushBool(false); | |
| } | |
| } | |
| return interpreterProxy.pushBool(true); | |
| } | |
| function primitiveHashArray() { | |
| var i; | |
| var length; | |
| var rcvr; | |
| var rcvrPtr; | |
| var result; | |
| rcvr = interpreterProxy.stackObjectValue(0); | |
| if (interpreterProxy.failed()) { | |
| return null; | |
| } | |
| interpreterProxy.success(interpreterProxy.isWords(rcvr)); | |
| if (interpreterProxy.failed()) { | |
| return null; | |
| } | |
| length = SIZEOF(rcvr); | |
| rcvrPtr = rcvr.wordsAsInt32Array(); | |
| result = 0; | |
| for (i = 0; i <= (length - 1); i++) { | |
| result += rcvrPtr[i]; | |
| } | |
| interpreterProxy.pop(1); | |
| return interpreterProxy.pushInteger(result & 536870911); | |
| } | |
| /* Primitive. Compute the length of the argument (sqrt of sum of component squares). */ | |
| function primitiveLength() { | |
| var i; | |
| var length; | |
| var rcvr; | |
| var rcvrPtr; | |
| var result; | |
| rcvr = interpreterProxy.stackObjectValue(0); | |
| if (interpreterProxy.failed()) { | |
| return null; | |
| } | |
| interpreterProxy.success(interpreterProxy.isWords(rcvr)); | |
| if (interpreterProxy.failed()) { | |
| return null; | |
| } | |
| length = SIZEOF(rcvr); | |
| interpreterProxy.success(true); | |
| rcvrPtr = rcvr.wordsAsFloat32Array(); | |
| result = 0.0; | |
| for (i = 0; i <= (length - 1); i++) { | |
| result += rcvrPtr[i] * rcvrPtr[i]; | |
| } | |
| result = Math.sqrt(result); | |
| interpreterProxy.popthenPush(1, interpreterProxy.floatObjectOf(result)); | |
| } | |
| /* Primitive. Add the receiver and the argument, both FloatArrays and store the result into the receiver. */ | |
| function primitiveMulFloatArray() { | |
| var arg; | |
| var argPtr; | |
| var i; | |
| var length; | |
| var rcvr; | |
| var rcvrPtr; | |
| arg = interpreterProxy.stackObjectValue(0); | |
| rcvr = interpreterProxy.stackObjectValue(1); | |
| if (interpreterProxy.failed()) { | |
| return null; | |
| } | |
| interpreterProxy.success(interpreterProxy.isWords(arg)); | |
| interpreterProxy.success(interpreterProxy.isWords(rcvr)); | |
| if (interpreterProxy.failed()) { | |
| return null; | |
| } | |
| length = SIZEOF(arg); | |
| interpreterProxy.success(length === SIZEOF(rcvr)); | |
| if (interpreterProxy.failed()) { | |
| return null; | |
| } | |
| rcvrPtr = rcvr.wordsAsFloat32Array(); | |
| argPtr = arg.wordsAsFloat32Array(); | |
| for (i = 0; i <= (length - 1); i++) { | |
| rcvrPtr[i] = (rcvrPtr[i] * argPtr[i]); | |
| } | |
| interpreterProxy.pop(1); | |
| } | |
| /* Primitive. Add the argument, a scalar value to the receiver, a FloatArray */ | |
| function primitiveMulScalar() { | |
| var i; | |
| var length; | |
| var rcvr; | |
| var rcvrPtr; | |
| var value; | |
| value = interpreterProxy.stackFloatValue(0); | |
| rcvr = interpreterProxy.stackObjectValue(1); | |
| if (interpreterProxy.failed()) { | |
| return null; | |
| } | |
| interpreterProxy.success(interpreterProxy.isWords(rcvr)); | |
| if (interpreterProxy.failed()) { | |
| return null; | |
| } | |
| length = SIZEOF(rcvr); | |
| rcvrPtr = rcvr.wordsAsFloat32Array(); | |
| for (i = 0; i <= (length - 1); i++) { | |
| rcvrPtr[i] = (rcvrPtr[i] * value); | |
| } | |
| interpreterProxy.pop(1); | |
| } | |
| /* Primitive. Normalize the argument (A FloatArray) in place. */ | |
| function primitiveNormalize() { | |
| var i; | |
| var len; | |
| var length; | |
| var rcvr; | |
| var rcvrPtr; | |
| rcvr = interpreterProxy.stackObjectValue(0); | |
| if (interpreterProxy.failed()) { | |
| return null; | |
| } | |
| interpreterProxy.success(interpreterProxy.isWords(rcvr)); | |
| if (interpreterProxy.failed()) { | |
| return null; | |
| } | |
| length = SIZEOF(rcvr); | |
| interpreterProxy.success(true); | |
| rcvrPtr = rcvr.wordsAsFloat32Array(); | |
| len = 0.0; | |
| for (i = 0; i <= (length - 1); i++) { | |
| len += rcvrPtr[i] * rcvrPtr[i]; | |
| } | |
| interpreterProxy.success(len > 0.0); | |
| if (interpreterProxy.failed()) { | |
| return null; | |
| } | |
| len = Math.sqrt(len); | |
| for (i = 0; i <= (length - 1); i++) { | |
| rcvrPtr[i] = (rcvrPtr[i] / len); | |
| } | |
| } | |
| /* Primitive. Add the receiver and the argument, both FloatArrays and store the result into the receiver. */ | |
| function primitiveSubFloatArray() { | |
| var arg; | |
| var argPtr; | |
| var i; | |
| var length; | |
| var rcvr; | |
| var rcvrPtr; | |
| arg = interpreterProxy.stackObjectValue(0); | |
| rcvr = interpreterProxy.stackObjectValue(1); | |
| if (interpreterProxy.failed()) { | |
| return null; | |
| } | |
| interpreterProxy.success(interpreterProxy.isWords(arg)); | |
| interpreterProxy.success(interpreterProxy.isWords(rcvr)); | |
| if (interpreterProxy.failed()) { | |
| return null; | |
| } | |
| length = SIZEOF(arg); | |
| interpreterProxy.success(length === SIZEOF(rcvr)); | |
| if (interpreterProxy.failed()) { | |
| return null; | |
| } | |
| rcvrPtr = rcvr.wordsAsFloat32Array(); | |
| argPtr = arg.wordsAsFloat32Array(); | |
| for (i = 0; i <= (length - 1); i++) { | |
| rcvrPtr[i] = (rcvrPtr[i] - argPtr[i]); | |
| } | |
| interpreterProxy.pop(1); | |
| } | |
| /* Primitive. Add the argument, a scalar value to the receiver, a FloatArray */ | |
| function primitiveSubScalar() { | |
| var i; | |
| var length; | |
| var rcvr; | |
| var rcvrPtr; | |
| var value; | |
| value = interpreterProxy.stackFloatValue(0); | |
| rcvr = interpreterProxy.stackObjectValue(1); | |
| if (interpreterProxy.failed()) { | |
| return null; | |
| } | |
| interpreterProxy.success(interpreterProxy.isWords(rcvr)); | |
| if (interpreterProxy.failed()) { | |
| return null; | |
| } | |
| length = SIZEOF(rcvr); | |
| rcvrPtr = rcvr.wordsAsFloat32Array(); | |
| for (i = 0; i <= (length - 1); i++) { | |
| rcvrPtr[i] = (rcvrPtr[i] - value); | |
| } | |
| interpreterProxy.pop(1); | |
| } | |
| /* Primitive. Find the sum of each float in the receiver, a FloatArray, and stash the result into the argument Float. */ | |
| function primitiveSum() { | |
| var i; | |
| var length; | |
| var rcvr; | |
| var rcvrPtr; | |
| var sum; | |
| rcvr = interpreterProxy.stackObjectValue(0); | |
| if (interpreterProxy.failed()) { | |
| return null; | |
| } | |
| interpreterProxy.success(interpreterProxy.isWords(rcvr)); | |
| if (interpreterProxy.failed()) { | |
| return null; | |
| } | |
| length = SIZEOF(rcvr); | |
| rcvrPtr = rcvr.wordsAsFloat32Array(); | |
| sum = 0.0; | |
| for (i = 0; i <= (length - 1); i++) { | |
| sum += rcvrPtr[i]; | |
| } | |
| interpreterProxy.popthenPush(1, interpreterProxy.floatObjectOf(sum)); | |
| } | |
| /* Note: This is coded so that is can be run from Squeak. */ | |
| function setInterpreter(anInterpreter) { | |
| var ok; | |
| interpreterProxy = anInterpreter; | |
| ok = interpreterProxy.majorVersion() == VM_PROXY_MAJOR; | |
| if (ok === false) { | |
| return false; | |
| } | |
| ok = interpreterProxy.minorVersion() >= VM_PROXY_MINOR; | |
| return ok; | |
| } | |
| function registerPlugin() { | |
| if (typeof Squeak === "object" && Squeak.registerExternalModule) { | |
| Squeak.registerExternalModule("FloatArrayPlugin", { | |
| primitiveMulFloatArray: primitiveMulFloatArray, | |
| primitiveEqual: primitiveEqual, | |
| primitiveAtPut: primitiveAtPut, | |
| primitiveAt: primitiveAt, | |
| primitiveNormalize: primitiveNormalize, | |
| primitiveSubFloatArray: primitiveSubFloatArray, | |
| primitiveDivFloatArray: primitiveDivFloatArray, | |
| primitiveAddScalar: primitiveAddScalar, | |
| primitiveDotProduct: primitiveDotProduct, | |
| primitiveSubScalar: primitiveSubScalar, | |
| setInterpreter: setInterpreter, | |
| primitiveSum: primitiveSum, | |
| getModuleName: getModuleName, | |
| primitiveHashArray: primitiveHashArray, | |
| primitiveMulScalar: primitiveMulScalar, | |
| primitiveLength: primitiveLength, | |
| primitiveAddFloatArray: primitiveAddFloatArray, | |
| primitiveDivScalar: primitiveDivScalar, | |
| }); | |
| } else self.setTimeout(registerPlugin, 100); | |
| } | |
| registerPlugin(); | |
| })(); // Register module/plugin | |