Implement new context syntax

This commit is contained in:
roblabla 2015-09-23 15:05:10 +02:00
parent 54337cc068
commit f9484d9444
3 changed files with 28 additions and 27 deletions

View File

@ -97,17 +97,14 @@ function sizeOfArray(value, typeArgs, rootNode) {
} }
function readContainer(buffer, offset, typeArgs, rootNode) { function readContainer(buffer, offset, typeArgs, context) {
var results = { var results = {
value: {}, value: { "..": context },
size: 0 size: 0
}; };
var backupThis = rootNode.this;
rootNode.this = results.value;
typeArgs.forEach((typeArg) => { typeArgs.forEach((typeArg) => {
var readResults;
tryCatch(() => { tryCatch(() => {
readResults = this.read(buffer, offset, typeArg.type, rootNode); var readResults = this.read(buffer, offset, typeArg.type, results.value);
results.size += readResults.size; results.size += readResults.size;
offset += readResults.size; offset += readResults.size;
if (typeArg.anon) { if (typeArg.anon) {
@ -124,19 +121,18 @@ function readContainer(buffer, offset, typeArgs, rootNode) {
throw e; throw e;
}); });
}); });
rootNode.this = backupThis; delete results.value[".."];
return results; return results;
} }
function writeContainer(value, buffer, offset, typeArgs, rootNode) { function writeContainer(value, buffer, offset, typeArgs, context) {
var backupThis = rootNode.this; value[".."] = context;
rootNode.this = value;
typeArgs.forEach((typeArg) => { typeArgs.forEach((typeArg) => {
tryCatch(() => { tryCatch(() => {
if (typeArg.anon) if (typeArg.anon)
offset = this.write(value, buffer, offset, typeArg.type, rootNode); offset = this.write(value, buffer, offset, typeArg.type, value);
else else
offset = this.write(value[typeArg.name], buffer, offset, typeArg.type, rootNode); offset = this.write(value[typeArg.name], buffer, offset, typeArg.type, value);
}, (e) => { }, (e) => {
if (typeArgs && typeArg && typeArg.name) if (typeArgs && typeArg && typeArg.name)
addErrorField(e, typeArg.name); addErrorField(e, typeArg.name);
@ -145,20 +141,19 @@ function writeContainer(value, buffer, offset, typeArgs, rootNode) {
throw e; throw e;
}); });
}); });
rootNode.this = backupThis; delete value[".."];
return offset; return offset;
} }
function sizeOfContainer(value, typeArgs, rootNode) { function sizeOfContainer(value, typeArgs, context) {
value[".."] = context;
var size = 0; var size = 0;
var backupThis = rootNode.this;
rootNode.this = value;
typeArgs.forEach((typeArg) => { typeArgs.forEach((typeArg) => {
tryCatch(() => { tryCatch(() => {
if (typeArg.anon) if (typeArg.anon)
size += this.sizeOf(value, typeArg.type, rootNode); size += this.sizeOf(value, typeArg.type, value);
else else
size += this.sizeOf(value[typeArg.name], typeArg.type, rootNode); size += this.sizeOf(value[typeArg.name], typeArg.type, value);
}, (e) => { }, (e) => {
if (typeArgs && typeArg && typeArg.name) if (typeArgs && typeArg && typeArg.name)
addErrorField(e, typeArg.name); addErrorField(e, typeArg.name);
@ -167,7 +162,7 @@ function sizeOfContainer(value, typeArgs, rootNode) {
throw e; throw e;
}); });
}); });
rootNode.this = backupThis; delete value[".."];
return size; return size;
} }

View File

@ -63,7 +63,7 @@ var packetStates = packetIndexes.packetStates;
function createPacketBuffer(packetName, state, params, isServer) { function createPacketBuffer(packetName, state, params, isServer) {
var direction = !isServer ? 'toServer' : 'toClient'; var direction = !isServer ? 'toServer' : 'toClient';
var packetId = packetIds[state][direction][packetName]; var packetId = packetIds[state][direction][packetName];
assert.notEqual(packetId, undefined); assert.notEqual(packetId, undefined, `${state}.${isServer}.${packetName} : ${packetId}`);
var packet = get(packetName, state, !isServer); var packet = get(packetName, state, !isServer);
assert.notEqual(packet, null); assert.notEqual(packet, null);
@ -140,7 +140,8 @@ function parsePacketData(buffer, state, isServer, packetsToParse = {"packet": tr
results.data = res.value; results.data = res.value;
cursor += res.size; cursor += res.size;
if(buffer.length > cursor) if(buffer.length > cursor)
throw new Error(`Read error for ${packetName} : Packet data not entirely read`); throw new Error(`Read error for ${packetName} : Packet data not entirely read :
${JSON.stringify(results)}`);
debug(results); debug(results);
return results; return results;
} }

View File

@ -5,13 +5,18 @@ module.exports = {
tryCatch: tryCatch, tryCatch: tryCatch,
}; };
function getField(countField, rootNode) { function getField(countField, context) {
var countFieldArr = countField.split("."); var countFieldArr = countField.split("/");
var count = rootNode; var i = 0;
for(var index = 0; index < countFieldArr.length; index++) { if (countFieldArr[i] === "") {
count = count[countFieldArr[index]]; while (context.hasOwnProperty(".."))
context = context[".."];
i++;
} }
return count; for(; i < countFieldArr.length; i++) {
context = context[countFieldArr[i]];
}
return context;
} }
function getFieldInfo(fieldInfo) { function getFieldInfo(fieldInfo) {