Skip to content

Commit

Permalink
Explode language for incremental serializers.
Browse files Browse the repository at this point in the history
  • Loading branch information
flatheadmill committed Nov 21, 2015
1 parent 2818284 commit a4938f0
Show file tree
Hide file tree
Showing 3 changed files with 94 additions and 75 deletions.
59 changes: 30 additions & 29 deletions compose/serializer/inc.js
Expand Up @@ -56,15 +56,15 @@ Generator.prototype.nested = function (definition) {
')
}

Generator.prototype.alternation = function (name, field) {
Generator.prototype.alternation = function (packet) {
var step = this.step++
this.forever = true
field.choose.forEach(function (choice, index) {
packet.choose.forEach(function (choice, index) {
var when = choice.write.when || {}, test
if (when.range != null) {
var range = []
if (when.range.from) {
range.push(when.range.from + ' <= frame.object.' + name)
range.push(when.range.from + ' <= frame.object.' + packet.name)
}
if (when.range.to) {
range.push('frame.object.' + name + ' < ' + when.range.to)
Expand All @@ -81,8 +81,9 @@ Generator.prototype.alternation = function (name, field) {
}
})
var sources = [], dispatch = ''
field.choose.forEach(function (choice) {
var compiled = this.subSerialize(name, choice.read)
packet.choose.forEach(function (choice) {
choice.read.name = packet.name
var compiled = this.subSerialize(choice.read)
dispatch = $(' \n\
// __reference__ \n\
', dispatch, ' \n\
Expand Down Expand Up @@ -117,76 +118,76 @@ Generator.prototype.alternation = function (name, field) {
return { step: step, source: source }
}

Generator.prototype.lengthEncoded = function (name, field) {
Generator.prototype.lengthEncoded = function (packet) {
var source = ''
this.forever = true
var step = this.step
var again = this.step + 2
source = $(' \n\
// __reference__ \n\
', this.integer(explode(field.length), 'frame.object.' + name + '.length').source, '\n\
', this.integer(explode(packet.length), 'frame.object.' + packet.name + '.length').source, '\n\
// __blank__ \n\
this.step = ' + again + ' \n\
// __blank__ \n\
case ' + (this.step++) + ': \n\
// __blank__ \n\
this.stack.push(frame = { \n\
object: frame.object.' + name + '[frame.index], \n\
object: frame.object.' + packet.name + '[frame.index], \n\
index: 0 \n\
}) \n\
this.step = ' + this.step + ' \n\
// __blank__ \n\
', this.nested(field.element), ' \n\
', this.nested(packet.element), ' \n\
// __blank__ \n\
this.stack.pop() \n\
frame = this.stack[this.stack.length - 1] \n\
if (++frame.index != frame.object.' + name + '.length) { \n\
if (++frame.index != frame.object.' + packet.name + '.length) { \n\
this.step = ' + again + ' \n\
continue \n\
} \n\
')
return { step: step, source: source }
}

Generator.prototype.subSerialize = function (name, field) {
if (field.type == 'alternation') {
return this.alternation(name, field)
} else if (field.length) {
return this.lengthEncoded(name, field)
} else {
field = explode(field)
Generator.prototype.subSerialize = function (packet) {
switch (packet.type) {
case 'alternation':
return this.alternation(packet)
case 'lengthEncoded':
return this.lengthEncoded(packet)
default:
var field = explode(packet)
if (field.type === 'integer') {
return this.integer(field, 'frame.object.' + name)
return this.integer(field, 'frame.object.' + packet.name)
}
}
}

Generator.prototype.serialize = function (definition) {
var sources = []
for (var name in definition) {
var source = this.subSerialize(name, definition[name]).source
definition.fields.forEach(function (packet) {
var source = this.subSerialize(packet).source
sources.push($(' \n\
// __reference__ \n\
', source, ' \n\
this.step = ' + this.step + ' \n\
'))
}
}, this)
return joinSources(sources)
}

function parser (name, definition) {
return new Generator(name, definition).generate()
}

function Generator (name, definition) {
function Generator (packet) {
this.step = 0
this.name = name
this.definition = definition
this.packet = packet
this.variables = new Variables
}

Generator.prototype.generate = function () {
var source = this.serialize(this.definition)
var source = this.serialize(this.packet)
var dispatch = $(' \n\
switch (this.step) { \n\
', source, ' \n\
Expand All @@ -205,7 +206,7 @@ Generator.prototype.generate = function () {
')
}
return $(' \n\
serializers.' + this.name + ' = function (object) { \n\
serializers.' + this.packet.name + ' = function (object) { \n\
this.step = 0 \n\
this.bite = 0 \n\
this.stop = 0 \n\
Expand All @@ -216,7 +217,7 @@ Generator.prototype.generate = function () {
}] \n\
} \n\
// __blank__ \n\
serializers.' + this.name + '.prototype.serialize = function (engine) { \n\
serializers.' + this.packet.name + '.prototype.serialize = function (engine) { \n\
var buffer = engine.buffer \n\
var start = engine.start \n\
var end = engine.end \n\
Expand All @@ -236,7 +237,7 @@ module.exports = function (compiler, definition) {
var source = $(' \n\
var serializers = {} \n\
')
Object.keys(definition).forEach(function (packet) {
definition.forEach(function (packet) {
source = $(' \n\
', source, ' \n\
// __blank__ \n\
Expand All @@ -246,7 +247,7 @@ module.exports = function (compiler, definition) {
source = $(' \n\
', source, ' \n\
// __blank__ \n\
return serializers \n\
return serializers \n\
')
return compiler(source)
}
68 changes: 39 additions & 29 deletions t/serialize/inc/alternation.t.js
Expand Up @@ -6,35 +6,45 @@ function prove (assert) {
var composer = require('../../../compose/serializer/inc.js')
var filename = path.resolve(__filename, '../../../generated/alternation.serialize.inc.js')

var serializers = composer(compiler(filename), {
object: {
number: {
type: 'alternation',
select: { endianess: 'b', bits: 8 },
choose: [{
read: {
when: { and: 0x80 },
endianess: 'b',
bits: 16
},
write: {
when: { range: { from: 0x80 } },
endianess: 'b',
bits: 16
}
}, {
read: {
endianess: 'b',
bits: 8
},
write: {
endianess: 'b',
bits: 8
}
}]
}
}
})
var serializers = composer(compiler(filename), [{
type: 'structure',
name: 'object',
fields: [{
type: 'alternation',
name: 'number',
select: {
type: 'integer',
endianess: 'b',
bits: 8
},
choose: [{
read: {
when: { and: 0x80 },
type: 'integer',
endianess: 'b',
bits: 16
},
write: {
when: { range: { from: 0x80 } },
type: 'integer',
endianess: 'b',
bits: 16
}
}, {
read: {
type: 'integer',
endianess: 'b',
bits: 8
},
write: {
type: 'integer',
endianess: 'b',
bits: 8
}
}]
}]
}])

var bufferLength = 2
for (var i = 0; i < bufferLength; i++) {
var buffer = new Buffer(bufferLength)
Expand Down
42 changes: 25 additions & 17 deletions t/serialize/inc/nested.t.js
Expand Up @@ -6,26 +6,34 @@ function prove (assert) {
var composer = require('../../../compose/serializer/inc.js')
var filename = path.resolve(__filename, '../../../generated/nested.serialize.inc.js')

var serializers = composer(compiler(filename), {
object: {
values: {
length: {
var serializers = composer(compiler(filename), [{
type: 'structure',
name: 'object',
fields: [{
type: 'lengthEncoded',
name: 'values',
length: {
type: 'integer',
endianess: 'b',
bits: 16
},
element: {
type: 'structure',
fields: [{
type: 'integer',
name: 'key',
endianess: 'b',
bits: 16
},
element: {
key: {
endianess: 'b',
bits: 16
},
value: {
endianess: 'b',
bits: 16
}
}
}, {
type: 'integer',
name: 'value',
endianess: 'b',
bits: 16
}]
}
}
})
}]
}])

var bufferLength = 10
for (var i = 0; i < bufferLength; i++) {
var buffer = new Buffer(bufferLength)
Expand Down

0 comments on commit a4938f0

Please sign in to comment.