Skip to content

Commit

Permalink
fix adjust gwInt64, gwDouble, gwFloat method in alignment with gwInt3…
Browse files Browse the repository at this point in the history
…2, for issue #2952
  • Loading branch information
yanxutao89 committed Sep 15, 2024
1 parent 093cd5c commit 1b830ab
Show file tree
Hide file tree
Showing 2 changed files with 130 additions and 48 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2464,9 +2464,9 @@ private void gwInt64(
int i
) {
boolean jsonb = mwc.jsonb;
String classNameType = mwc.classNameType;
MethodWriter mw = mwc.mw;
Class<?> fieldClass = fieldWriter.fieldClass;
String classNameType = mwc.classNameType;

int FIELD_VALUE = mwc.var(fieldClass);

Expand All @@ -2478,43 +2478,59 @@ private void gwInt64(

mw.visitJumpInsn(Opcodes.IFNONNULL, notNull_);

mwc.genIsEnabled(
WriteNulls.mask | NullAsDefaultValue.mask | WriteNullNumberAsZero.mask,
writeNullValue_,
endIfNull_
);
boolean writeAsString = (fieldWriter.features & (WriteNonStringValueAsString.mask | WriteLongAsString.mask | BrowserCompatible.mask)) != 0;

mw.visitLabel(writeNullValue_);
if ((fieldWriter.features & (WriteNulls.mask | NullAsDefaultValue.mask | WriteNullNumberAsZero.mask)) == 0) {
mwc.genIsEnabled(
WriteNulls.mask | NullAsDefaultValue.mask | WriteNullNumberAsZero.mask,
writeNullValue_,
endIfNull_
);

gwFieldName(mwc, fieldWriter, i);
mw.visitLabel(writeNullValue_);

mw.visitVarInsn(Opcodes.ALOAD, JSON_WRITER);
mw.visitMethodInsn(Opcodes.INVOKEVIRTUAL, TYPE_JSON_WRITER, "writeInt64Null", "()V", false);
gwFieldName(mwc, fieldWriter, i);

mw.visitJumpInsn(Opcodes.GOTO, endIfNull_);
mw.visitVarInsn(Opcodes.ALOAD, JSON_WRITER);
mw.visitMethodInsn(Opcodes.INVOKEVIRTUAL, TYPE_JSON_WRITER, "writeInt64Null", "()V", false);
} else {
long features = fieldWriter.features;
if ((features & (WriteNullNumberAsZero.mask | NullAsDefaultValue.mask)) != 0) {
gwFieldName(mwc, fieldWriter, i);

mw.visitLabel(notNull_);
mw.visitVarInsn(Opcodes.ALOAD, JSON_WRITER);
mw.visitLdcInsn(0);
mw.visitMethodInsn(Opcodes.INVOKEVIRTUAL, TYPE_JSON_WRITER, "writeInt64", "(J)V", false);
} else { // (features & WriteNulls.mask) != 0
gwFieldName(mwc, fieldWriter, i);

if ((fieldWriter.features & (WriteNonStringValueAsString.mask | WriteLongAsString.mask | BrowserCompatible.mask)) == 0) {
gwFieldName(mwc, fieldWriter, i);
mw.visitVarInsn(Opcodes.ALOAD, JSON_WRITER);
mw.visitMethodInsn(Opcodes.INVOKEVIRTUAL, TYPE_JSON_WRITER, "writeNull", "()V", false);
}
}

mw.visitJumpInsn(Opcodes.GOTO, endIfNull_);

mw.visitLabel(notNull_);
if (writeAsString) {
mw.visitVarInsn(Opcodes.ALOAD, THIS);
mw.visitFieldInsn(Opcodes.GETFIELD, classNameType, fieldWriter(i), DESC_FIELD_WRITER);
mw.visitVarInsn(Opcodes.ALOAD, JSON_WRITER);

mw.visitVarInsn(Opcodes.ALOAD, FIELD_VALUE);
mw.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Long", "longValue", "()J", false);

mw.visitMethodInsn(Opcodes.INVOKEVIRTUAL, TYPE_JSON_WRITER, "writeInt64", "(J)V", false);
mw.visitMethodInsn(Opcodes.INVOKEVIRTUAL, TYPE_FIELD_WRITER, "writeInt64", METHOD_DESC_WRITE_J, false);
} else {
mw.visitVarInsn(Opcodes.ALOAD, THIS);
mw.visitFieldInsn(Opcodes.GETFIELD, classNameType, fieldWriter(i), DESC_FIELD_WRITER);
gwFieldName(mwc, fieldWriter, i);

mw.visitVarInsn(Opcodes.ALOAD, JSON_WRITER);

mw.visitVarInsn(Opcodes.ALOAD, FIELD_VALUE);
mw.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Long", "longValue", "()J", false);

mw.visitMethodInsn(Opcodes.INVOKEVIRTUAL, TYPE_FIELD_WRITER, "writeInt64", METHOD_DESC_WRITE_J, false);
mw.visitMethodInsn(Opcodes.INVOKEVIRTUAL, TYPE_JSON_WRITER, "writeInt64", "(J)V", false);
}

mw.visitLabel(endIfNull_);
}

Expand All @@ -2525,9 +2541,9 @@ private void gwDouble(
int i
) {
boolean jsonb = mwc.jsonb;
String classNameType = mwc.classNameType;
MethodWriter mw = mwc.mw;
Class<?> fieldClass = fieldWriter.fieldClass;
String classNameType = mwc.classNameType;

int FIELD_VALUE = mwc.var(fieldClass);

Expand All @@ -2539,43 +2555,59 @@ private void gwDouble(

mw.visitJumpInsn(Opcodes.IFNONNULL, notNull_);

mwc.genIsEnabled(
WriteNulls.mask | NullAsDefaultValue.mask | WriteNullNumberAsZero.mask,
writeNullValue_,
endIfNull_
);
boolean writeAsString = jsonb && (fieldWriter.features & WriteNonStringValueAsString.mask) != 0;

mw.visitLabel(writeNullValue_);
if ((fieldWriter.features & (WriteNulls.mask | NullAsDefaultValue.mask | WriteNullNumberAsZero.mask)) == 0) {
mwc.genIsEnabled(
WriteNulls.mask | NullAsDefaultValue.mask | WriteNullNumberAsZero.mask,
writeNullValue_,
endIfNull_
);

gwFieldName(mwc, fieldWriter, i);
mw.visitLabel(writeNullValue_);

mw.visitVarInsn(Opcodes.ALOAD, JSON_WRITER);
mw.visitMethodInsn(Opcodes.INVOKEVIRTUAL, TYPE_JSON_WRITER, "writeNumberNull", "()V", false);
gwFieldName(mwc, fieldWriter, i);

mw.visitJumpInsn(Opcodes.GOTO, endIfNull_);
mw.visitVarInsn(Opcodes.ALOAD, JSON_WRITER);
mw.visitMethodInsn(Opcodes.INVOKEVIRTUAL, TYPE_JSON_WRITER, "writeNumberNull", "()V", false);
} else {
long features = fieldWriter.features;
if ((features & (WriteNullNumberAsZero.mask | NullAsDefaultValue.mask)) != 0) {
gwFieldName(mwc, fieldWriter, i);

mw.visitLabel(notNull_);
mw.visitVarInsn(Opcodes.ALOAD, JSON_WRITER);
mw.visitLdcInsn(0);
mw.visitMethodInsn(Opcodes.INVOKEVIRTUAL, TYPE_FIELD_WRITER, "writeDouble", METHOD_DESC_WRITE_D, false);
} else { // (features & WriteNulls.mask) != 0
gwFieldName(mwc, fieldWriter, i);

if (jsonb && (fieldWriter.features & WriteNonStringValueAsString.mask) == 0) {
gwFieldName(mwc, fieldWriter, i);
mw.visitVarInsn(Opcodes.ALOAD, JSON_WRITER);
mw.visitMethodInsn(Opcodes.INVOKEVIRTUAL, TYPE_JSON_WRITER, "writeNull", "()V", false);
}
}

mw.visitJumpInsn(Opcodes.GOTO, endIfNull_);

mw.visitLabel(notNull_);
if (writeAsString) {
mw.visitVarInsn(Opcodes.ALOAD, THIS);
mw.visitFieldInsn(Opcodes.GETFIELD, classNameType, fieldWriter(i), DESC_FIELD_WRITER);
mw.visitVarInsn(Opcodes.ALOAD, JSON_WRITER);

mw.visitVarInsn(Opcodes.ALOAD, FIELD_VALUE);
mw.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Double", "doubleValue", "()D", false);

mw.visitMethodInsn(Opcodes.INVOKEVIRTUAL, TYPE_JSON_WRITER, "writeDouble", "(D)V", false);
mw.visitMethodInsn(Opcodes.INVOKEVIRTUAL, TYPE_FIELD_WRITER, "writeDouble", METHOD_DESC_WRITE_D, false);
} else {
mw.visitVarInsn(Opcodes.ALOAD, THIS);
mw.visitFieldInsn(Opcodes.GETFIELD, classNameType, fieldWriter(i), DESC_FIELD_WRITER);
gwFieldName(mwc, fieldWriter, i);

mw.visitVarInsn(Opcodes.ALOAD, JSON_WRITER);

mw.visitVarInsn(Opcodes.ALOAD, FIELD_VALUE);
mw.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Double", "doubleValue", "()D", false);

mw.visitMethodInsn(Opcodes.INVOKEVIRTUAL, TYPE_FIELD_WRITER, "writeDouble", METHOD_DESC_WRITE_D, false);
mw.visitMethodInsn(Opcodes.INVOKEVIRTUAL, TYPE_JSON_WRITER, "writeDouble", "(D)V", false);
}

mw.visitLabel(endIfNull_);
}

Expand All @@ -2586,9 +2618,9 @@ private void gwFloat(
int i
) {
boolean jsonb = mwc.jsonb;
String classNameType = mwc.classNameType;
MethodWriter mw = mwc.mw;
Class<?> fieldClass = fieldWriter.fieldClass;
String classNameType = mwc.classNameType;

int FIELD_VALUE = mwc.var(fieldClass);

Expand All @@ -2600,18 +2632,34 @@ private void gwFloat(

mw.visitJumpInsn(Opcodes.IFNONNULL, notNull_);

mwc.genIsEnabled(
WriteNulls.mask | NullAsDefaultValue.mask | WriteNullNumberAsZero.mask,
writeNullValue_,
endIfNull_
);
if ((fieldWriter.features & (WriteNulls.mask | NullAsDefaultValue.mask | WriteNullNumberAsZero.mask)) == 0) {
mwc.genIsEnabled(
WriteNulls.mask | NullAsDefaultValue.mask | WriteNullNumberAsZero.mask,
writeNullValue_,
endIfNull_
);

mw.visitLabel(writeNullValue_);
mw.visitLabel(writeNullValue_);

gwFieldName(mwc, fieldWriter, i);
gwFieldName(mwc, fieldWriter, i);

mw.visitVarInsn(Opcodes.ALOAD, JSON_WRITER);
mw.visitMethodInsn(Opcodes.INVOKEVIRTUAL, TYPE_JSON_WRITER, "writeNumberNull", "()V", false);
mw.visitVarInsn(Opcodes.ALOAD, JSON_WRITER);
mw.visitMethodInsn(Opcodes.INVOKEVIRTUAL, TYPE_JSON_WRITER, "writeNumberNull", "()V", false);
} else {
long features = fieldWriter.features;
if ((features & (WriteNullNumberAsZero.mask | NullAsDefaultValue.mask)) != 0) {
gwFieldName(mwc, fieldWriter, i);

mw.visitVarInsn(Opcodes.ALOAD, JSON_WRITER);
mw.visitLdcInsn(0);
mw.visitMethodInsn(Opcodes.INVOKEVIRTUAL, TYPE_JSON_WRITER, "writeFloat", "(D)V", false);
} else { // (features & WriteNulls.mask) != 0
gwFieldName(mwc, fieldWriter, i);

mw.visitVarInsn(Opcodes.ALOAD, JSON_WRITER);
mw.visitMethodInsn(Opcodes.INVOKEVIRTUAL, TYPE_JSON_WRITER, "writeNull", "()V", false);
}
}

mw.visitJumpInsn(Opcodes.GOTO, endIfNull_);

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.alibaba.fastjson2.issues_2900;

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONWriter;
import com.alibaba.fastjson2.annotation.JSONField;
import lombok.Data;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class Issue2952 {
@Test
public void test() {
assertEquals("{\"d\":null,\"f\":null,\"i\":null,\"l\":null,\"s\":null}", JSON.toJSONString(new C()));
}

@Data
public class C {
@JSONField(serializeFeatures = JSONWriter.Feature.WriteNulls)
private Long l;

@JSONField(serializeFeatures = JSONWriter.Feature.WriteNulls)
private Double d;

@JSONField(serializeFeatures = JSONWriter.Feature.WriteNulls)
private Integer i;

@JSONField(serializeFeatures = JSONWriter.Feature.WriteNulls)
private Float f;

@JSONField(serializeFeatures = JSONWriter.Feature.WriteNulls)
private String s;
}
}

0 comments on commit 1b830ab

Please sign in to comment.