aboutsummaryrefslogtreecommitdiff
path: root/js/message.js
diff options
context:
space:
mode:
authorJosh Haberman <jhaberman@gmail.com>2016-07-18 15:58:58 -0700
committerJosh Haberman <jhaberman@gmail.com>2016-07-18 15:58:58 -0700
commit7429b91edafef18585d55ada62ba4ff01b88958c (patch)
tree89e28f2af7609ad627a0e871c6d8a7df4249d3f9 /js/message.js
parent923eae8b16e4f9e7d121bc7b3084f4e717e2f166 (diff)
downloadprotobuf-7429b91edafef18585d55ada62ba4ff01b88958c.tar.gz
protobuf-7429b91edafef18585d55ada62ba4ff01b88958c.tar.bz2
protobuf-7429b91edafef18585d55ada62ba4ff01b88958c.zip
JavaScript: move extension binary info to separate struct.
Diffstat (limited to 'js/message.js')
-rw-r--r--js/message.js71
1 files changed, 43 insertions, 28 deletions
diff --git a/js/message.js b/js/message.js
index e8185dee..f746ee62 100644
--- a/js/message.js
+++ b/js/message.js
@@ -35,6 +35,7 @@
*/
goog.provide('jspb.ExtensionFieldInfo');
+goog.provide('jspb.ExtensionFieldBinaryInfo');
goog.provide('jspb.Message');
goog.require('goog.array');
@@ -84,19 +85,12 @@ goog.forwardDeclare('xid.String');
* @param {?function(new: jspb.Message, Array=)} ctor
* @param {?function((boolean|undefined),!jspb.Message):!Object} toObjectFn
* @param {number} isRepeated
- * @param {?function(number,?)=} opt_binaryReaderFn
- * @param {?function(number,?)|function(number,?,?,?,?,?)=} opt_binaryWriterFn
- * @param {?function(?,?)=} opt_binaryMessageSerializeFn
- * @param {?function(?,?)=} opt_binaryMessageDeserializeFn
- * @param {?boolean=} opt_isPacked
* @constructor
* @struct
* @template T
*/
jspb.ExtensionFieldInfo = function(fieldNumber, fieldName, ctor, toObjectFn,
- isRepeated, opt_binaryReaderFn, opt_binaryWriterFn,
- opt_binaryMessageSerializeFn, opt_binaryMessageDeserializeFn,
- opt_isPacked) {
+ isRepeated) {
/** @const */
this.fieldIndex = fieldNumber;
/** @const */
@@ -106,20 +100,37 @@ jspb.ExtensionFieldInfo = function(fieldNumber, fieldName, ctor, toObjectFn,
/** @const */
this.toObjectFn = toObjectFn;
/** @const */
- this.binaryReaderFn = opt_binaryReaderFn;
+ this.isRepeated = isRepeated;
+};
+
+/**
+ * Stores binary-related information for a single extension field.
+ * @param {!jspb.ExtensionFieldInfo<T>} fieldInfo
+ * @param {?function(number,?)=} binaryReaderFn
+ * @param {?function(number,?)|function(number,?,?,?,?,?)=} binaryWriterFn
+ * @param {?function(?,?)=} opt_binaryMessageSerializeFn
+ * @param {?function(?,?)=} opt_binaryMessageDeserializeFn
+ * @param {?boolean=} opt_isPacked
+ * @constructor
+ * @struct
+ * @template T
+ */
+jspb.ExtensionFieldBinaryInfo = function(fieldInfo, binaryReaderFn, binaryWriterFn,
+ binaryMessageSerializeFn, binaryMessageDeserializeFn, isPacked) {
/** @const */
- this.binaryWriterFn = opt_binaryWriterFn;
+ this.fieldInfo = fieldInfo;
/** @const */
- this.binaryMessageSerializeFn = opt_binaryMessageSerializeFn;
+ this.binaryReaderFn = binaryReaderFn;
/** @const */
- this.binaryMessageDeserializeFn = opt_binaryMessageDeserializeFn;
+ this.binaryWriterFn = binaryWriterFn;
/** @const */
- this.isRepeated = isRepeated;
+ this.binaryMessageSerializeFn = binaryMessageSerializeFn;
/** @const */
- this.isPacked = opt_isPacked;
+ this.binaryMessageDeserializeFn = binaryMessageDeserializeFn;
+ /** @const */
+ this.isPacked = isPacked;
};
-
/**
* @return {boolean} Does this field represent a sub Message?
*/
@@ -491,11 +502,13 @@ jspb.Message.toObjectExtension = function(proto, obj, extensions,
jspb.Message.serializeBinaryExtensions = function(proto, writer, extensions,
getExtensionFn) {
for (var fieldNumber in extensions) {
- var fieldInfo = extensions[fieldNumber];
+ var binaryFieldInfo = extensions[fieldNumber];
+ var fieldInfo = binaryFieldInfo.fieldInfo;
+
// The old codegen doesn't add the extra fields to ExtensionFieldInfo, so we
// need to gracefully error-out here rather than produce a null dereference
// below.
- if (!fieldInfo.binaryWriterFn) {
+ if (!binaryFieldInfo.binaryWriterFn) {
throw new Error('Message extension present that was generated ' +
'without binary serialization support');
}
@@ -508,16 +521,17 @@ jspb.Message.serializeBinaryExtensions = function(proto, writer, extensions,
// message may require binary support, so we can *only* catch this error
// here, at runtime (and this decoupled codegen is the whole point of
// extensions!).
- if (fieldInfo.binaryMessageSerializeFn) {
- fieldInfo.binaryWriterFn.call(writer, fieldInfo.fieldIndex,
- value, fieldInfo.binaryMessageSerializeFn);
+ if (binaryFieldInfo.binaryMessageSerializeFn) {
+ binaryFieldInfo.binaryWriterFn.call(writer, fieldInfo.fieldIndex,
+ value, binaryFieldInfo.binaryMessageSerializeFn);
} else {
throw new Error('Message extension present holding submessage ' +
'without binary support enabled, and message is ' +
'being serialized to binary format');
}
} else {
- fieldInfo.binaryWriterFn.call(writer, fieldInfo.fieldIndex, value);
+ binaryFieldInfo.binaryWriterFn.call(
+ writer, fieldInfo.fieldIndex, value);
}
}
}
@@ -535,12 +549,13 @@ jspb.Message.serializeBinaryExtensions = function(proto, writer, extensions,
*/
jspb.Message.readBinaryExtension = function(msg, reader, extensions,
getExtensionFn, setExtensionFn) {
- var fieldInfo = extensions[reader.getFieldNumber()];
- if (!fieldInfo) {
+ var binaryFieldInfo = extensions[reader.getFieldNumber()];
+ var fieldInfo = binaryFieldInfo.fieldInfo;
+ if (!binaryFieldInfo) {
reader.skipField();
return;
}
- if (!fieldInfo.binaryReaderFn) {
+ if (!binaryFieldInfo.binaryReaderFn) {
throw new Error('Deserializing extension whose generated code does not ' +
'support binary format');
}
@@ -548,14 +563,14 @@ jspb.Message.readBinaryExtension = function(msg, reader, extensions,
var value;
if (fieldInfo.isMessageType()) {
value = new fieldInfo.ctor();
- fieldInfo.binaryReaderFn.call(
- reader, value, fieldInfo.binaryMessageDeserializeFn);
+ binaryFieldInfo.binaryReaderFn.call(
+ reader, value, binaryFieldInfo.binaryMessageDeserializeFn);
} else {
// All other types.
- value = fieldInfo.binaryReaderFn.call(reader);
+ value = binaryFieldInfo.binaryReaderFn.call(reader);
}
- if (fieldInfo.isRepeated && !fieldInfo.isPacked) {
+ if (fieldInfo.isRepeated && !binaryFieldInfo.isPacked) {
var currentList = getExtensionFn.call(msg, fieldInfo);
if (!currentList) {
setExtensionFn.call(msg, fieldInfo, [value]);