summaryrefslogtreecommitdiff
path: root/frontend-old/node_modules/protobufjs/src/decoder.js
diff options
context:
space:
mode:
Diffstat (limited to 'frontend-old/node_modules/protobufjs/src/decoder.js')
-rw-r--r--frontend-old/node_modules/protobufjs/src/decoder.js127
1 files changed, 127 insertions, 0 deletions
diff --git a/frontend-old/node_modules/protobufjs/src/decoder.js b/frontend-old/node_modules/protobufjs/src/decoder.js
new file mode 100644
index 0000000..07a671b
--- /dev/null
+++ b/frontend-old/node_modules/protobufjs/src/decoder.js
@@ -0,0 +1,127 @@
+"use strict";
+module.exports = decoder;
+
+var Enum = require("./enum"),
+ types = require("./types"),
+ util = require("./util");
+
+function missing(field) {
+ return "missing required '" + field.name + "'";
+}
+
+/**
+ * Generates a decoder specific to the specified message type.
+ * @param {Type} mtype Message type
+ * @returns {Codegen} Codegen instance
+ */
+function decoder(mtype) {
+ /* eslint-disable no-unexpected-multiline */
+ var gen = util.codegen(["r", "l", "e"], mtype.name + "$decode")
+ ("if(!(r instanceof Reader))")
+ ("r=Reader.create(r)")
+ ("var c=l===undefined?r.len:r.pos+l,m=new this.ctor" + (mtype.fieldsArray.filter(function(field) { return field.map; }).length ? ",k,value" : ""))
+ ("while(r.pos<c){")
+ ("var t=r.uint32()")
+ ("if(t===e)")
+ ("break")
+ ("switch(t>>>3){");
+
+ var i = 0;
+ for (; i < /* initializes */ mtype.fieldsArray.length; ++i) {
+ var field = mtype._fieldsArray[i].resolve(),
+ type = field.resolvedType instanceof Enum ? "int32" : field.type,
+ ref = "m" + util.safeProp(field.name); gen
+ ("case %i: {", field.id);
+
+ // Map fields
+ if (field.map) { gen
+ ("if(%s===util.emptyObject)", ref)
+ ("%s={}", ref)
+ ("var c2 = r.uint32()+r.pos");
+
+ if (types.defaults[field.keyType] !== undefined) gen
+ ("k=%j", types.defaults[field.keyType]);
+ else gen
+ ("k=null");
+
+ if (types.defaults[type] !== undefined) gen
+ ("value=%j", types.defaults[type]);
+ else gen
+ ("value=null");
+
+ gen
+ ("while(r.pos<c2){")
+ ("var tag2=r.uint32()")
+ ("switch(tag2>>>3){")
+ ("case 1: k=r.%s(); break", field.keyType)
+ ("case 2:");
+
+ if (types.basic[type] === undefined) gen
+ ("value=types[%i].decode(r,r.uint32())", i); // can't be groups
+ else gen
+ ("value=r.%s()", type);
+
+ gen
+ ("break")
+ ("default:")
+ ("r.skipType(tag2&7)")
+ ("break")
+ ("}")
+ ("}");
+
+ if (types.long[field.keyType] !== undefined) gen
+ ("%s[typeof k===\"object\"?util.longToHash(k):k]=value", ref);
+ else gen
+ ("%s[k]=value", ref);
+
+ // Repeated fields
+ } else if (field.repeated) { gen
+
+ ("if(!(%s&&%s.length))", ref, ref)
+ ("%s=[]", ref);
+
+ // Packable (always check for forward and backward compatiblity)
+ if (types.packed[type] !== undefined) gen
+ ("if((t&7)===2){")
+ ("var c2=r.uint32()+r.pos")
+ ("while(r.pos<c2)")
+ ("%s.push(r.%s())", ref, type)
+ ("}else");
+
+ // Non-packed
+ if (types.basic[type] === undefined) gen(field.delimited
+ ? "%s.push(types[%i].decode(r,undefined,((t&~7)|4)))"
+ : "%s.push(types[%i].decode(r,r.uint32()))", ref, i);
+ else gen
+ ("%s.push(r.%s())", ref, type);
+
+ // Non-repeated
+ } else if (types.basic[type] === undefined) gen(field.delimited
+ ? "%s=types[%i].decode(r,undefined,((t&~7)|4))"
+ : "%s=types[%i].decode(r,r.uint32())", ref, i);
+ else gen
+ ("%s=r.%s()", ref, type);
+ gen
+ ("break")
+ ("}");
+ // Unknown fields
+ } gen
+ ("default:")
+ ("r.skipType(t&7)")
+ ("break")
+
+ ("}")
+ ("}");
+
+ // Field presence
+ for (i = 0; i < mtype._fieldsArray.length; ++i) {
+ var rfield = mtype._fieldsArray[i];
+ if (rfield.required) gen
+ ("if(!m.hasOwnProperty(%j))", rfield.name)
+ ("throw util.ProtocolError(%j,{instance:m})", missing(rfield));
+ }
+
+ return gen
+ ("return m");
+ /* eslint-enable no-unexpected-multiline */
+}