diff options
Diffstat (limited to 'js/binary/reader.js')
-rw-r--r-- | js/binary/reader.js | 17 |
1 files changed, 8 insertions, 9 deletions
diff --git a/js/binary/reader.js b/js/binary/reader.js index 2dc3eb70..731587c7 100644 --- a/js/binary/reader.js +++ b/js/binary/reader.js @@ -290,7 +290,9 @@ jspb.BinaryReader.prototype.nextField = function() { nextWireType != jspb.BinaryConstants.WireType.DELIMITED && nextWireType != jspb.BinaryConstants.WireType.START_GROUP && nextWireType != jspb.BinaryConstants.WireType.END_GROUP) { - goog.asserts.fail('Invalid wire type'); + goog.asserts.fail( + 'Invalid wire type: %s (at position %s)', nextWireType, + this.fieldCursor_); this.error_ = true; return false; } @@ -388,8 +390,7 @@ jspb.BinaryReader.prototype.skipFixed64Field = function() { * Skips over the next group field in the binary stream. */ jspb.BinaryReader.prototype.skipGroup = function() { - // Keep a stack of start-group tags that must be matched by end-group tags. - var nestedGroups = [this.nextField_]; + var previousField = this.nextField_; do { if (!this.nextField()) { goog.asserts.fail('Unmatched start-group tag: stream EOF'); @@ -397,19 +398,17 @@ jspb.BinaryReader.prototype.skipGroup = function() { return; } if (this.nextWireType_ == - jspb.BinaryConstants.WireType.START_GROUP) { - // Nested group start. - nestedGroups.push(this.nextField_); - } else if (this.nextWireType_ == jspb.BinaryConstants.WireType.END_GROUP) { // Group end: check that it matches top-of-stack. - if (this.nextField_ != nestedGroups.pop()) { + if (this.nextField_ != previousField) { goog.asserts.fail('Unmatched end-group tag'); this.error_ = true; return; } + return; } - } while (nestedGroups.length > 0); + this.skipField(); + } while (true); }; |