Created
April 18, 2013 21:35
-
-
Save pnkfelix/5416420 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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