Skip to content

Commit 790058d

Browse files
committed
#20 fixed NPE in DSL builder if a bit field in a base class defined without outBitNumber
1 parent a993cad commit 790058d

File tree

2 files changed

+25
-1
lines changed

2 files changed

+25
-1
lines changed

jbbp/src/main/java/com/igormaznitsa/jbbp/utils/JBBPDslBuilder.java

+7-1
Original file line numberDiff line numberDiff line change
@@ -1933,7 +1933,13 @@ String getName() {
19331933
}
19341934

19351935
JBBPBitNumber getBitNumber(final BinField field) {
1936-
return field.bin.outBitNumber() == JBBPBitNumber.BITS_8 ? this.bin.outBitNumber() : field.bin.outBitNumber();
1936+
final JBBPBitNumber result;
1937+
if (field.bin.outBitNumber() == JBBPBitNumber.BITS_8) {
1938+
result = this.bin == null ? JBBPBitNumber.BITS_8 : this.bin.outBitNumber();
1939+
} else {
1940+
result = field.bin.outBitNumber();
1941+
}
1942+
return result;
19371943
}
19381944
}
19391945

jbbp/src/test/java/com/igormaznitsa/jbbp/utils/JBBPDslBuilderTest.java

+18
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
package com.igormaznitsa.jbbp.utils;
22

3+
import com.igormaznitsa.jbbp.JBBPParser;
34
import com.igormaznitsa.jbbp.io.JBBPBitNumber;
45
import com.igormaznitsa.jbbp.io.JBBPByteOrder;
56
import com.igormaznitsa.jbbp.mapper.Bin;
67
import com.igormaznitsa.jbbp.mapper.BinType;
8+
import com.igormaznitsa.jbbp.model.JBBPFieldArrayBit;
9+
import com.igormaznitsa.jbbp.model.JBBPFieldStruct;
710
import org.junit.jupiter.api.Test;
811
import org.junit.jupiter.api.function.Executable;
912

@@ -495,6 +498,21 @@ class Internal {
495498
assertEquals("Test{int a;<int b;int c;d[a+b]{short a;short[8] b;}}", Begin().AnnotatedClass(Test.class).End());
496499
}
497500

501+
@Test
502+
public void testReportedIssue_20_NPEforOutBitNumber() throws Exception {
503+
class BreakJBBPDslBuilder {
504+
@Bin(outOrder = 1, comment = "Reserved", type = BinType.BIT_ARRAY, extra = "4")
505+
public byte[] reserved;
506+
}
507+
508+
final String dsl = Begin().AnnotatedClass(BreakJBBPDslBuilder.class).End();
509+
510+
assertEquals("BreakJBBPDslBuilder{bit:8[4] reserved;}", dsl);
511+
512+
JBBPFieldStruct struct = JBBPParser.prepare(dsl).parse(new byte[] {1, 2, 3, 4});
513+
assertArrayEquals(new byte[] {1, 2, 3, 4}, struct.findFieldForType(JBBPFieldStruct.class).findFieldForType(JBBPFieldArrayBit.class).getArray());
514+
}
515+
498516
@Test
499517
public void testAnotatedClass_AnnottatedAllTypes() {
500518
class Test {

0 commit comments

Comments
 (0)