From ebae1e18152617f11ac07827828f5740d4f2eb7e Mon Sep 17 00:00:00 2001 From: dcodeIO Date: Wed, 7 Dec 2016 11:26:59 +0100 Subject: [PATCH] Mimic spec-compliant behaviour in oneof getVirtual, see #523 --- src/inherits.js | 12 +++++------- src/util/pool.js | 2 +- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/inherits.js b/src/inherits.js index fdf6d2f97..6d6cda1e3 100644 --- a/src/inherits.js +++ b/src/inherits.js @@ -169,20 +169,18 @@ inherits.defineProperties = function defineProperties(prototype, type) { type.getOneofsArray().forEach(function(oneof) { util.prop(prototype, oneof.resolve().name, { get: function getVirtual() { - var keys = oneof.oneof; - for (var i = 0; i < keys.length; ++i) { - var field = oneof.parent.fields[keys[i]]; - if (this[keys[i]] != field.defaultValue) // eslint-disable-line eqeqeq + // > If the parser encounters multiple members of the same oneof on the wire, only the last member seen is used in the parsed message. + var keys = Object.keys(this); + for (var i = keys.length - 1; i > -1; --i) + if (oneof.oneof.indexOf(keys[i]) > -1) return keys[i]; - } return undefined; }, set: function setVirtual(value) { var keys = oneof.oneof; - for (var i = 0; i < keys.length; ++i) { + for (var i = 0; i < keys.length; ++i) if (keys[i] !== value) delete this[keys[i]]; - } } }); }); diff --git a/src/util/pool.js b/src/util/pool.js index ceb4c8328..55c228f95 100644 --- a/src/util/pool.js +++ b/src/util/pool.js @@ -27,4 +27,4 @@ function pool(alloc, slice, size) { offset = (offset | 7) + 1; return buf; }; -}; +}