Skip to content

Commit 2b0d8e6

Browse files
committed
modify binary-data-definer macro so that it accepts class names
New: define binary-data <foo> (<container-frame>) end; Old: define binary-data foo (container-frame) end;
1 parent 32f67b4 commit 2b0d8e6

File tree

4 files changed

+84
-73
lines changed

4 files changed

+84
-73
lines changed

binary-data-definer-macro.dylan

+41-28
Original file line numberDiff line numberDiff line change
@@ -227,22 +227,22 @@ define macro decoded-class-definer
227227
end;
228228

229229
define macro gen-classes
230-
{ gen-classes(?:name; ?superframe:name) }
230+
{ gen-classes("<" ## ?:name; "<" ## ?superframe:name) }
231231
=> { define inline method unparsed-class
232-
(type :: subclass("<" ## ?name ## ">"))
233-
=> (class == "<unparsed-" ## ?name ## ">")
234-
"<unparsed-" ## ?name ## ">"
232+
(type :: subclass("<" ## ?name))
233+
=> (class == "<unparsed-" ## ?name)
234+
"<unparsed-" ## ?name
235235
end;
236236

237237
define inline method decoded-class
238-
(type :: subclass("<" ## ?name ## ">"))
239-
=> (class == "<decoded-" ## ?name ## ">")
240-
"<decoded-" ## ?name ## ">"
238+
(type :: subclass("<" ## ?name))
239+
=> (class == "<decoded-" ## ?name)
240+
"<decoded-" ## ?name
241241
end;
242242

243-
define class "<unparsed-" ## ?name ## ">" ("<" ## ?name ## ">", "<unparsed-" ## ?superframe ## ">")
243+
define class "<unparsed-" ## ?name ("<" ## ?name, "<unparsed-" ## ?superframe)
244244
//sadly, inherited slots can't specify a type (and generate a warning if you try)
245-
inherited slot cache /* :: "<" ## ?name ## ">" */ = make("<decoded-" ## ?name ## ">"),
245+
inherited slot cache /* :: "<" ## ?name */ = make("<decoded-" ## ?name),
246246
init-keyword: cache:;
247247
end; }
248248
end;
@@ -266,6 +266,8 @@ define macro unparsed-frame-field-generator
266266
end;
267267
end;
268268

269+
ignore(?name);
270+
269271
define inline method ?name ## "-setter"
270272
(value, mframe :: ?frame-type) => (res)
271273
mframe.cache.?name := value;
@@ -274,6 +276,9 @@ define macro unparsed-frame-field-generator
274276
assemble-field-into(frame-field.field, mframe, subsequence(mframe.packet, start: start-offset(frame-field)));
275277
value;
276278
end;
279+
280+
ignore(?name ## "-setter");
281+
277282
}
278283
end;
279284

@@ -307,6 +312,8 @@ define macro enum-frame-field-generator
307312
end;
308313
end;
309314

315+
ignore(?name);
316+
310317
define inline method ?name ## "-setter"
311318
(value :: <symbol>, mframe :: "<decoded-" ## ?frame-type) => (res)
312319
let field = fields(mframe)[?field-index];
@@ -326,6 +333,9 @@ define macro enum-frame-field-generator
326333
let val :: <integer> = enum-field-symbol-to-int(field, value);
327334
?name ## "-setter" (val, mframe)
328335
end;
336+
337+
ignore(?name ## "-setter");
338+
329339
}
330340
end;
331341

@@ -361,6 +371,7 @@ define method parse-frame-field
361371
// frame-field.field.field-name, start, end-of-field, full-frame-size);
362372
end-of-field := full-frame-size;
363373
end;
374+
//format-out(" calling subsequence with start %d end %d (frame-size %d, my-length %d)\n", start, end-of-field, full-frame-size, my-length);
364375
let (value, length)
365376
= parse-frame-field-aux(frame-field.field,
366377
frame-field.frame,
@@ -564,28 +575,30 @@ define macro summary-generator
564575
end;
565576

566577
define macro container-frame-constructor
567-
{ container-frame-constructor(?:name) }
578+
{ container-frame-constructor("<" ## ?:name ## ">") }
568579
=> { define inline method ?name (#rest args)
569580
apply(make, "<" ## ?name ## ">", args)
570-
end }
581+
end;
582+
583+
ignore(?name); }
571584
end;
572585

573586
define macro binary-data-definer
574587
{ define ?attrs:* binary-data ?:name (?superprotocol:name)
575588
summary ?summary:* ;
576589
?fields:*
577590
end }
578-
=> { summary-generator("<" ## ?name ## ">"; ?summary);
591+
=> { summary-generator(?name; ?summary);
579592
define ?attrs binary-data ?name (?superprotocol) ?fields end; }
580593

581-
{ define ?attrs:* binary-data ?:name (container-frame) end }
582-
=> { define abstract class "<" ## ?name ## ">" (<container-frame>) end;
594+
{ define ?attrs:* binary-data "<" ## ?:name (<container-frame>) end }
595+
=> { define abstract class "<" ## ?name (<container-frame>) end;
583596

584-
define abstract class "<decoded-" ## ?name ## ">"
585-
("<" ## ?name ## ">", <decoded-container-frame>)
597+
define abstract class "<decoded-" ## ?name
598+
("<" ## ?name, <decoded-container-frame>)
586599
end;
587600

588-
gen-classes(?name; container-frame); }
601+
gen-classes("<" ## ?name; <container-frame>); }
589602

590603
{ define ?attrs:* binary-data ?:name (?superprotocol:name)
591604
over ?super:name ?magic:expression;
@@ -596,11 +609,11 @@ define macro binary-data-definer
596609
define method lookup-layer
597610
(frame :: subclass(?super), value == ?magic)
598611
=> (class :: <class>)
599-
"<" ## ?name ## ">"
612+
?name
600613
end;
601614

602615
define method reverse-lookup-layer
603-
(frame :: subclass(?super), payload :: "<" ## ?name ## ">")
616+
(frame :: subclass(?super), payload :: ?name)
604617
=> (value :: <integer>)
605618
?magic
606619
end; }
@@ -612,25 +625,25 @@ define macro binary-data-definer
612625
=> { define ?attrs binary-data ?name (?superprotocol) ?fields end;
613626

614627
define inline method container-frame-size
615-
(?=frame :: "<" ## ?name ## ">") => (res :: <integer>)
628+
(?=frame :: ?name) => (res :: <integer>)
616629
?container-frame-length
617630
end; }
618631

619-
{ define ?attrs:* binary-data ?:name (?superprotocol:name)
632+
{ define ?attrs:* binary-data "<" ## ?:name ("<" ## ?superprotocol:name)
620633
?fields:*
621634
end }
622-
=> { real-class-definer(?attrs; "<" ## ?name ## ">"; "<" ## ?superprotocol ## ">"; ?fields);
635+
=> { real-class-definer(?attrs; "<" ## ?name; "<" ## ?superprotocol; ?fields);
623636

624-
decoded-class-definer("<decoded-" ## ?name ## ">";
625-
"<" ## ?name ## ">", "<decoded-" ## ?superprotocol ## ">";
637+
decoded-class-definer("<decoded-" ## ?name;
638+
"<" ## ?name, "<decoded-" ## ?superprotocol;
626639
?fields);
627640

628-
gen-classes(?name; ?superprotocol);
641+
gen-classes("<" ## ?name; "<" ## ?superprotocol);
629642

630-
frame-field-generator("<unparsed-" ## ?name ## ">";
631-
field-count("<unparsed-" ## ?superprotocol ## ">");
643+
frame-field-generator("<unparsed-" ## ?name;
644+
field-count("<unparsed-" ## ?superprotocol);
632645
?fields);
633646

634-
container-frame-constructor(?name); }
647+
container-frame-constructor("<" ## ?name); }
635648
end;
636649

binary-data.dylan

+1-2
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,7 @@ define open generic parse-frame
7171
define method parse-frame
7272
(frame-type :: subclass(<frame>),
7373
packet :: <sequence>,
74-
#rest rest,
75-
#key, #all-keys)
74+
#rest rest, #key)
7675
=> (value :: <object>, next-unparsed :: <integer>);
7776
let packet-subseq = as(<stretchy-byte-vector-subsequence>, packet);
7877
apply(parse-frame, frame-type, packet-subseq, rest)

leaf-frames.dylan

+18-19
Original file line numberDiff line numberDiff line change
@@ -77,9 +77,7 @@ define class <unsigned-byte> (<fixed-size-translated-leaf-frame>)
7777
end;
7878

7979
define method parse-frame
80-
(frame-type == <unsigned-byte>,
81-
packet :: <byte-sequence>,
82-
#key)
80+
(frame-type == <unsigned-byte>, packet :: <byte-sequence>, #key)
8381
=> (value :: <byte>, next-unparsed :: <integer>)
8482
values(packet[0], 8)
8583
end;
@@ -153,7 +151,8 @@ define n-bit-unsigned-integer(<20bit-unsigned-integer>; 20) end;
153151

154152
define method parse-frame
155153
(frame-type :: subclass(<unsigned-integer-bit-frame>),
156-
packet :: <byte-sequence>, #key)
154+
packet :: <byte-sequence>,
155+
#key)
157156
=> (value :: <integer>, next-unparsed :: <integer>)
158157
let result-size = field-size(frame-type);
159158
let subseq = subsequence(packet, length: result-size);
@@ -211,10 +210,10 @@ end;
211210

212211
define macro n-byte-vector-definer
213212
{ define n-byte-vector(?:name, ?n:*) end }
214-
=> { define class "<" ## ?name ## ">" (<fixed-size-byte-vector-frame>)
213+
=> { define class ?name (<fixed-size-byte-vector-frame>)
215214
end;
216215

217-
define inline method field-size (type == "<" ## ?name ## ">")
216+
define inline method field-size (type == ?name)
218217
=> (length :: <integer>)
219218
?n * 8
220219
end;
@@ -339,16 +338,16 @@ define method parse-frame
339338
packet :: <byte-sequence>,
340339
#key)
341340
=> (value :: <integer>, next-unparsed :: <integer>)
342-
let result-size = byte-offset(field-size(frame-type));
343-
if (packet.size < result-size)
344-
signal(make(<malformed-data-error>))
345-
else
346-
let result = 0;
347-
for (i from 0 below result-size)
348-
result := packet[i] + ash(result, 8)
349-
end;
350-
values(result, result-size * 8)
351-
end;
341+
let result-size = byte-offset(field-size(frame-type));
342+
if (packet.size < result-size)
343+
signal(make(<malformed-data-error>))
344+
else
345+
let result = 0;
346+
for (i from 0 below result-size)
347+
result := packet[i] + ash(result, 8)
348+
end;
349+
values(result, result-size * 8)
350+
end;
352351
end;
353352

354353
define method assemble-frame
@@ -550,7 +549,7 @@ end;
550549

551550

552551
define macro leaf-frame-constructor-definer
553-
{ define leaf-frame-constructor(?:name) end }
552+
{ define leaf-frame-constructor("<" ## ?:name ## ">") end }
554553
=>
555554
{
556555
define method ?name (data :: <byte-vector>)
@@ -572,8 +571,8 @@ define macro leaf-frame-constructor-definer
572571
end;
573572

574573
//FIXME
575-
define n-byte-vector(little-endian-unsigned-integer-4byte, 4) end;
576-
define n-byte-vector(big-endian-unsigned-integer-4byte, 4) end;
574+
define n-byte-vector(<little-endian-unsigned-integer-4byte>, 4) end;
575+
define n-byte-vector(<big-endian-unsigned-integer-4byte>, 4) end;
577576

578577

579578
define function float-to-byte-vector-be (float :: <float>)

0 commit comments

Comments
 (0)