|
|
|
@ -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]); |
|
|
|
|