aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authoralon@honor <none@none>2010-10-10 11:49:50 -0700
committeralon@honor <none@none>2010-10-10 11:49:50 -0700
commit5a4c4614b70c0dfe7d5f19b72379b52210e4afa5 (patch)
tree61374bd571f444f7afef7c80c20b1ee0e29391fe /src
parentab097f0b3a1440911bfb48a0b26057176c02edfd (diff)
clean up flattener code and remove unneeded flattener definitions; 3% speedup
Diffstat (limited to 'src')
-rw-r--r--src/analyzer.js22
-rw-r--r--src/jsifier.js2
2 files changed, 15 insertions, 9 deletions
diff --git a/src/analyzer.js b/src/analyzer.js
index c6c7b028..ce4a99af 100644
--- a/src/analyzer.js
+++ b/src/analyzer.js
@@ -172,9 +172,9 @@ function analyzer(data) {
return;
}
type.flatSize = 0;
- var sizes = [];
+ var diffs = [];
+ var prev = -1;
type.flatIndexes = type.fields.map(function(field) {
- var soFar = type.flatSize;
var size;
if (isNumberType(field) || isPointerType(field)) {
size = getNativeFieldSize(field, true); // pack char; char; in structs, also char[X]s.
@@ -183,14 +183,20 @@ function analyzer(data) {
} else {
assert(0);
}
- type.flatSize += size;
- sizes.push(size);
- return Runtime.alignMemory(soFar, Math.min(QUANTUM_SIZE, size)); // if necessary, place this on aligned memory
+ var curr = Runtime.alignMemory(type.flatSize, Math.min(QUANTUM_SIZE, size)); // if necessary, place this on aligned memory
+ type.flatSize = curr + size;
+ if (prev >= 0) {
+ diffs.push(curr-prev);
+ }
+ prev = curr;
+ return curr;
});
- type.flatSize = Runtime.alignMemory(type.flatSize); // padding at end
- if (dedup(sizes).length == 1) {
- type.flatFactor = sizes[0];
+ if (diffs.length == 0) {
+ type.flatFactor = type.flatSize;
+ } else if (dedup(diffs).length == 1) {
+ type.flatFactor = diffs[0];
}
+ type.flatSize = Runtime.alignMemory(type.flatSize); // final padding at end
type.needsFlattening = (this.flatFactor != 1);
dprint('types', 'type: ' + type.name_ + ' : ' + JSON.stringify(type.fields));
dprint('types', ' has final size of ' + type.flatSize + ', flatting: ' + type.needsFlattening + ' ? ' + (type.flatFactor ? type.flatFactor : JSON.stringify(type.flatIndexes)));
diff --git a/src/jsifier.js b/src/jsifier.js
index f69a22ee..bcc436a4 100644
--- a/src/jsifier.js
+++ b/src/jsifier.js
@@ -9,7 +9,7 @@ function JSify(data) {
substrate.addZyme('Type', {
processItem: function(item) {
var type = TYPES[item.name_];
- if (type.needsFlattening) {
+ if (type.needsFlattening && !type.flatFactor) {
item.JS = 'var ' + toNiceIdent(item.name_) + '___FLATTENER = ' + JSON.stringify(TYPES[item.name_].flatIndexes) + ';';
} else {
item.JS = '// type: ' + item.name_;