Author: hannes
Date: Fri Apr 7 03:29:06 2006
New Revision: 10676
Modified:
trunk/libraries/packetizer/packetizer.dylan
trunk/libraries/packetizer/protocol-definer-macro.dylan
Log:
Bug: 7299
*cache value only once
*in unparsed-getter set frame-field.%length and %end-offset slots
*use get-field-size-aux in worst case for frame-field.%length
Modified: trunk/libraries/packetizer/packetizer.dylan
==============================================================================
--- trunk/libraries/packetizer/packetizer.dylan (original)
+++ trunk/libraries/packetizer/packetizer.dylan Fri Apr 7 03:29:06 2006
@@ -525,22 +525,12 @@
define generic assemble-field (frame :: <frame>, field :: <field>)
=> (packet :: <vector>);
define class <frame-field> (<object>)
- slot %value :: false-or(<object>) = #f, init-keyword: value:;
constant slot field :: <field>, required-init-keyword: field:;
slot %start-offset :: false-or(<integer>) = #f, init-keyword: start:;
slot %end-offset :: false-or(<integer>) = #f, init-keyword: end:;
slot %length :: false-or(<integer>) = #f, init-keyword: length:;
slot frame :: <container-frame>, init-keyword: frame:;
end;
-define inline method value (frame-field :: <frame-field>) => (res);
- unless (frame-field.%value)
- let (my-frame, my-length) = parse-frame-field(frame-field);
- frame-field.%value := my-frame;
- frame-field.%end-offset := my-length;
- frame-field.%length := frame-field.%end-offset - frame-field.%start-offset;
- end;
- frame-field.%value;
-end;
define inline method start-offset (frame-field :: <frame-field>) => (res ::
<integer>)
unless (frame-field.%start-offset)
let my-field = frame-field.field;
@@ -579,10 +569,7 @@
unless (compute-field-length(frame-field))
//parse frame to get actual length
//need to compute an optional upper bound for the end of the frame
- let (my-frame, my-end)
- = parse-frame-field(frame-field);
- frame-field.%value := my-frame;
- frame-field.%length := my-end - frame-field.%start-offset;
+ frame-field.%length := get-field-size-aux(frame-field.frame,
frame-field.field);
end;
end;
frame-field.%length;
@@ -667,18 +654,6 @@
apply(concatenate, map(curry(assemble-frame-as, field.type),
field.getter(frame)))
end;
-define generic get-frame-type (field :: <field>, frame :: <frame>)
- => (type :: <class>);
-
-define method get-frame-type (field :: <statically-typed-field>, frame ::
<frame>)
- => (type :: <class>);
- field.type;
-end;
-
-define method get-frame-type (field :: <variably-typed-field>, frame ::
<frame>)
- => (type :: <class>);
- field.type-function(frame);
-end;
define class <unsigned-byte> (<fixed-size-translated-leaf-frame>)
Modified: trunk/libraries/packetizer/protocol-definer-macro.dylan
==============================================================================
--- trunk/libraries/packetizer/protocol-definer-macro.dylan (original)
+++ trunk/libraries/packetizer/protocol-definer-macro.dylan Fri Apr 7
03:29:06 2006
@@ -198,7 +198,10 @@
mframe.cache.?name
else
let frame-field = get-frame-field(?field-index, mframe);
- mframe.cache.?name := frame-field.value;
+ let (value, parsed-end) = parse-frame-field(frame-field);
+ mframe.cache.?name := value;
+ frame-field.%end-offset := parsed-end;
+ frame-field.%length := parsed-end - frame-field.start-offset;
mframe.cache.?name
end;
end;
--
Gd-chatter mailing list
Gd-chatter@xxxxxxxxxxxxxxxx
https://www.gwydiondylan.org/mailman/listinfo/gd-chatter
|