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 cd667a6c..a293056b 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 efe9a695..c57b3db5 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 61848836..e460d6a7 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); }