18
18
import java .util .concurrent .atomic .AtomicLong ;
19
19
import java .util .concurrent .atomic .AtomicLongArray ;
20
20
21
+ import static com .alibaba .fastjson2 .JSONWriter .Feature .*;
21
22
import static com .alibaba .fastjson2 .util .JDKUtils .UNSAFE_SUPPORT ;
22
23
23
24
public class ObjectWriterCreatorASM
@@ -1802,17 +1803,17 @@ private void gwFieldValueObject(
1802
1803
|| fieldClass == AtomicIntegerArray .class
1803
1804
|| Collection .class .isAssignableFrom (fieldClass )
1804
1805
|| fieldClass .isArray ()) {
1805
- nullFeatures |= JSONWriter . Feature . WriteNullListAsEmpty .mask ;
1806
- nullFeatures |= JSONWriter . Feature . NullAsDefaultValue .mask ;
1806
+ nullFeatures |= WriteNullListAsEmpty .mask ;
1807
+ nullFeatures |= NullAsDefaultValue .mask ;
1807
1808
} else if (Number .class .isAssignableFrom (fieldClass )) {
1808
- nullFeatures |= JSONWriter . Feature . WriteNullNumberAsZero .mask ;
1809
- nullFeatures |= JSONWriter . Feature . NullAsDefaultValue .mask ;
1809
+ nullFeatures |= WriteNullNumberAsZero .mask ;
1810
+ nullFeatures |= NullAsDefaultValue .mask ;
1810
1811
} else if (fieldClass == Boolean .class ) {
1811
- nullFeatures |= JSONWriter . Feature . WriteNullBooleanAsFalse .mask ;
1812
- nullFeatures |= JSONWriter . Feature . NullAsDefaultValue .mask ;
1812
+ nullFeatures |= WriteNullBooleanAsFalse .mask ;
1813
+ nullFeatures |= NullAsDefaultValue .mask ;
1813
1814
} else if (fieldClass == String .class ) {
1814
- nullFeatures |= JSONWriter . Feature . WriteNullStringAsEmpty .mask ;
1815
- nullFeatures |= JSONWriter . Feature . NullAsDefaultValue .mask ;
1815
+ nullFeatures |= WriteNullStringAsEmpty .mask ;
1816
+ nullFeatures |= NullAsDefaultValue .mask ;
1816
1817
}
1817
1818
mwc .genIsEnabled (nullFeatures , notNull_ );
1818
1819
// mw.visitVarInsn(Opcodes.ILOAD, mwc.var(WRITE_NULLS));
@@ -1946,9 +1947,7 @@ private void gwFieldValueList(
1946
1947
mw .visitJumpInsn (Opcodes .GOTO , notNull_ );
1947
1948
1948
1949
mw .visitLabel (null_ );
1949
- // if (!jw.isWriteNulls())
1950
- mw .visitVarInsn (Opcodes .ILOAD , mwc .var (WRITE_NULLS ));
1951
- mw .visitJumpInsn (Opcodes .IFEQ , notNull_ );
1950
+ mwc .genIsEnabled (WriteNulls .mask | NullAsDefaultValue .mask | WriteNullListAsEmpty .mask , notNull_ );
1952
1951
1953
1952
// writeFieldName(w);
1954
1953
gwFieldName (mwc , i );
@@ -2044,10 +2043,11 @@ private void gwInt32(
2044
2043
2045
2044
mw .visitJumpInsn (Opcodes .IFNONNULL , notNull_ );
2046
2045
2047
- mw .visitVarInsn (Opcodes .ILOAD , mwc .var (WRITE_NULLS ));
2048
- mw .visitJumpInsn (Opcodes .IFNE , writeNullValue_ );
2049
-
2050
- mw .visitJumpInsn (Opcodes .GOTO , endIfNull_ );
2046
+ mwc .genIsEnabled (
2047
+ WriteNulls .mask | NullAsDefaultValue .mask | WriteNullNumberAsZero .mask ,
2048
+ writeNullValue_ ,
2049
+ endIfNull_
2050
+ );
2051
2051
2052
2052
mw .visitLabel (writeNullValue_ );
2053
2053
@@ -2104,10 +2104,11 @@ private void gwInt64(
2104
2104
2105
2105
mw .visitJumpInsn (Opcodes .IFNONNULL , notNull_ );
2106
2106
2107
- mw .visitVarInsn (Opcodes .ILOAD , mwc .var (WRITE_NULLS ));
2108
- mw .visitJumpInsn (Opcodes .IFNE , writeNullValue_ );
2109
-
2110
- mw .visitJumpInsn (Opcodes .GOTO , endIfNull_ );
2107
+ mwc .genIsEnabled (
2108
+ WriteNulls .mask | NullAsDefaultValue .mask | WriteNullNumberAsZero .mask ,
2109
+ writeNullValue_ ,
2110
+ endIfNull_
2111
+ );
2111
2112
2112
2113
mw .visitLabel (writeNullValue_ );
2113
2114
@@ -2663,35 +2664,38 @@ private void gwFieldValueString(
2663
2664
2664
2665
Label writeNullValue_ = new Label (), writeNull_ = new Label ();
2665
2666
2666
- final long defaultValueMask = JSONWriter . Feature . NullAsDefaultValue .mask
2667
- | JSONWriter . Feature . WriteNullNumberAsZero .mask
2668
- | JSONWriter . Feature . WriteNullBooleanAsFalse .mask
2669
- | JSONWriter . Feature . WriteNullListAsEmpty .mask
2670
- | JSONWriter . Feature . WriteNullStringAsEmpty .mask ;
2667
+ final long defaultValueMask = NullAsDefaultValue .mask
2668
+ | WriteNullNumberAsZero .mask
2669
+ | WriteNullBooleanAsFalse .mask
2670
+ | WriteNullListAsEmpty .mask
2671
+ | WriteNullStringAsEmpty .mask ;
2671
2672
2672
2673
// if (!jw.isWriteNulls())
2673
2674
if ((features & (JSONWriter .Feature .WriteNulls .mask
2674
2675
| defaultValueMask )) == 0 ) {
2675
- mw .visitVarInsn (Opcodes .ILOAD , mwc .var (WRITE_NULLS ));
2676
- mw .visitJumpInsn (Opcodes .IFNE , writeNull_ );
2677
-
2678
- mw .visitJumpInsn (Opcodes .GOTO , endIfNull_ );
2676
+ mwc .genIsEnabled (
2677
+ WriteNulls .mask | NullAsDefaultValue .mask | WriteNullStringAsEmpty .mask ,
2678
+ writeNull_ ,
2679
+ endIfNull_
2680
+ );
2679
2681
}
2680
2682
2681
2683
mw .visitLabel (writeNull_ );
2684
+ mwc .genIsDisabled (NotWriteDefaultValue .mask , endIfNull_ );
2685
+
2682
2686
// writeFieldName(w);
2683
2687
gwFieldName (mwc , i );
2684
2688
2685
2689
if ((features & defaultValueMask ) == 0 ) {
2686
- long mask = JSONWriter . Feature . NullAsDefaultValue .mask ;
2690
+ long mask = NullAsDefaultValue .mask ;
2687
2691
if (fieldClass == String .class ) {
2688
- mask |= JSONWriter . Feature . WriteNullStringAsEmpty .mask ;
2692
+ mask |= WriteNullStringAsEmpty .mask ;
2689
2693
} else if (fieldClass == Boolean .class ) {
2690
- mask |= JSONWriter . Feature . WriteNullBooleanAsFalse .mask ;
2694
+ mask |= WriteNullBooleanAsFalse .mask ;
2691
2695
} else if (Number .class .isAssignableFrom (fieldClass )) {
2692
2696
mask |= JSONWriter .Feature .WriteNullNumberAsZero .mask ;
2693
2697
} else if (Collection .class .isAssignableFrom (fieldClass )) {
2694
- mask |= JSONWriter . Feature . WriteNullListAsEmpty .mask ;
2698
+ mask |= WriteNullListAsEmpty .mask ;
2695
2699
}
2696
2700
2697
2701
mw .visitVarInsn (Opcodes .ALOAD , JSON_WRITER );
@@ -3094,9 +3098,8 @@ void genVariantsMethodBefore() {
3094
3098
mw .visitMethodInsn (Opcodes .INVOKEVIRTUAL , TYPE_JSON_WRITER , "getFeatures" , "()J" , false );
3095
3099
mw .visitVarInsn (Opcodes .LSTORE , var2 (CONTEXT_FEATURES ));
3096
3100
3097
- genIsEnabled (JSONWriter .Feature .NotWriteDefaultValue .mask );
3098
- mw .visitInsn (Opcodes .DUP );
3099
- mw .visitVarInsn (Opcodes .ISTORE , var (NOT_WRITE_DEFAULT_VALUE ));
3101
+ genIsEnabledAndAssign (NotWriteDefaultValue .mask , var (NOT_WRITE_DEFAULT_VALUE ));
3102
+ mw .visitVarInsn (Opcodes .ILOAD , var (NOT_WRITE_DEFAULT_VALUE ));
3100
3103
mw .visitJumpInsn (Opcodes .IFEQ , notDefault_ );
3101
3104
3102
3105
mw .visitInsn (Opcodes .ICONST_0 );
@@ -3105,14 +3108,10 @@ void genVariantsMethodBefore() {
3105
3108
3106
3109
mw .visitLabel (notDefault_ );
3107
3110
3108
- long features = JSONWriter .Feature .WriteNulls .mask
3109
- | JSONWriter .Feature .NullAsDefaultValue .mask
3110
- | JSONWriter .Feature .WriteNullBooleanAsFalse .mask
3111
- | JSONWriter .Feature .WriteNullStringAsEmpty .mask
3112
- | JSONWriter .Feature .WriteNullNumberAsZero .mask
3113
- | JSONWriter .Feature .WriteNullListAsEmpty .mask ;
3114
- genIsEnabled (features );
3115
- mw .visitVarInsn (Opcodes .ISTORE , var (WRITE_NULLS ));
3111
+ long features = WriteNulls .mask | NullAsDefaultValue .mask ;
3112
+ // genIsEnabled(features);
3113
+ // mw.visitVarInsn(Opcodes.ISTORE, var(WRITE_NULLS));
3114
+ genIsEnabledAndAssign (features , var (WRITE_NULLS ));
3116
3115
3117
3116
mw .visitLabel (end_ );
3118
3117
}
@@ -3126,19 +3125,32 @@ void genIsEnabled(long features, Label elseLabel) {
3126
3125
mw .visitJumpInsn (Opcodes .IFEQ , elseLabel );
3127
3126
}
3128
3127
3129
- void genIsEnabled (long features ) {
3130
- Label L1 = new Label (), L2 = new Label ();
3128
+ void genIsDisabled (long features , Label elseLabel ) {
3131
3129
mw .visitVarInsn (Opcodes .LLOAD , var2 (CONTEXT_FEATURES ));
3132
3130
mw .visitLdcInsn (features );
3133
3131
mw .visitInsn (Opcodes .LAND );
3134
3132
mw .visitInsn (Opcodes .LCONST_0 );
3135
3133
mw .visitInsn (Opcodes .LCMP );
3136
- mw .visitJumpInsn (Opcodes .IFEQ , L1 );
3137
- mw .visitInsn (Opcodes .ICONST_1 );
3138
- mw .visitJumpInsn (Opcodes .GOTO , L2 );
3139
- mw .visitLabel (L1 );
3140
- mw .visitInsn (Opcodes .ICONST_0 );
3141
- mw .visitLabel (L2 );
3134
+ mw .visitJumpInsn (Opcodes .IFNE , elseLabel );
3135
+ }
3136
+
3137
+ void genIsEnabled (long features , Label trueLabel , Label falseLabel ) {
3138
+ mw .visitVarInsn (Opcodes .LLOAD , var2 (CONTEXT_FEATURES ));
3139
+ mw .visitLdcInsn (features );
3140
+ mw .visitInsn (Opcodes .LAND );
3141
+ mw .visitInsn (Opcodes .LCONST_0 );
3142
+ mw .visitInsn (Opcodes .LCMP );
3143
+ mw .visitJumpInsn (Opcodes .IFEQ , falseLabel );
3144
+ mw .visitJumpInsn (Opcodes .GOTO , trueLabel );
3145
+ }
3146
+
3147
+ void genIsEnabledAndAssign (long features , int var ) {
3148
+ mw .visitVarInsn (Opcodes .LLOAD , var2 (CONTEXT_FEATURES ));
3149
+ mw .visitLdcInsn (features );
3150
+ mw .visitInsn (Opcodes .LAND );
3151
+ mw .visitInsn (Opcodes .LCONST_0 );
3152
+ mw .visitInsn (Opcodes .LCMP );
3153
+ mw .visitVarInsn (Opcodes .ISTORE , var );
3142
3154
}
3143
3155
3144
3156
private void loadFieldType (int fieldIndex , Type fieldType ) {
0 commit comments