summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBrian S. O'Neill <bronee@gmail.com>2009-09-22 21:17:32 +0000
committerBrian S. O'Neill <bronee@gmail.com>2009-09-22 21:17:32 +0000
commitc01a12cf48a18d021b88a176edfbc0547a8238c4 (patch)
tree315d554413854532d9e066292e91adc40e656f07 /src
parent94ed24638c71c4dd6de5c5641f821b4a9d676e11 (diff)
Ensure derived properties are always accessed by methods.
Diffstat (limited to 'src')
-rw-r--r--src/main/java/com/amazon/carbonado/gen/StorableGenerator.java64
1 files changed, 34 insertions, 30 deletions
diff --git a/src/main/java/com/amazon/carbonado/gen/StorableGenerator.java b/src/main/java/com/amazon/carbonado/gen/StorableGenerator.java
index caa5fbd..1cf4889 100644
--- a/src/main/java/com/amazon/carbonado/gen/StorableGenerator.java
+++ b/src/main/java/com/amazon/carbonado/gen/StorableGenerator.java
@@ -576,10 +576,7 @@ public final class StorableGenerator<S extends Storable> {
StorableProperty internal = property.getInternalJoinElement(i);
StorableProperty external = property.getExternalJoinElement(i);
if (internal.isNullable() && !external.isNullable()) {
- b.loadThis();
- b.loadField(internal.getName(),
- TypeDesc.forClass(internal.getType()));
-
+ loadThisProperty(b, internal);
Label notNull = b.createLabel();
b.ifNullBranch(notNull, false);
b.loadNull();
@@ -630,9 +627,7 @@ public final class StorableGenerator<S extends Storable> {
b.loadLocal(join);
StorableProperty internal = property.getInternalJoinElement(i);
StorableProperty external = property.getExternalJoinElement(i);
- b.loadThis();
- b.loadField(internal.getName(),
- TypeDesc.forClass(internal.getType()));
+ loadThisProperty(b, internal);
CodeBuilderUtil.convertValue
(b, internal.getType(), external.getType());
b.invoke(external.getWriteMethod());
@@ -675,9 +670,7 @@ public final class StorableGenerator<S extends Storable> {
// Now fill in the parameters of the query.
for (int i=0; i<count; i++) {
StorableProperty<S> internal = property.getInternalJoinElement(i);
- b.loadThis();
- b.loadField(internal.getName(),
- TypeDesc.forClass(internal.getType()));
+ loadThisProperty(b, internal);
TypeDesc bindType =
CodeBuilderUtil.bindQueryParam(internal.getType());
CodeBuilderUtil.convertValue
@@ -725,8 +718,7 @@ public final class StorableGenerator<S extends Storable> {
// Load property value and return it.
- b.loadThis();
- b.loadField(property.getName(), type);
+ loadThisProperty(b, property);
b.returnValue(type);
}
@@ -821,8 +813,7 @@ public final class StorableGenerator<S extends Storable> {
b.loadLocal(b.getParameter(0));
b.ifNullBranch(markDirty, true);
- b.loadThis();
- b.loadField(property.getName(), type);
+ loadThisProperty(b, property);
LocalVariable tempProp = b.createLocalVariable(null, type);
b.storeLocal(tempProp);
b.loadLocal(tempProp);
@@ -953,8 +944,7 @@ public final class StorableGenerator<S extends Storable> {
b.loadStaticField(fieldName, adapterType);
// Load property value.
- b.loadThis();
- b.loadField(property.getName(), type);
+ loadThisProperty(b, property);
b.invoke(adaptMethod);
b.returnValue(toType);
@@ -966,7 +956,9 @@ public final class StorableGenerator<S extends Storable> {
// Note: Calling these methods does not affect any state bits.
// They are only intended to be used by subclasses during loading.
- if (property.getAdapter() != null) {
+ if (property.getAdapter() != null &&
+ (!property.isDerived() || (property.getWriteMethod() != null)))
+ {
// End name with '$' to prevent any possible collisions.
String writeName = property.getWriteMethodName() + '$';
@@ -994,7 +986,7 @@ public final class StorableGenerator<S extends Storable> {
b.loadLocal(b.getParameter(0));
b.invoke(adaptMethod);
- b.storeField(property.getName(), type);
+ storeProperty(b, property, type);
b.returnVoid();
}
@@ -1067,9 +1059,7 @@ public final class StorableGenerator<S extends Storable> {
// Now fill in the parameters of the query.
for (OrderedProperty<S> op : altKey.getProperties()) {
StorableProperty<S> prop = op.getChainedProperty().getPrimeProperty();
- b.loadThis();
- TypeDesc propType = TypeDesc.forClass(prop.getType());
- b.loadField(prop.getName(), propType);
+ loadThisProperty(b, prop);
TypeDesc bindType = CodeBuilderUtil.bindQueryParam(prop.getType());
CodeBuilderUtil.convertValue(b, prop.getType(), bindType.toClass());
b.invokeInterface(queryType, WITH_METHOD_NAME, queryType,
@@ -1932,7 +1922,7 @@ public final class StorableGenerator<S extends Storable> {
b.loadLocal(target); // [target
loadThisProperty(b, property, type); // [target, this.propValue
- mutateProperty(b, property, type);
+ storeProperty(b, property, type);
skipCopy.setLocation();
}
@@ -1982,6 +1972,21 @@ public final class StorableGenerator<S extends Storable> {
*
* @param b - {@link CodeBuilder} to which to add the load code
* @param property - property to load
+ */
+ private void loadThisProperty(CodeBuilder b, StorableProperty property) {
+ loadThisProperty(b, property, TypeDesc.forClass(property.getType()));
+ }
+
+ /**
+ * Loads the property value of the current storable onto the stack. If the
+ * property is derived the read method is used, otherwise it just loads the
+ * value from the appropriate field.
+ *
+ * entry stack: [
+ * exit stack: [value
+ *
+ * @param b - {@link CodeBuilder} to which to add the load code
+ * @param property - property to load
* @param type - type of the property
*/
private void loadThisProperty(CodeBuilder b, StorableProperty property, TypeDesc type) {
@@ -1994,8 +1999,9 @@ public final class StorableGenerator<S extends Storable> {
}
/**
- * Puts the value on the stack into the specified storable. If a write method is defined
- * uses it, otherwise just shoves the value into the appropriate field.
+ * Puts the value on the stack into the specified storable. If a write
+ * method is defined, use it. Otherwise, just shove the value into the
+ * appropriate field.
*
* entry stack: [storable, value
* exit stack: [
@@ -2004,8 +2010,8 @@ public final class StorableGenerator<S extends Storable> {
* @param property - property to mutate
* @param type - type of the property
*/
- private void mutateProperty(CodeBuilder b, StorableProperty property, TypeDesc type) {
- if (property.getWriteMethod() == null) {
+ private void storeProperty(CodeBuilder b, StorableProperty property, TypeDesc type) {
+ if (property.getWriteMethod() == null && !property.isDerived()) {
b.storeField(property.getName(), type);
} else {
b.invoke(property.getWriteMethod());
@@ -3119,8 +3125,7 @@ public final class StorableGenerator<S extends Storable> {
}
TypeDesc fieldType = TypeDesc.forClass(property.getType());
- b.loadThis();
- b.loadField(property.getName(), fieldType);
+ loadThisProperty(b, property);
b.loadLocal(other);
b.invoke(property.getReadMethod());
@@ -3270,9 +3275,8 @@ public final class StorableGenerator<S extends Storable> {
invokeAppend(b, TypeDesc.STRING);
b.loadConstant('=');
invokeAppend(b, TypeDesc.CHAR);
- b.loadThis();
+ loadThisProperty(b, property);
TypeDesc type = TypeDesc.forClass(property.getType());
- b.loadField(property.getName(), type);
if (type.isPrimitive()) {
if (type == TypeDesc.BYTE || type == TypeDesc.SHORT) {
type = TypeDesc.INT;