summaryrefslogtreecommitdiff
path: root/java/src/main
diff options
context:
space:
mode:
authorMuga Nishizawa <muga@f11vm.(none)>2010-10-02 22:12:40 +0900
committerMuga Nishizawa <muga@f11vm.(none)>2010-10-02 22:12:40 +0900
commit3ec55791c6a3234db0381b706ac30425d34536b5 (patch)
tree412507af26a8c3a37f5c3e863ababd3d539055ea /java/src/main
parenta3accd28ea2c1d6485e25ee7dfbc1168b2428fb4 (diff)
downloadmsgpack-python-3ec55791c6a3234db0381b706ac30425d34536b5.tar.gz
java: refactor DynamicCodeGen.java
Diffstat (limited to 'java/src/main')
-rw-r--r--java/src/main/java/org/msgpack/util/codegen/BasicConstants.java2
-rw-r--r--java/src/main/java/org/msgpack/util/codegen/DynamicCodeGen.java69
-rw-r--r--java/src/main/java/org/msgpack/util/codegen/DynamicCodeGenBase.java10
3 files changed, 51 insertions, 30 deletions
diff --git a/java/src/main/java/org/msgpack/util/codegen/BasicConstants.java b/java/src/main/java/org/msgpack/util/codegen/BasicConstants.java
index cd667a6..a293056 100644
--- a/java/src/main/java/org/msgpack/util/codegen/BasicConstants.java
+++ b/java/src/main/java/org/msgpack/util/codegen/BasicConstants.java
@@ -100,6 +100,8 @@ public interface BasicConstants {
String METHOD_NAME_ORDINAL = "ordinal";
+ String METHOD_NAME_GETENUMCONSTANTS = "getEnumConstants";
+
String METHOD_NAME_CONVERT = "convert";
String METHOD_NAME_MSGCONVERT = "messageConvert";
diff --git a/java/src/main/java/org/msgpack/util/codegen/DynamicCodeGen.java b/java/src/main/java/org/msgpack/util/codegen/DynamicCodeGen.java
index efe9a69..c57b3db 100644
--- a/java/src/main/java/org/msgpack/util/codegen/DynamicCodeGen.java
+++ b/java/src/main/java/org/msgpack/util/codegen/DynamicCodeGen.java
@@ -819,14 +819,23 @@ public class DynamicCodeGen extends DynamicCodeGenBase implements Constants {
// Object unpack(Unpacker pac) throws IOException, MessageTypeException;
StringBuilder sb = new StringBuilder();
StringBuilder bsb = new StringBuilder();
- // FIXME
insertMethodCall(bsb, VARIABLE_NAME_PK, METHOD_NAME_UNPACKARRAY,
new String[0]);
insertSemicolon(bsb);
- // insertUnpackMethodBody(bsb, c, new Field[0]);
- bsb.append("int _$$_i = _$$_pk.unpackInt();");
- bsb.append("return " + c.getName()
- + ".class.getEnumConstants()[_$$_i];");
+ StringBuilder mc = new StringBuilder();
+ insertMethodCall(mc, VARIABLE_NAME_PK, METHOD_NAME_UNPACKINT,
+ new String[0]);
+ insertLocalVariableDecl(bsb, int.class, VARIABLE_NAME_I);
+ insertValueInsertion(bsb, mc.toString());
+ insertSemicolon(bsb);
+ mc = new StringBuilder();
+ insertMethodCall(mc, c.getName() + ".class",
+ METHOD_NAME_GETENUMCONSTANTS, new String[0]);
+ mc.append(CHAR_NAME_LEFT_SQUARE_BRACKET);
+ mc.append(VARIABLE_NAME_I);
+ mc.append(CHAR_NAME_RIGHT_SQUARE_BRACKET);
+ insertReturnStat(bsb, mc.toString());
+ insertSemicolon(bsb);
addPublicMethodDecl(sb, METHOD_NAME_UNPACK, Object.class,
new Class<?>[] { Unpacker.class },
new String[] { VARIABLE_NAME_PK }, new Class<?>[] {
@@ -883,21 +892,11 @@ public class DynamicCodeGen extends DynamicCodeGenBase implements Constants {
private void insertCodeOfMessagePackObjectArrayGet(StringBuilder sb) {
// MessagePackObject[] ary = obj.asArray();
- sb.append(MessagePackObject.class.getName());
- sb.append(CHAR_NAME_LEFT_SQUARE_BRACKET);
- sb.append(CHAR_NAME_RIGHT_SQUARE_BRACKET);
- sb.append(CHAR_NAME_SPACE);
- sb.append(VARIABLE_NAME_ARRAY);
- sb.append(CHAR_NAME_SPACE);
- sb.append(CHAR_NAME_EQUAL);
- sb.append(CHAR_NAME_SPACE);
- sb.append(VARIABLE_NAME_MPO);
- sb.append(CHAR_NAME_DOT);
- sb.append(METHOD_NAME_ASARRAY);
- sb.append(CHAR_NAME_LEFT_PARENTHESIS);
- sb.append(CHAR_NAME_RIGHT_PARENTHESIS);
- sb.append(CHAR_NAME_SEMICOLON);
- sb.append(CHAR_NAME_SPACE);
+ insertLocalVariableDecl(sb, MessagePackObject.class, VARIABLE_NAME_ARRAY, 1);
+ StringBuilder mc = new StringBuilder();
+ insertMethodCall(mc, VARIABLE_NAME_MPO, METHOD_NAME_ASARRAY, new String[0]);
+ insertValueInsertion(sb, mc.toString());
+ insertSemicolon(sb);
}
private void insertCodeOfConvertMethodCalls(StringBuilder sb, Field[] fields) {
@@ -1106,7 +1105,7 @@ public class DynamicCodeGen extends DynamicCodeGenBase implements Constants {
sb.append(i);
sb.append(CHAR_NAME_RIGHT_SQUARE_BRACKET);
sb.append(CHAR_NAME_DOT);
- sb.append("asList");
+ sb.append(METHOD_NAME_ASLIST);
sb.append(CHAR_NAME_LEFT_PARENTHESIS);
sb.append(CHAR_NAME_RIGHT_PARENTHESIS);
sb.append(CHAR_NAME_SEMICOLON);
@@ -1352,15 +1351,25 @@ public class DynamicCodeGen extends DynamicCodeGenBase implements Constants {
StringBuilder sb = new StringBuilder();
StringBuilder bsb = new StringBuilder();
insertCodeOfMessagePackObjectArrayGet(bsb);
- // insertConvertMethodBody(bsb, c, new Field[0]);
- // FIXME
- // bsb.append("_$$_ary[0].asInt(); ");
- // bsb.append("int i = _$$_ary[1].asInt(); ");
- bsb.append("int i = _$$_ary[0].asInt(); ");
- bsb.append("java.lang.Object o = ").append(c.getName()).append(
- ".class.getEnumConstants()[i]; ");
- bsb.append("return (").append(c.getName()).append(") o; ");
-
+ StringBuilder mc = new StringBuilder();
+ insertMethodCall(mc, VARIABLE_NAME_ARRAY + "[0]", METHOD_NAME_ASINT,
+ new String[0]);
+ insertLocalVariableDecl(bsb, int.class, VARIABLE_NAME_I);
+ insertValueInsertion(bsb, mc.toString());
+ insertSemicolon(bsb);
+ mc = new StringBuilder();
+ insertMethodCall(mc, c.getName() + ".class",
+ METHOD_NAME_GETENUMCONSTANTS, new String[0]);
+ mc.append(CHAR_NAME_LEFT_SQUARE_BRACKET);
+ mc.append(VARIABLE_NAME_I);
+ mc.append(CHAR_NAME_RIGHT_SQUARE_BRACKET);
+ insertLocalVariableDecl(bsb, Object.class, VARIABLE_NAME_OBJECT);
+ insertValueInsertion(bsb, mc.toString());
+ insertSemicolon(bsb);
+ mc = new StringBuilder();
+ insertTypeCast(mc, c, VARIABLE_NAME_OBJECT);
+ insertReturnStat(bsb, mc.toString());
+ insertSemicolon(bsb);
addPublicMethodDecl(sb, METHOD_NAME_CONVERT, Object.class,
new Class<?>[] { MessagePackObject.class },
new String[] { VARIABLE_NAME_MPO },
diff --git a/java/src/main/java/org/msgpack/util/codegen/DynamicCodeGenBase.java b/java/src/main/java/org/msgpack/util/codegen/DynamicCodeGenBase.java
index 6184883..e460d6a 100644
--- a/java/src/main/java/org/msgpack/util/codegen/DynamicCodeGenBase.java
+++ b/java/src/main/java/org/msgpack/util/codegen/DynamicCodeGenBase.java
@@ -62,7 +62,17 @@ public class DynamicCodeGenBase implements BasicConstants {
public void insertLocalVariableDecl(StringBuilder sb, Class<?> type,
String name) {
// int lv
+ insertLocalVariableDecl(sb, type, name, 0);
+ }
+
+ public void insertLocalVariableDecl(StringBuilder sb, Class<?> type,
+ String name, int dim) {
+ // int[] lv
sb.append(type.getName());
+ for (int i = 0; i < dim; ++i) {
+ sb.append(CHAR_NAME_LEFT_SQUARE_BRACKET);
+ sb.append(CHAR_NAME_RIGHT_SQUARE_BRACKET);
+ }
sb.append(CHAR_NAME_SPACE);
sb.append(name);
}