Skip to content

Instantly share code, notes, and snippets.

@pnkfelix
Created April 18, 2013 21:35
Show Gist options
  • Save pnkfelix/5416420 to your computer and use it in GitHub Desktop.
Save pnkfelix/5416420 to your computer and use it in GitHub Desktop.
diff --git a/js/src/builtin/ParallelArray.js b/js/src/builtin/ParallelArray.js
index da5402e..fdec070 100644
--- a/js/src/builtin/ParallelArray.js
+++ b/js/src/builtin/ParallelArray.js
@@ -1399,13 +1399,14 @@ function ParallelMatrixConstructFromGrainFunctionMode(arg0, arg1, arg2, arg3) {
case 1:
computefunc = isLeaf ? fill1_leaf : fill1_subm;
break;
-
+/*
case 2:
computefunc = isLeaf ? fill2_leaf : fill2_subm;
break;
case 3:
computefunc = isLeaf ? fill3_leaf : fill3_subm;
break;
+*/
default:
computefunc = isLeaf ? fillN_leaf : fillN_subm;
@@ -1543,8 +1544,16 @@ function ParallelMatrixConstructFromGrainFunctionMode(arg0, arg1, arg2, arg3) {
function fillN_leaf(indexStart, indexEnd) {
var frame_indices = ComputeIndices(frame, indexStart);
for (i = indexStart; i < indexEnd; i++) {
+ var used_outptr = false;
+ function set(v) { UnsafeSetElement(buffer, i, val); used_outptr = true; }
+ var outptr = {};
+ outptr.set = set;
+ frame_indices.push(outptr);
var val = func.apply(null, frame_indices);
- UnsafeSetElement(buffer, i, val);
+ if (!used_outptr) {
+ UnsafeSetElement(buffer, i, val);
+ }
+ frame_indices.pop();
StepIndices(frame, frame_indices);
}
}
@@ -1557,10 +1566,37 @@ function ParallelMatrixConstructFromGrainFunctionMode(arg0, arg1, arg2, arg3) {
// FIXME: Something seems off about handling of i, indexStart, bufoffset...
for (i = indexStart; i < indexEnd; i++, bufoffset += grainLen) {
+ var used_outptr = false;
+
+ function set() {
+ var v = arguments.pop();
+ var offset = 0;
+ if (arguments.length > grain.length) {
+ ThrowError(JSMSG_PAR_ARRAY_BAD_ARG, ": too many args to outptr.set");
+ }
+ if (arguments.length < grain.length) {
+ ThrowError(JSMSG_PAR_ARRAY_BAD_ARG, ": outptr.set curry not yet unsupported");
+ }
+ for (var i = 0; i < grain.length; i++) {
+ var arg_i = arguments[i];
+ if (arg_i >= grain[i]) {
+ ThrowError(JSMSG_PAR_ARRAY_BAD_ARG, ": outptr.set index too large");
+ }
+ offset += arg_i * arguments.slice(i+1).reduce((a,b) => a*b);
+ }
+ UnsafeSetElement(buffer, bufoffset + offset, v);
+ used_outptr = true;
+ }
+ var outptr = {};
+ outptr.set = set;
+ frame_indices.push(outptr);
var subarray = func.apply(null, frame_indices);
+ frame_indices.pop();
var [subbuffer, suboffset] =
IdentifySubbufferAndSuboffset(subarray);
- CopyFromSubbuffer(buffer, bufoffset, subbuffer, suboffset);
+ if (!used_outptr) {
+ CopyFromSubbuffer(buffer, bufoffset, subbuffer, suboffset);
+ }
StepIndices(frame, frame_indices);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment