From cacae0fb7d34589b56d33ab261c552a27c8474cb Mon Sep 17 00:00:00 2001 From: Muga Nishizawa Date: Thu, 4 Nov 2010 02:00:34 +0900 Subject: [PATCH] java: refactor DynamicCodeGen.java and Constants.java. Thanks frsyuki for fixing a bug in DynamicCodeGen.java --- .../org/msgpack/util/codegen/Constants.java | 12 ++- .../msgpack/util/codegen/DynamicCodeGen.java | 77 ++++++++++--------- 2 files changed, 50 insertions(+), 39 deletions(-) diff --git a/java/src/main/java/org/msgpack/util/codegen/Constants.java b/java/src/main/java/org/msgpack/util/codegen/Constants.java index fc6650f2..4f4010d7 100644 --- a/java/src/main/java/org/msgpack/util/codegen/Constants.java +++ b/java/src/main/java/org/msgpack/util/codegen/Constants.java @@ -78,7 +78,7 @@ public interface Constants { String STATEMENT_TMPL_UNPACKERMETHODBODY_01 = "%s _$$_t = new %s(); "; - String STATEMENT_TMPL_UNPACKERMETHODBODY_02 = "int _$$_L = $1.unpackArray(); "; + String STATEMENT_TMPL_UNPACKERMETHODBODY_02 = "int _$$_len = $1.unpackArray(); "; String STATEMENT_TMPL_UNPACKERMETHODBODY_03 = "_$$_t.%s = %s(%s)_$$_templates[%d].unpack($1)%s; "; @@ -88,15 +88,19 @@ public interface Constants { String STATEMENT_TMPL_UNPACKERMETHODBODY_06 = "return %s.class.getEnumConstants()[i]; "; - String STATEMENT_TMPL_UNPACKERMETHODBODY_07 = "if(_$$_L <= %d) { throw new org.msgpack.MessageTypeException(); } "; + String STATEMENT_TMPL_UNPACKERMETHODBODY_07 = "if (_$$_len <= %d) { throw new org.msgpack.MessageTypeException(\"optional error\"); } "; - String STATEMENT_TMPL_UNPACKERMETHODBODY_08 = "if(_$$_L > %d && !$1.tryUnpackNull()) "; + String STATEMENT_TMPL_UNPACKERMETHODBODY_08 = "if (_$$_len > %d && !$1.tryUnpackNull()) { %s } "; - String STATEMENT_TMPL_UNPACKERMETHODBODY_09 = "for(int _$$_n = %d; _$$_n < _$$_L; _$$_n++) { $1.unpackObject(); } "; + String STATEMENT_TMPL_UNPACKERMETHODBODY_09 = "for (int _$$_i = %d; _$$_i < _$$_len; _$$_i++) { $1.unpackObject(); } "; String STATEMENT_TMPL_CONVERTMETHODBODY_01 = "%s _$$_ary = $1.asArray(); "; String STATEMENT_TMPL_CONVERTMETHODBODY_02 = "_$$_t.%s = %s(%s)_$$_templates[%d].convert(_$$_ary[%d])%s; "; String STATEMENT_TMPL_CONVERTMETHODBODY_03 = "int i = _$$_ary[0].asInt(); "; + + String STATEMENT_TMPL_CONVERTMETHODBODY_04 = "int _$$_len = _$$_ary.length; "; + + String STATEMENT_TMPL_CONVERTMETHODBODY_05 = "if (_$$_len > %d && !_$$_ary[%d].isNil()) { %s }"; } 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 edd23d80..50cedd5a 100644 --- a/java/src/main/java/org/msgpack/util/codegen/DynamicCodeGen.java +++ b/java/src/main/java/org/msgpack/util/codegen/DynamicCodeGen.java @@ -397,38 +397,23 @@ class DynamicCodeGen extends DynamicCodeGenBase implements Constants { // int _$$_L = $1.unpackArray(); Object[] args1 = new Object[0]; sb.append(String.format(STATEMENT_TMPL_UNPACKERMETHODBODY_02, args1)); - insertCodeOfUnpackMethodCalls(sb, fields); + insertCodeOfUnpackMethodCalls(sb, fields, getTemplates(type)); // return _$$_t; Object[] args2 = new Object[0]; sb.append(String.format(STATEMENT_TMPL_UNPACKERMETHODBODY_04, args2)); sb.append(CHAR_NAME_RIGHT_CURLY_BRACKET); } - private void insertCodeOfUnpackMethodCalls(StringBuilder sb, Field[] fields) { + private void insertCodeOfUnpackMethodCalls(StringBuilder sb, Field[] fields, + Template[] tmpls) { for (int i = 0; i < fields.length; ++i) { - insertCodeOfUnpackMethodCall(sb, fields[i], i); + insertCodeOfUnpackMethodCall(sb, fields[i], i, tmpls[i]); } insertCodeOfUnpackTrails(sb, fields.length); } private void insertCodeOfUnpackMethodCall(StringBuilder sb, Field field, - int i) { - boolean isOptional = isAnnotated(field, MessagePackOptional.class); - - if(isOptional) { - // if(_$$_L > i && !$1.tryUnpackNull()) { - Object[] args0 = new Object[] { i }; - sb.append(String.format(STATEMENT_TMPL_UNPACKERMETHODBODY_08, args0)); - sb.append(CHAR_NAME_LEFT_CURLY_BRACKET); - - } else { - // if(_$$_L <= i) { - // throw new MessageTypeException(); - // } - Object[] args0 = new Object[] { i }; - sb.append(String.format(STATEMENT_TMPL_UNPACKERMETHODBODY_07, args0)); - } - + int i, Template tmpl) { // target.fi = ((Integer)_$$_tmpls[i].unpack(_$$_pk)).intValue(); Class returnType = field.getType(); boolean isPrim = returnType.isPrimitive(); @@ -440,19 +425,22 @@ class DynamicCodeGen extends DynamicCodeGenBase implements Constants { i, isPrim ? ")." + getPrimTypeValueMethodName(returnType) + "()" : "" }; - sb.append(String.format(STATEMENT_TMPL_UNPACKERMETHODBODY_03, args)); - - if(isOptional) { - // } - sb.append(CHAR_NAME_RIGHT_CURLY_BRACKET); + String callExpr = String.format(STATEMENT_TMPL_UNPACKERMETHODBODY_03, args); + if (tmpl instanceof OptionalTemplate) { + Object[] args0 = new Object[] { i, callExpr }; + // if (_$$_len > i && !unpacker.tryUnpackNull()) { ... } + sb.append(String.format(STATEMENT_TMPL_UNPACKERMETHODBODY_08, args0)); + } else { + // if (_$$_len <= i) { throw new MessageTypeException(); } + Object[] args0 = new Object[] { i }; + sb.append(String.format(STATEMENT_TMPL_UNPACKERMETHODBODY_07, args0)); + sb.append(callExpr); } } - private void insertCodeOfUnpackTrails(StringBuilder sb, int length) { - // for(int _$$_n = length; _$$_n < _$$_L; _$$_n++) { - // $1.unpackObject(); - // } - Object[] args0 = new Object[] { length }; + private void insertCodeOfUnpackTrails(StringBuilder sb, int len) { + // for (int _$$_i = len; _$$_i < _$$_len; _$$_i++) { $1.unpackObject(); } + Object[] args0 = new Object[] { len }; sb.append(String.format(STATEMENT_TMPL_UNPACKERMETHODBODY_09, args0)); } @@ -519,20 +507,25 @@ class DynamicCodeGen extends DynamicCodeGenBase implements Constants { // MessagePackObject[] _$$_ary = $1.asArray(); Object[] args1 = new Object[] { classToString(MessagePackObject[].class) }; sb.append(String.format(STATEMENT_TMPL_CONVERTMETHODBODY_01, args1)); - insertCodeOfConvertMethodCalls(sb, fields); + sb.append(STATEMENT_TMPL_CONVERTMETHODBODY_04); + Template[] tmpls = getTemplates(type); + insertCodeOfConvertMethodCalls(sb, fields, tmpls); // return _$$_t; Object[] args2 = new Object[0]; sb.append(String.format(STATEMENT_TMPL_UNPACKERMETHODBODY_04, args2)); sb.append(CHAR_NAME_RIGHT_CURLY_BRACKET); } - private void insertCodeOfConvertMethodCalls(StringBuilder sb, Field[] fields) { + private void insertCodeOfConvertMethodCalls(StringBuilder sb, Field[] fields, + Template[] tmpls) { for (int i = 0; i < fields.length; ++i) { - insertCodeOfConvMethodCall(sb, fields[i], i); + insertCodeOfConvMethodCall(sb, fields[i], i, tmpls[i]); } + insertCodeOfConvertTrails(sb, fields.length); } - private void insertCodeOfConvMethodCall(StringBuilder sb, Field field, int i) { + private void insertCodeOfConvMethodCall(StringBuilder sb, Field field, + int i, Template tmpl) { // target.fi = ((Object)_$$_tmpls[i].convert(_$$_ary[i])).intValue(); Class returnType = field.getType(); boolean isPrim = returnType.isPrimitive(); @@ -545,7 +538,21 @@ class DynamicCodeGen extends DynamicCodeGenBase implements Constants { i, isPrim ? ")." + getPrimTypeValueMethodName(returnType) + "()" : "" }; - sb.append(String.format(STATEMENT_TMPL_CONVERTMETHODBODY_02, args)); + String callExpr = String.format(STATEMENT_TMPL_CONVERTMETHODBODY_02, args); + if (tmpl instanceof OptionalTemplate) { + Object[] args0 = new Object[] { i, i, callExpr }; + // if (_$$_len > i && !_$$_ary[i].isNull()) { ... } + sb.append(String.format(STATEMENT_TMPL_CONVERTMETHODBODY_05, args0)); + } else { + // if (_$$_len <= i) { throw new MessageTypeException(); } + Object[] args0 = new Object[] { i }; + sb.append(String.format(STATEMENT_TMPL_UNPACKERMETHODBODY_07, args0)); + sb.append(callExpr); + } + } + + private void insertCodeOfConvertTrails(StringBuilder sb, int len) { + // TODO } private void insertOrdinalEnumConvertMethodBody(StringBuilder sb,