Skip to content

Commit

Permalink
refactor for serialize performance
Browse files Browse the repository at this point in the history
  • Loading branch information
wenshao committed Apr 30, 2016
1 parent 3de2de4 commit 495824f
Show file tree
Hide file tree
Showing 5 changed files with 370 additions and 113 deletions.
1 change: 1 addition & 0 deletions src/main/java/com/alibaba/fastjson/asm/Opcodes.java
Expand Up @@ -109,6 +109,7 @@ public interface Opcodes {
int IF_ICMPGE = 162; // - int IF_ICMPGE = 162; // -
int IF_ICMPGT = 163; // - int IF_ICMPGT = 163; // -
int IF_ACMPEQ = 165; // - int IF_ACMPEQ = 165; // -
int IF_ACMPNE = 166; // -
int GOTO = 167; // - int GOTO = 167; // -
int RET = 169; // visitVarInsn int RET = 169; // visitVarInsn
int ARETURN = 176; // - int ARETURN = 176; // -
Expand Down
Expand Up @@ -101,7 +101,7 @@ private Class<?> defineClassPublic(String name, byte[] b, int off, int len) {
return classLoader.defineClassPublic(name, b, off, len); return classLoader.defineClassPublic(name, b, off, len);
} }


void _setFlag(MethodVisitor mw, Context context, int i) { private void _setFlag(MethodVisitor mw, Context context, int i) {
String varName = "_asm_flag_" + (i / 32); String varName = "_asm_flag_" + (i / 32);


mw.visitVarInsn(ILOAD, context.var(varName)); mw.visitVarInsn(ILOAD, context.var(varName));
Expand All @@ -110,15 +110,15 @@ void _setFlag(MethodVisitor mw, Context context, int i) {
mw.visitVarInsn(ISTORE, context.var(varName)); mw.visitVarInsn(ISTORE, context.var(varName));
} }


void _isFlag(MethodVisitor mw, Context context, int i, Label label) { private void _isFlag(MethodVisitor mw, Context context, int i, Label label) {
mw.visitVarInsn(ILOAD, context.var("_asm_flag_" + (i / 32))); mw.visitVarInsn(ILOAD, context.var("_asm_flag_" + (i / 32)));
mw.visitLdcInsn(1 << i); mw.visitLdcInsn(1 << i);
mw.visitInsn(IAND); mw.visitInsn(IAND);


mw.visitJumpInsn(IFEQ, label); mw.visitJumpInsn(IFEQ, label);
} }


void _deserialzeArrayMapping(ClassWriter cw, Context context) { private void _deserialzeArrayMapping(ClassWriter cw, Context context) {
MethodVisitor mw = new MethodWriter(cw, ACC_PUBLIC, "deserialzeArrayMapping", MethodVisitor mw = new MethodWriter(cw, ACC_PUBLIC, "deserialzeArrayMapping",
"(L" + DefaultJSONParser + ";Ljava/lang/reflect/Type;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;", "(L" + DefaultJSONParser + ";Ljava/lang/reflect/Type;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
null, null); null, null);
Expand Down Expand Up @@ -331,7 +331,7 @@ void _deserialzeArrayMapping(ClassWriter cw, Context context) {


mw.visitLabel(objElseIf_); mw.visitLabel(objElseIf_);


quickNextToken_(context, mw, JSONToken.LBRACKET); _quickNextToken(context, mw, JSONToken.LBRACKET);


_deserObject(context, mw, fieldInfo, fieldClass, i); _deserObject(context, mw, fieldInfo, fieldClass, i);


Expand Down Expand Up @@ -409,7 +409,7 @@ void _deserialzeArrayMapping(ClassWriter cw, Context context) {
mw.visitEnd(); mw.visitEnd();
} }


void _deserialze(ClassWriter cw, Context context) { private void _deserialze(ClassWriter cw, Context context) {
if (context.fieldInfoList.length == 0) { if (context.fieldInfoList.length == 0) {
return; return;
} }
Expand Down Expand Up @@ -941,7 +941,7 @@ private void _deserialize_endCheck(Context context, MethodVisitor mw, Label rese
mw.visitJumpInsn(IF_ICMPNE, reset_); mw.visitJumpInsn(IF_ICMPNE, reset_);


// mw.visitLabel(nextToken_); // mw.visitLabel(nextToken_);
quickNextTokenComma_(context, mw); _quickNextTokenComma(context, mw);
} }


private void _deserialze_list_obj(Context context, MethodVisitor mw, Label reset_, FieldInfo fieldInfo, private void _deserialze_list_obj(Context context, MethodVisitor mw, Label reset_, FieldInfo fieldInfo,
Expand Down Expand Up @@ -1016,7 +1016,7 @@ private void _deserialze_list_obj(Context context, MethodVisitor mw, Label reset
mw.visitLdcInsn(JSONToken.LBRACE); mw.visitLdcInsn(JSONToken.LBRACE);
mw.visitVarInsn(ISTORE, context.var("fastMatchToken")); mw.visitVarInsn(ISTORE, context.var("fastMatchToken"));


quickNextToken_(context, mw, JSONToken.LBRACE); _quickNextToken(context, mw, JSONToken.LBRACE);
} }


{ // setContext { // setContext
Expand Down Expand Up @@ -1085,7 +1085,7 @@ private void _deserialze_list_obj(Context context, MethodVisitor mw, Label reset
mw.visitVarInsn(ILOAD, context.var("fastMatchToken")); mw.visitVarInsn(ILOAD, context.var("fastMatchToken"));
mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "nextToken", "(I)V"); mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "nextToken", "(I)V");
} else { } else {
quickNextToken_(context, mw, JSONToken.LBRACE); _quickNextToken(context, mw, JSONToken.LBRACE);
} }


mw.visitJumpInsn(GOTO, loop_); mw.visitJumpInsn(GOTO, loop_);
Expand All @@ -1105,13 +1105,13 @@ private void _deserialze_list_obj(Context context, MethodVisitor mw, Label reset
mw.visitLdcInsn(JSONToken.RBRACKET); mw.visitLdcInsn(JSONToken.RBRACKET);
mw.visitJumpInsn(IF_ICMPNE, reset_); mw.visitJumpInsn(IF_ICMPNE, reset_);


quickNextTokenComma_(context, mw); _quickNextTokenComma(context, mw);
// lexer.nextToken(JSONToken.COMMA); // lexer.nextToken(JSONToken.COMMA);


mw.visitLabel(_end_if); mw.visitLabel(_end_if);
} }


protected void quickNextToken_(Context context, MethodVisitor mw, int token) { private void _quickNextToken(Context context, MethodVisitor mw, int token) {
Label quickElse_ = new Label(), quickEnd_ = new Label(); Label quickElse_ = new Label(), quickEnd_ = new Label();
mw.visitVarInsn(ALOAD, context.var("lexer")); mw.visitVarInsn(ALOAD, context.var("lexer"));
mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "getCurrent", "()C"); mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "getCurrent", "()C");
Expand Down Expand Up @@ -1141,7 +1141,7 @@ protected void quickNextToken_(Context context, MethodVisitor mw, int token) {
mw.visitLabel(quickEnd_); mw.visitLabel(quickEnd_);
} }


protected void quickNextTokenComma_(Context context, MethodVisitor mw) { private void _quickNextTokenComma(Context context, MethodVisitor mw) {
Label quickElse_ = new Label(), quickElseIf0_ = new Label(), quickElseIf1_ = new Label(), quickElseIf2_ = new Label(), quickEnd_ = new Label(); Label quickElse_ = new Label(), quickElseIf0_ = new Label(), quickElseIf1_ = new Label(), quickElseIf2_ = new Label(), quickEnd_ = new Label();
mw.visitVarInsn(ALOAD, context.var("lexer")); mw.visitVarInsn(ALOAD, context.var("lexer"));
mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "getCurrent", "()C"); mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "getCurrent", "()C");
Expand Down

0 comments on commit 495824f

Please sign in to comment.