summaryrefslogtreecommitdiff
path: root/java
diff options
context:
space:
mode:
authorMuga Nishizawa <muga@f11vm.(none)>2010-10-07 13:01:06 +0900
committerMuga Nishizawa <muga@f11vm.(none)>2010-10-07 13:01:06 +0900
commit562d50df4dcc44c80b946279f3e0ba5c75affebf (patch)
treeec9d3a6c013b1b76e813b4b24d1d111274b708bf /java
parent3dc1048dfbd5123ac8d91998c08f615275dbfdde (diff)
downloadmsgpack-python-562d50df4dcc44c80b946279f3e0ba5c75affebf.tar.gz
java: refactor several programs in a org.msgpack.util.codegen package
Diffstat (limited to 'java')
-rw-r--r--java/src/main/java/org/msgpack/util/codegen/DynamicCodeGen.java70
-rw-r--r--java/src/main/java/org/msgpack/util/codegen/DynamicCodeGenBase.java30
-rw-r--r--java/src/main/java/org/msgpack/util/codegen/DynamicCodeGenTemplate.java2
3 files changed, 60 insertions, 42 deletions
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 1877607..1b4cb91 100644
--- a/java/src/main/java/org/msgpack/util/codegen/DynamicCodeGen.java
+++ b/java/src/main/java/org/msgpack/util/codegen/DynamicCodeGen.java
@@ -128,14 +128,15 @@ public class DynamicCodeGen extends DynamicCodeGenBase implements Constants {
checkClassValidation(origClass);
checkDefaultConstructorValidation(origClass);
CtClass tmplCtClass = pool.makeClass(tmplName);
+ CtClass acsCtClass = pool.get(TemplateAccessorImpl.class.getName());
setInterface(tmplCtClass, Template.class);
setInterface(tmplCtClass, DynamicCodeGenBase.TemplateAccessor.class);
addDefaultConstructor(tmplCtClass);
Field[] fields = getDeclaredFields(origClass);
Template[] tmpls = createTemplates(fields);
setTemplates(origClass, tmpls);
- addTemplateArrayField(tmplCtClass, origClass);
- addSetTemplatesMethod(tmplCtClass, origClass);
+ addTemplateArrayField(tmplCtClass, acsCtClass);
+ addSetTemplatesMethod(tmplCtClass, acsCtClass);
addUnpackMethod(tmplCtClass, origClass, fields);
addConvertMethod(tmplCtClass, origClass, fields);
return createClass(tmplCtClass);
@@ -153,9 +154,8 @@ public class DynamicCodeGen extends DynamicCodeGenBase implements Constants {
+ origClass.getName());
try {
String origName = origClass.getName();
- String tmplName = origName + POSTFIX_TYPE_NAME_TEMPLATE + inc();
checkClassValidation(origClass);
- CtClass tmplCtClass = pool.makeClass(tmplName);
+ CtClass tmplCtClass = makeClass(origName);
setInterface(tmplCtClass, Template.class);
addDefaultConstructor(tmplCtClass);
addUnpackMethodForOrdinalEnumTypes(tmplCtClass, origClass);
@@ -170,6 +170,17 @@ public class DynamicCodeGen extends DynamicCodeGenBase implements Constants {
}
}
+ private CtClass makeClass(String origName) throws NotFoundException {
+ StringBuilder sb = new StringBuilder();
+ sb.append(origName);
+ sb.append(POSTFIX_TYPE_NAME_TEMPLATE);
+ sb.append(inc());
+ String invokerName = sb.toString();
+ CtClass newCtClass = pool.makeClass(invokerName);
+ newCtClass.setModifiers(Modifier.PUBLIC);
+ return newCtClass;
+ }
+
private void checkClassValidation(Class<?> origClass) {
// not public, abstract
int mod = origClass.getModifiers();
@@ -405,46 +416,25 @@ public class DynamicCodeGen extends DynamicCodeGenBase implements Constants {
}
}
- private void addTemplateArrayField(CtClass newCtClass, Class<?> origClass) {
- StringBuilder sb = new StringBuilder();
- addPublicFieldDecl(sb, Template.class, VARIABLE_NAME_TEMPLATES, 1);
- insertSemicolon(sb);
- LOG.trace("templates field src: " + sb.toString());
- try {
- CtField templatesCtField = CtField.make(sb.toString(), newCtClass);
- newCtClass.addField(templatesCtField);
- } catch (CannotCompileException e) {
- DynamicCodeGenException ex = new DynamicCodeGenException(e
- .getMessage()
- + ": " + sb.toString(), e);
- LOG.error(ex.getMessage(), ex);
- throw ex;
- }
+ private void addTemplateArrayField(CtClass newCtClass, CtClass acsCtClass)
+ throws NotFoundException, CannotCompileException {
+ CtField tmplsField = acsCtClass
+ .getDeclaredField(VARIABLE_NAME_TEMPLATES);
+ CtField tmplsField2 = new CtField(tmplsField.getType(), tmplsField
+ .getName(), newCtClass);
+ newCtClass.addField(tmplsField2);
}
- private void addSetTemplatesMethod(CtClass newCtClass, Class<?> origClass) {
- StringBuilder sb = new StringBuilder();
- StringBuilder body = new StringBuilder();
- body.append("_$$_templates = _$$_tmpls;");
- addPublicMethodDecl(sb, METHOD_NAME_SETTEMPLATES, void.class,
- new Class<?>[] { Template.class }, new int[] { 1 },
- new String[] { VARIABLE_NAME_TEMPLATES0 }, new Class<?>[0],
- body.toString());
- LOG.trace("settemplates method src: " + sb.toString());
- try {
- CtMethod newCtMethod = CtNewMethod.make(sb.toString(), newCtClass);
- newCtClass.addMethod(newCtMethod);
- } catch (CannotCompileException e) {
- DynamicCodeGenException ex = new DynamicCodeGenException(e
- .getMessage()
- + ": " + sb.toString(), e);
- LOG.error(ex.getMessage(), ex);
- throw ex;
- }
+ private void addSetTemplatesMethod(CtClass newCtClass, CtClass acsCtClass)
+ throws NotFoundException, CannotCompileException {
+ CtMethod settmplsMethod = acsCtClass
+ .getDeclaredMethod(METHOD_NAME_SETTEMPLATES);
+ CtMethod settmplsMethod2 = CtNewMethod.copy(settmplsMethod, newCtClass,
+ null);
+ newCtClass.addMethod(settmplsMethod2);
}
- private void addUnpackMethod(CtClass unpackerCtClass, Class<?> c, Field[] fs)
- throws CannotCompileException, NotFoundException {
+ private void addUnpackMethod(CtClass unpackerCtClass, Class<?> c, Field[] fs) {
// Object unpack(Unpacker pac) throws IOException, MessageTypeException;
StringBuilder sb = new StringBuilder();
StringBuilder bsb = new StringBuilder();
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 2e5b204..533a8bc 100644
--- a/java/src/main/java/org/msgpack/util/codegen/DynamicCodeGenBase.java
+++ b/java/src/main/java/org/msgpack/util/codegen/DynamicCodeGenBase.java
@@ -21,6 +21,14 @@ public class DynamicCodeGenBase implements BasicConstants {
public static interface TemplateAccessor {
void setTemplates(Template[] templates);
}
+
+ public static class TemplateAccessorImpl implements TemplateAccessor {
+ public Template[] _$$_templates;
+
+ public void setTemplates(Template[] _$$_tmpls) {
+ _$$_templates = _$$_tmpls;
+ }
+ }
private static Logger LOG = LoggerFactory
.getLogger(DynamicCodeGenBase.class);
@@ -114,7 +122,11 @@ public class DynamicCodeGenBase implements BasicConstants {
public void insertLocalVariableDecl(StringBuilder sb, Class<?> type,
String name, int dim) {
// int[] lv
- sb.append(type.getName());
+ if (type.equals(byte[].class)) {
+ sb.append("byte[]");
+ } else {
+ 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);
@@ -122,6 +134,22 @@ public class DynamicCodeGenBase implements BasicConstants {
sb.append(CHAR_NAME_SPACE);
sb.append(name);
}
+
+ static int getArrayDim(Class<?> type) {
+ if (type.isArray()) {
+ return 1 + getArrayDim(type.getComponentType());
+ } else {
+ return 0;
+ }
+ }
+
+ static Class<?> getArrayBaseType(Class<?> type) {
+ if (type.isArray()) {
+ return getArrayBaseType(type.getComponentType());
+ } else {
+ return type;
+ }
+ }
public void insertValueInsertion(StringBuilder sb, String expr) {
// = expr
diff --git a/java/src/main/java/org/msgpack/util/codegen/DynamicCodeGenTemplate.java b/java/src/main/java/org/msgpack/util/codegen/DynamicCodeGenTemplate.java
index 98a1f8d..2a9e584 100644
--- a/java/src/main/java/org/msgpack/util/codegen/DynamicCodeGenTemplate.java
+++ b/java/src/main/java/org/msgpack/util/codegen/DynamicCodeGenTemplate.java
@@ -9,7 +9,7 @@ public class DynamicCodeGenTemplate {
DynamicCodeGen gen = DynamicCodeGen.getInstance();
Class<?> tmplClass = gen.generateTemplateClass(c);
Object obj = tmplClass.newInstance();
- ((DynamicCodeGenBase.TemplateAccessor)obj).setTemplates(gen.getTemplates(c));
+ ((TemplateAccessor) obj).setTemplates(gen.getTemplates(c));
return (Template) obj;
} catch (InstantiationException e) {
throw new DynamicCodeGenException(e.getMessage(), e);