Skip to content

Commit 482fb0b

Browse files
committed
Fixes keichi#16 Encding empty array
1 parent b4ae885 commit 482fb0b

File tree

3 files changed

+68
-12
lines changed

3 files changed

+68
-12
lines changed

lib/binary_parser.js

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -765,7 +765,6 @@ Parser.prototype.generateString = function(ctx) {
765765

766766
Parser.prototype.generate_encodeString = function(ctx) {
767767
var name = ctx.generateVariable(this.varName);
768-
var maxLen = ctx.generateTmpVariable();
769768

770769
// Get the length of string to encode
771770
if (this.options.length) {
@@ -916,18 +915,14 @@ Parser.prototype.generate_encodeArray = function(ctx) {
916915
ctx.generateError('"Encoding associative array not supported"');
917916
}
918917

918+
ctx.pushCode("var {0} = 0;", maxItems);
919+
920+
// Get default array length (if defined)
921+
ctx.pushCode("if({0}) {{1} = {0}.length;}", name, maxItems);
922+
919923
// Compute the desired count of array items to encode (min of array size and length option)
920924
if (length !== undefined) {
921-
var tmpLength = ctx.generateTmpVariable();
922-
ctx.pushCode("var {0} = {1};", tmpLength, length);
923-
ctx.pushCode(
924-
"var {0} = {1}.length > {2} ? {2} : {1}.length;",
925-
maxItems,
926-
name,
927-
tmpLength
928-
);
929-
} else {
930-
ctx.pushCode("var {0} = {1}.length;", maxItems, name);
925+
ctx.pushCode("{0} = {0} > {1} ? {1} : {0};", maxItems, length);
931926
}
932927

933928
// Save current encoding smartBuffer and allocate a new one
@@ -938,6 +933,8 @@ Parser.prototype.generate_encodeArray = function(ctx) {
938933
this.smartBufferSize
939934
);
940935

936+
ctx.pushCode("if({0} > 0) { ", maxItems);
937+
941938
ctx.pushCode("var {0} = 0;", itemCounter);
942939
if (
943940
typeof this.options.encodeUntil === "function" ||
@@ -990,6 +987,7 @@ Parser.prototype.generate_encodeArray = function(ctx) {
990987
savSmartBuffer
991988
);
992989
}
990+
ctx.pushCode("}"); // End of 'if(...) {'
993991

994992
var tmpBuffer = ctx.generateTmpVariable();
995993
ctx.pushCode("var {0} = smartBuffer.toBuffer()", tmpBuffer);

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "binary-parser-encoder",
3-
"version": "1.4.2",
3+
"version": "1.4.3",
44
"description": "Blazing-fast binary parser builder",
55
"main": "lib/binary_parser.js",
66
"devDependencies": {

test/zz_encoder_bugs.js

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,5 +160,63 @@ describe("Specific bugs testing", function() {
160160
var encoded = parser.encode(decoded);
161161
assert.deepEqual(encoded, Buffer.from("01020304050607", "hex"));
162162
});
163+
164+
it("should accept empty array to encode", function() {
165+
var parser = Parser.start().array("arr", {
166+
type: "uint8",
167+
readUntil: "eof" // Read until end of buffer
168+
});
169+
170+
var buffer = Buffer.from("", "hex");
171+
var decoded = parser.parse(buffer);
172+
173+
assert.deepEqual(decoded, {
174+
arr: []
175+
});
176+
177+
var encoded = parser.encode(decoded);
178+
assert.deepEqual(encoded, Buffer.from("", "hex"));
179+
});
180+
181+
it("should accept empty array to encode and encodeUntil function", function() {
182+
var parser = Parser.start().array("arr", {
183+
type: "uint8",
184+
readUntil: "eof", // Read until end of buffer
185+
encodeUntil: function(item, obj) {
186+
return false; // Never stop on content value
187+
}
188+
});
189+
190+
var buffer = Buffer.from("", "hex");
191+
var decoded = parser.parse(buffer);
192+
193+
assert.deepEqual(decoded, {
194+
arr: []
195+
});
196+
197+
var encoded = parser.encode(decoded);
198+
assert.deepEqual(encoded, Buffer.from("", "hex"));
199+
});
200+
201+
it("should accept undefined or null array", function() {
202+
var parser = Parser.start().array("arr", {
203+
type: "uint8",
204+
readUntil: "eof" // Read until end of buffer
205+
});
206+
207+
var buffer = Buffer.from("", "hex");
208+
var decoded = parser.parse(buffer);
209+
210+
// Decode an empty buffer as an empty array
211+
assert.deepEqual(decoded, {
212+
arr: []
213+
});
214+
215+
// Encode undefined, null or empty array as an empty buffer
216+
[{}, { arr: undefined }, { arr: null }, { arr: [] }].forEach(data => {
217+
let encoded = parser.encode(data);
218+
assert.deepEqual(encoded, Buffer.from("", "hex"));
219+
});
220+
});
163221
});
164222
});

0 commit comments

Comments
 (0)