diff options
author | Brian S. O'Neill <bronee@gmail.com> | 2009-10-15 22:06:16 +0000 |
---|---|---|
committer | Brian S. O'Neill <bronee@gmail.com> | 2009-10-15 22:06:16 +0000 |
commit | 5d9feb86cf7e8b7ea8e00d512f774c20d92e7365 (patch) | |
tree | 7cf90ce8f0fff3fad31756038a978ff799252b73 | |
parent | dab0e9f28993b774ae9c940d2af498d1e6e05789 (diff) |
Generated readFrom method sets properties states at the end, to ensure that adapted properties in the primary key can be always set.
3 files changed, 29 insertions, 49 deletions
diff --git a/src/main/java/com/amazon/carbonado/raw/GenericEncodingStrategy.java b/src/main/java/com/amazon/carbonado/raw/GenericEncodingStrategy.java index ce55ddb..7f26238 100644 --- a/src/main/java/com/amazon/carbonado/raw/GenericEncodingStrategy.java +++ b/src/main/java/com/amazon/carbonado/raw/GenericEncodingStrategy.java @@ -1929,8 +1929,11 @@ public class GenericEncodingStrategy<S extends Storable> { LocalVariable[] bigDecimalRefRef = new LocalVariable[1];
LocalVariable[] valueRefRef = new LocalVariable[1];
+ // Used by SERIAL mode.
+ LocalVariable[] stateVars = null;
+
if (mode == Mode.SERIAL) {
- decodePropertyStates(a, encodedVar, constantOffset, properties);
+ stateVars = decodePropertyStates(a, encodedVar, constantOffset, properties);
constantOffset += (properties.length + 3) / 4;
// Some properties are skipped at runtime, so offset variable is required.
@@ -1980,14 +1983,6 @@ public class GenericEncodingStrategy<S extends Storable> { }
}
- LocalVariable stateFieldVar;
- if (mode != Mode.SERIAL) {
- stateFieldVar = null;
- } else {
- stateFieldVar = a.createLocalVariable(null, TypeDesc.INT);
- }
- int lastFieldOrdinal = -1;
-
for (int i=0; i<properties.length; i++) {
StorableProperty<S> property = properties[i];
StorablePropertyInfo info = infos[i];
@@ -2001,18 +1996,7 @@ public class GenericEncodingStrategy<S extends Storable> { if (mode == Mode.SERIAL) {
// Load property if initialized, else reset it.
- int fieldOrdinal = property.getNumber() >> 4;
-
- if (fieldOrdinal == lastFieldOrdinal) {
- a.loadLocal(stateFieldVar);
- } else {
- a.loadThis();
- a.loadField(PROPERTY_STATE_FIELD_NAME + fieldOrdinal, TypeDesc.INT);
- a.storeLocal(stateFieldVar);
- a.loadLocal(stateFieldVar);
- lastFieldOrdinal = fieldOrdinal;
- }
-
+ a.loadLocal(stateVars[property.getNumber() >> 4]);
a.loadConstant(PROPERTY_STATE_MASK << ((property.getNumber() & 0xf) * 2));
a.math(Opcode.IAND);
Label isInitialized = a.createLabel();
@@ -2131,6 +2115,14 @@ public class GenericEncodingStrategy<S extends Storable> { nextPropertyLocation.setLocation();
}
+
+ if (stateVars != null) {
+ for (int i=0; i<stateVars.length; i++) {
+ a.loadThis();
+ a.loadLocal(stateVars[i]);
+ a.storeField(PROPERTY_STATE_FIELD_NAME + i, TypeDesc.INT);
+ }
+ }
}
/**
@@ -2582,32 +2574,25 @@ public class GenericEncodingStrategy<S extends Storable> { *
* @param encodedVar references a byte array
* @param offset offset into byte array
+ * @return local variables with state values
*/
- private void decodePropertyStates(CodeAssembler a, LocalVariable encodedVar,
- int offset, StorableProperty<S>[] properties)
+ private LocalVariable[] decodePropertyStates(CodeAssembler a, LocalVariable encodedVar,
+ int offset, StorableProperty<S>[] properties)
{
- LocalVariable stateFieldVar = a.createLocalVariable(null, TypeDesc.INT);
- int lastFieldOrdinal = -1;
-
+ LocalVariable[] stateVars = new LocalVariable[(properties.length + 15) >> 4];
LocalVariable accumVar = a.createLocalVariable(null, TypeDesc.INT);
int accumShift = 8;
for (int i=0; i<properties.length; i++) {
StorableProperty<S> property = properties[i];
- int fieldOrdinal = property.getNumber() >> 4;
+ int stateVarOrdinal = property.getNumber() >> 4;
- if (fieldOrdinal != lastFieldOrdinal) {
- if (lastFieldOrdinal >= 0) {
- // Copy states to field.
- a.loadThis();
- a.loadLocal(stateFieldVar);
- a.storeField(PROPERTY_STATE_FIELD_NAME + lastFieldOrdinal, TypeDesc.INT);
- }
+ if (stateVars[stateVarOrdinal] == null) {
+ stateVars[stateVarOrdinal] = a.createLocalVariable(null, TypeDesc.INT);
a.loadThis();
- a.loadField(PROPERTY_STATE_FIELD_NAME + fieldOrdinal, TypeDesc.INT);
- a.storeLocal(stateFieldVar);
- lastFieldOrdinal = fieldOrdinal;
+ a.loadField(PROPERTY_STATE_FIELD_NAME + stateVarOrdinal, TypeDesc.INT);
+ a.storeLocal(stateVars[stateVarOrdinal]);
}
if (accumShift >= 8) {
@@ -2637,7 +2622,7 @@ public class GenericEncodingStrategy<S extends Storable> { // Properties are not consecutive.
break;
}
- if (fieldOrdinal != (nextProperty.getNumber() >> 4)) {
+ if (stateVarOrdinal != (nextProperty.getNumber() >> 4)) {
// Property states are stored in different fields.
break;
}
@@ -2659,20 +2644,15 @@ public class GenericEncodingStrategy<S extends Storable> { a.loadConstant(mask);
a.math(Opcode.IAND);
- a.loadLocal(stateFieldVar);
+ a.loadLocal(stateVars[stateVarOrdinal]);
a.loadConstant(~mask);
a.math(Opcode.IAND);
a.math(Opcode.IOR);
- a.storeLocal(stateFieldVar);
+ a.storeLocal(stateVars[stateVarOrdinal]);
accumShift += accumPack;
}
- if (lastFieldOrdinal >= 0) {
- // Copy remaining states to last state field.
- a.loadThis();
- a.loadLocal(stateFieldVar);
- a.storeField(PROPERTY_STATE_FIELD_NAME + lastFieldOrdinal, TypeDesc.INT);
- }
+ return stateVars;
}
}
diff --git a/src/main/java/com/amazon/carbonado/repo/indexed/IndexedCursor.java b/src/main/java/com/amazon/carbonado/repo/indexed/IndexedCursor.java index 872b5b4..61c087b 100644 --- a/src/main/java/com/amazon/carbonado/repo/indexed/IndexedCursor.java +++ b/src/main/java/com/amazon/carbonado/repo/indexed/IndexedCursor.java @@ -99,7 +99,7 @@ class IndexedCursor<S extends Storable> extends AbstractCursor<S> { // the risk of seeing it multiple times. This is
// better than seeing it never.
LogFactory.getLog(getClass()).warn
- ("Inconsistent index entry: " + indexEntry);
+ ("Inconsistent index entry: " + indexEntry + ", " + master);
mNext = master;
}
diff --git a/src/main/java/com/amazon/carbonado/synthetic/SyntheticStorableReferenceBuilder.java b/src/main/java/com/amazon/carbonado/synthetic/SyntheticStorableReferenceBuilder.java index 75f1701..9a44574 100644 --- a/src/main/java/com/amazon/carbonado/synthetic/SyntheticStorableReferenceBuilder.java +++ b/src/main/java/com/amazon/carbonado/synthetic/SyntheticStorableReferenceBuilder.java @@ -418,7 +418,7 @@ public class SyntheticStorableReferenceBuilder<S extends Storable> TypeDesc masterStorableType = TypeDesc.forClass(mMasterStorableClass);
// Add a method which tests all properties of index entry object
- // against master object, excluding the version property.
+ // against master object, excluding version and derived properties.
{
TypeDesc[] params = new TypeDesc[] {masterStorableType};
MethodInfo mi = cf.addMethod
@@ -426,7 +426,7 @@ public class SyntheticStorableReferenceBuilder<S extends Storable> CodeBuilder b = new CodeBuilder(mi);
for (StorableProperty prop : mCommonProps) {
- if (prop.isVersion()) {
+ if (prop.isVersion() || prop.isDerived()) {
continue;
}
Label propsAreEqual = b.createLabel();
|