mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-12 04:45:45 +00:00
Bug 972581 part 1 -- Introduce getDerivedIf and getOpaqueIf r=till
This commit is contained in:
parent
82ad8a4c2a
commit
4bca0b155e
@ -354,6 +354,22 @@ TypedObjectPointer.prototype.getDerived = function() {
|
|||||||
return NewDerivedTypedObject(this.descr, this.typedObj, this.offset);
|
return NewDerivedTypedObject(this.descr, this.typedObj, this.offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TypedObjectPointer.prototype.getDerivedIf = function(cond) {
|
||||||
|
return (cond ? this.getDerived() : undefined);
|
||||||
|
}
|
||||||
|
|
||||||
|
TypedObjectPointer.prototype.getOpaque = function() {
|
||||||
|
assert(!TypeDescrIsSimpleType(this.descr),
|
||||||
|
"getDerived() used with simple type");
|
||||||
|
var typedObj = NewOpaqueTypedObject(this.descr);
|
||||||
|
AttachTypedObject(typedObj, this.typedObj, this.offset);
|
||||||
|
return typedObj;
|
||||||
|
}
|
||||||
|
|
||||||
|
TypedObjectPointer.prototype.getOpaqueIf = function(cond) {
|
||||||
|
return (cond ? this.getOpaque() : undefined);
|
||||||
|
}
|
||||||
|
|
||||||
TypedObjectPointer.prototype.getScalar = function() {
|
TypedObjectPointer.prototype.getScalar = function() {
|
||||||
var type = DESCR_TYPE(this.descr);
|
var type = DESCR_TYPE(this.descr);
|
||||||
switch (type) {
|
switch (type) {
|
||||||
@ -1098,14 +1114,12 @@ function BuildTypedSeqImpl(arrayType, len, depth, func) {
|
|||||||
indices[i] = 0;
|
indices[i] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
var grainTypeIsSimple = TypeDescrIsSimpleType(grainType);
|
var grainTypeIsComplex = !TypeDescrIsSimpleType(grainType);
|
||||||
var size = DESCR_SIZE(grainType);
|
var size = DESCR_SIZE(grainType);
|
||||||
var outPointer = new TypedObjectPointer(grainType, result, 0);
|
var outPointer = new TypedObjectPointer(grainType, result, 0);
|
||||||
for (i = 0; i < totalLength; i++) {
|
for (i = 0; i < totalLength; i++) {
|
||||||
// Position out-pointer to point at &result[...indices], if appropriate.
|
// Position out-pointer to point at &result[...indices], if appropriate.
|
||||||
var userOutPointer = (grainTypeIsSimple
|
var userOutPointer = outPointer.getOpaqueIf(grainTypeIsComplex);
|
||||||
? undefined
|
|
||||||
: outPointer.getDerived());
|
|
||||||
|
|
||||||
// Invoke func(...indices, userOutPointer) and store the result
|
// Invoke func(...indices, userOutPointer) and store the result
|
||||||
callFunction(std_Array_push, indices, userOutPointer);
|
callFunction(std_Array_push, indices, userOutPointer);
|
||||||
@ -1192,7 +1206,7 @@ function MapUntypedSeqImpl(inArray, outputType, maybeFunc) {
|
|||||||
var result = outputType.variable ? new outputType(inArray.length) : new outputType();
|
var result = outputType.variable ? new outputType(inArray.length) : new outputType();
|
||||||
|
|
||||||
var outUnitSize = DESCR_SIZE(outGrainType);
|
var outUnitSize = DESCR_SIZE(outGrainType);
|
||||||
var outGrainTypeIsSimple = TypeDescrIsSimpleType(outGrainType);
|
var outGrainTypeIsComplex = !TypeDescrIsSimpleType(outGrainType);
|
||||||
var outPointer = new TypedObjectPointer(outGrainType, result, 0);
|
var outPointer = new TypedObjectPointer(outGrainType, result, 0);
|
||||||
|
|
||||||
// Core of map computation starts here (comparable to
|
// Core of map computation starts here (comparable to
|
||||||
@ -1206,7 +1220,7 @@ function MapUntypedSeqImpl(inArray, outputType, maybeFunc) {
|
|||||||
var element = inArray[i];
|
var element = inArray[i];
|
||||||
|
|
||||||
// Create out pointer to point at &array[...indices] for result array.
|
// Create out pointer to point at &array[...indices] for result array.
|
||||||
var out = (outGrainTypeIsSimple ? undefined : outPointer.getDerived());
|
var out = outPointer.getOpaqueIf(outGrainTypeIsComplex);
|
||||||
|
|
||||||
// Invoke: var r = func(element, ...indices, collection, out);
|
// Invoke: var r = func(element, ...indices, collection, out);
|
||||||
var r = func(element, i, inArray, out);
|
var r = func(element, i, inArray, out);
|
||||||
@ -1247,8 +1261,8 @@ function MapTypedSeqImpl(inArray, depth, outputType, func) {
|
|||||||
// Create a zeroed instance with no data
|
// Create a zeroed instance with no data
|
||||||
var result = outputType.variable ? new outputType(inArray.length) : new outputType();
|
var result = outputType.variable ? new outputType(inArray.length) : new outputType();
|
||||||
|
|
||||||
var inGrainTypeIsSimple = TypeDescrIsSimpleType(inGrainType);
|
var inGrainTypeIsComplex = !TypeDescrIsSimpleType(inGrainType);
|
||||||
var outGrainTypeIsSimple = TypeDescrIsSimpleType(outGrainType);
|
var outGrainTypeIsComplex = !TypeDescrIsSimpleType(outGrainType);
|
||||||
|
|
||||||
var inPointer = new TypedObjectPointer(inGrainType, inArray, 0);
|
var inPointer = new TypedObjectPointer(inGrainType, inArray, 0);
|
||||||
var outPointer = new TypedObjectPointer(outGrainType, result, 0);
|
var outPointer = new TypedObjectPointer(outGrainType, result, 0);
|
||||||
@ -1264,7 +1278,7 @@ function MapTypedSeqImpl(inArray, depth, outputType, func) {
|
|||||||
|
|
||||||
// Prepare input element/handle and out pointer
|
// Prepare input element/handle and out pointer
|
||||||
var element = inPointer.get();
|
var element = inPointer.get();
|
||||||
var out = (outGrainTypeIsSimple ? undefined : outPointer.getDerived());
|
var out = outPointer.getOpaqueIf(outGrainTypeIsComplex);
|
||||||
|
|
||||||
// Invoke: var r = func(element, ...indices, collection, out);
|
// Invoke: var r = func(element, ...indices, collection, out);
|
||||||
var r = func(element, i, inArray, out);
|
var r = func(element, i, inArray, out);
|
||||||
@ -1285,7 +1299,7 @@ function MapTypedSeqImpl(inArray, depth, outputType, func) {
|
|||||||
for (var i = 0; i < totalLength; i++) {
|
for (var i = 0; i < totalLength; i++) {
|
||||||
// Prepare input element and out pointer
|
// Prepare input element and out pointer
|
||||||
var element = inPointer.get();
|
var element = inPointer.get();
|
||||||
var out = (outGrainTypeIsSimple ? undefined : outPointer.getDerived());
|
var out = outPointer.getOpaqueIf(outGrainTypeIsComplex);
|
||||||
|
|
||||||
// Invoke: var r = func(element, ...indices, collection, out);
|
// Invoke: var r = func(element, ...indices, collection, out);
|
||||||
var args = [element];
|
var args = [element];
|
||||||
|
Loading…
Reference in New Issue
Block a user