aboutsummaryrefslogtreecommitdiffstats
path: root/mps/code
diff options
context:
space:
mode:
authorRichard Brooksby2012-08-26 14:43:35 +0100
committerRichard Brooksby2012-08-26 14:43:35 +0100
commit3208f37aefaa8c7152ff70722ab4cd2eb2b4b300 (patch)
tree3270b0e37b8149c565e2f9b2175af5fcac159069 /mps/code
parentc8a97631209e616d60b143707b71c056fb0fc764 (diff)
downloademacs-3208f37aefaa8c7152ff70722ab4cd2eb2b4b300.tar.gz
emacs-3208f37aefaa8c7152ff70722ab4cd2eb2b4b300.zip
Moving event emitting macros from eventcom.h to event.h, as they aren't used except in the mps.
Tidying up the way event field addresses are fetched to do all the work during compilation and not emit scads of branches. Copied from Perforce Change: 179053 ServerID: perforce.ravenbrook.com
Diffstat (limited to 'mps/code')
-rw-r--r--mps/code/event.h67
-rw-r--r--mps/code/eventcnv.c12
-rw-r--r--mps/code/eventcom.h124
-rw-r--r--mps/code/eventpro.c76
-rw-r--r--mps/code/eventpro.h1
5 files changed, 161 insertions, 119 deletions
diff --git a/mps/code/event.h b/mps/code/event.h
index 99373c1712f..1f113cc47a0 100644
--- a/mps/code/event.h
+++ b/mps/code/event.h
@@ -27,14 +27,11 @@ extern Word EventControl(Word, Word);
27extern Word EventInternString(const char *); 27extern Word EventInternString(const char *);
28extern Word EventInternGenString(size_t, const char *); 28extern Word EventInternGenString(size_t, const char *);
29extern void EventLabelAddr(Addr, Word); 29extern void EventLabelAddr(Addr, Word);
30extern Res EventFlush(void);
30 31
31 32
32#ifdef EVENT 33#ifdef EVENT
33 34
34
35extern Res EventFlush(void);
36
37
38/* Event writing support */ 35/* Event writing support */
39 36
40extern char *EventNext, *EventLimit; 37extern char *EventNext, *EventLimit;
@@ -59,6 +56,48 @@ extern Word EventKindControl;
59 END 56 END
60 57
61 58
59/* EVENTn -- event emitting macros
60 *
61 * The macros EVENT0, EVENT1, etc. are used throughout the MPS to emit an
62 * event with parameters. They work by appending the event parameters to
63 * an event buffer, which is flushed to the telemetry output stream when
64 * full. EVENT2S is a special case that takes a variable length string.
65 */
66
67#define EVENT2S(name, p0, length, string) \
68 BEGIN \
69 size_t _string_len = (length); \
70 size_t size; \
71 size = offsetof(Event##name##Struct, f1.str) + _string_len; \
72 EVENT_BEGIN(name, size) \
73 _event->f0 = (p0); \
74 AVER(_string_len < EventStringLengthMAX); \
75 _event->f1.len = (EventStringLen)_string_len; \
76 mps_lib_memcpy(_event->f1.str, (string), _string_len); \
77 EVENT_END(name, size); \
78 END
79
80
81#define EVENT0(name) EVENT_BEGIN(name, sizeof(EventAnyStruct)) EVENT_END(name, sizeof(EventAnyStruct))
82/* The following lines were generated with
83 python -c 'for i in range(1,15): print "#define EVENT%d(name, %s) EVENT_BEGIN(name, sizeof(Event##name##Struct)) %s EVENT_END(name, sizeof(Event##name##Struct))" % (i, ", ".join(["p%d" % j for j in range(0, i)]), " ".join(["_event->f%d = (p%d);" % (j, j) for j in range(0, i)]))'
84 */
85#define EVENT1(name, p0) EVENT_BEGIN(name, sizeof(Event##name##Struct)) _event->f0 = (p0); EVENT_END(name, sizeof(Event##name##Struct))
86#define EVENT2(name, p0, p1) EVENT_BEGIN(name, sizeof(Event##name##Struct)) _event->f0 = (p0); _event->f1 = (p1); EVENT_END(name, sizeof(Event##name##Struct))
87#define EVENT3(name, p0, p1, p2) EVENT_BEGIN(name, sizeof(Event##name##Struct)) _event->f0 = (p0); _event->f1 = (p1); _event->f2 = (p2); EVENT_END(name, sizeof(Event##name##Struct))
88#define EVENT4(name, p0, p1, p2, p3) EVENT_BEGIN(name, sizeof(Event##name##Struct)) _event->f0 = (p0); _event->f1 = (p1); _event->f2 = (p2); _event->f3 = (p3); EVENT_END(name, sizeof(Event##name##Struct))
89#define EVENT5(name, p0, p1, p2, p3, p4) EVENT_BEGIN(name, sizeof(Event##name##Struct)) _event->f0 = (p0); _event->f1 = (p1); _event->f2 = (p2); _event->f3 = (p3); _event->f4 = (p4); EVENT_END(name, sizeof(Event##name##Struct))
90#define EVENT6(name, p0, p1, p2, p3, p4, p5) EVENT_BEGIN(name, sizeof(Event##name##Struct)) _event->f0 = (p0); _event->f1 = (p1); _event->f2 = (p2); _event->f3 = (p3); _event->f4 = (p4); _event->f5 = (p5); EVENT_END(name, sizeof(Event##name##Struct))
91#define EVENT7(name, p0, p1, p2, p3, p4, p5, p6) EVENT_BEGIN(name, sizeof(Event##name##Struct)) _event->f0 = (p0); _event->f1 = (p1); _event->f2 = (p2); _event->f3 = (p3); _event->f4 = (p4); _event->f5 = (p5); _event->f6 = (p6); EVENT_END(name, sizeof(Event##name##Struct))
92#define EVENT8(name, p0, p1, p2, p3, p4, p5, p6, p7) EVENT_BEGIN(name, sizeof(Event##name##Struct)) _event->f0 = (p0); _event->f1 = (p1); _event->f2 = (p2); _event->f3 = (p3); _event->f4 = (p4); _event->f5 = (p5); _event->f6 = (p6); _event->f7 = (p7); EVENT_END(name, sizeof(Event##name##Struct))
93#define EVENT9(name, p0, p1, p2, p3, p4, p5, p6, p7, p8) EVENT_BEGIN(name, sizeof(Event##name##Struct)) _event->f0 = (p0); _event->f1 = (p1); _event->f2 = (p2); _event->f3 = (p3); _event->f4 = (p4); _event->f5 = (p5); _event->f6 = (p6); _event->f7 = (p7); _event->f8 = (p8); EVENT_END(name, sizeof(Event##name##Struct))
94#define EVENT10(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9) EVENT_BEGIN(name, sizeof(Event##name##Struct)) _event->f0 = (p0); _event->f1 = (p1); _event->f2 = (p2); _event->f3 = (p3); _event->f4 = (p4); _event->f5 = (p5); _event->f6 = (p6); _event->f7 = (p7); _event->f8 = (p8); _event->f9 = (p9); EVENT_END(name, sizeof(Event##name##Struct))
95#define EVENT11(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10) EVENT_BEGIN(name, sizeof(Event##name##Struct)) _event->f0 = (p0); _event->f1 = (p1); _event->f2 = (p2); _event->f3 = (p3); _event->f4 = (p4); _event->f5 = (p5); _event->f6 = (p6); _event->f7 = (p7); _event->f8 = (p8); _event->f9 = (p9); _event->f10 = (p10); EVENT_END(name, sizeof(Event##name##Struct))
96#define EVENT12(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11) EVENT_BEGIN(name, sizeof(Event##name##Struct)) _event->f0 = (p0); _event->f1 = (p1); _event->f2 = (p2); _event->f3 = (p3); _event->f4 = (p4); _event->f5 = (p5); _event->f6 = (p6); _event->f7 = (p7); _event->f8 = (p8); _event->f9 = (p9); _event->f10 = (p10); _event->f11 = (p11); EVENT_END(name, sizeof(Event##name##Struct))
97#define EVENT13(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12) EVENT_BEGIN(name, sizeof(Event##name##Struct)) _event->f0 = (p0); _event->f1 = (p1); _event->f2 = (p2); _event->f3 = (p3); _event->f4 = (p4); _event->f5 = (p5); _event->f6 = (p6); _event->f7 = (p7); _event->f8 = (p8); _event->f9 = (p9); _event->f10 = (p10); _event->f11 = (p11); _event->f12 = (p12); EVENT_END(name, sizeof(Event##name##Struct))
98#define EVENT14(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13) EVENT_BEGIN(name, sizeof(Event##name##Struct)) _event->f0 = (p0); _event->f1 = (p1); _event->f2 = (p2); _event->f3 = (p3); _event->f4 = (p4); _event->f5 = (p5); _event->f6 = (p6); _event->f7 = (p7); _event->f8 = (p8); _event->f9 = (p9); _event->f10 = (p10); _event->f11 = (p11); _event->f12 = (p12); _event->f13 = (p13); EVENT_END(name, sizeof(Event##name##Struct))
99
100
62#else /* EVENT not */ 101#else /* EVENT not */
63 102
64 103
@@ -70,6 +109,26 @@ extern Word EventKindControl;
70#define EventLabelAddr(a, i) BEGIN UNUSED(a); UNUSED(i); END 109#define EventLabelAddr(a, i) BEGIN UNUSED(a); UNUSED(i); END
71 110
72 111
112#define EVENT0(name) NOOP
113/* The following lines were generated with
114 python -c 'for i in range(1,15): print "#define EVENT%d(name, %s) NOOP" % (i, ", ".join(["p%d" % j for j in range(0, i)]))'
115 */
116#define EVENT1(name, p0) NOOP
117#define EVENT2(name, p0, p1) NOOP
118#define EVENT3(name, p0, p1, p2) NOOP
119#define EVENT4(name, p0, p1, p2, p3) NOOP
120#define EVENT5(name, p0, p1, p2, p3, p4) NOOP
121#define EVENT6(name, p0, p1, p2, p3, p4, p5) NOOP
122#define EVENT7(name, p0, p1, p2, p3, p4, p5, p6) NOOP
123#define EVENT8(name, p0, p1, p2, p3, p4, p5, p6, p7) NOOP
124#define EVENT9(name, p0, p1, p2, p3, p4, p5, p6, p7, p8) NOOP
125#define EVENT10(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9) NOOP
126#define EVENT11(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10) NOOP
127#define EVENT12(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11) NOOP
128#define EVENT13(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12) NOOP
129#define EVENT14(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13) NOOP
130
131
73#endif /* EVENT */ 132#endif /* EVENT */
74 133
75 134
diff --git a/mps/code/eventcnv.c b/mps/code/eventcnv.c
index 4e658f3d9c1..423625f3f27 100644
--- a/mps/code/eventcnv.c
+++ b/mps/code/eventcnv.c
@@ -527,16 +527,8 @@ static void readLog(EventProc proc)
527 printf(styleConv, (ulongest_t)event->PoolInit.f2); 527 printf(styleConv, (ulongest_t)event->PoolInit.f2);
528 } break; 528 } break;
529 default: 529 default:
530 for (i = 0; i < argCount; ++i) { 530 for (i = 0; i < argCount; ++i)
531 switch(code) { 531 printArg(proc, EventField(event, i), eventFormat[i], styleConv);
532#define EVENT_CASE(X, name, code, always, kind, count, format) \
533 case code: { \
534 printArg(proc, EVENT##count##_FIELD_PTR(name, event, i), \
535 eventFormat[i], styleConv); \
536 } break;
537 EVENT_LIST(EVENT_CASE, X)
538 }
539 }
540 } 532 }
541 533
542 if (style == 'L') putchar(')'); 534 if (style == 'L') putchar(')');
diff --git a/mps/code/eventcom.h b/mps/code/eventcom.h
index 1db05d4c0fe..45f45b128ed 100644
--- a/mps/code/eventcom.h
+++ b/mps/code/eventcom.h
@@ -83,40 +83,36 @@ typedef unsigned EventFU;
83typedef EventStringStruct EventFS; 83typedef EventStringStruct EventFS;
84typedef double EventFD; 84typedef double EventFD;
85 85
86/*
87for i in range(0, 15):
88 print "#define EVENT%d_STRUCT(%s) struct { EventCode code; EventSize size; Word clock; %s }" % (
89 i,
90 ", ".join(["p%s" % j for j in range(0, i)]),
91 " ".join("EventF##p%d f%d;" % (j, j) for j in range(0,i))
92 )
93 */
94#define EVENT0_STRUCT() struct { EventCode code; EventSize size; Word clock; }
95#define EVENT1_STRUCT(p0) struct { EventCode code; EventSize size; Word clock; EventF##p0 f0; }
96#define EVENT2_STRUCT(p0, p1) struct { EventCode code; EventSize size; Word clock; EventF##p0 f0; EventF##p1 f1; }
97#define EVENT3_STRUCT(p0, p1, p2) struct { EventCode code; EventSize size; Word clock; EventF##p0 f0; EventF##p1 f1; EventF##p2 f2; }
98#define EVENT4_STRUCT(p0, p1, p2, p3) struct { EventCode code; EventSize size; Word clock; EventF##p0 f0; EventF##p1 f1; EventF##p2 f2; EventF##p3 f3; }
99#define EVENT5_STRUCT(p0, p1, p2, p3, p4) struct { EventCode code; EventSize size; Word clock; EventF##p0 f0; EventF##p1 f1; EventF##p2 f2; EventF##p3 f3; EventF##p4 f4; }
100#define EVENT6_STRUCT(p0, p1, p2, p3, p4, p5) struct { EventCode code; EventSize size; Word clock; EventF##p0 f0; EventF##p1 f1; EventF##p2 f2; EventF##p3 f3; EventF##p4 f4; EventF##p5 f5; }
101#define EVENT7_STRUCT(p0, p1, p2, p3, p4, p5, p6) struct { EventCode code; EventSize size; Word clock; EventF##p0 f0; EventF##p1 f1; EventF##p2 f2; EventF##p3 f3; EventF##p4 f4; EventF##p5 f5; EventF##p6 f6; }
102#define EVENT8_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7) struct { EventCode code; EventSize size; Word clock; EventF##p0 f0; EventF##p1 f1; EventF##p2 f2; EventF##p3 f3; EventF##p4 f4; EventF##p5 f5; EventF##p6 f6; EventF##p7 f7; }
103#define EVENT9_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8) struct { EventCode code; EventSize size; Word clock; EventF##p0 f0; EventF##p1 f1; EventF##p2 f2; EventF##p3 f3; EventF##p4 f4; EventF##p5 f5; EventF##p6 f6; EventF##p7 f7; EventF##p8 f8; }
104#define EVENT10_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9) struct { EventCode code; EventSize size; Word clock; EventF##p0 f0; EventF##p1 f1; EventF##p2 f2; EventF##p3 f3; EventF##p4 f4; EventF##p5 f5; EventF##p6 f6; EventF##p7 f7; EventF##p8 f8; EventF##p9 f9; }
105#define EVENT11_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10) struct { EventCode code; EventSize size; Word clock; EventF##p0 f0; EventF##p1 f1; EventF##p2 f2; EventF##p3 f3; EventF##p4 f4; EventF##p5 f5; EventF##p6 f6; EventF##p7 f7; EventF##p8 f8; EventF##p9 f9; EventF##p10 f10; }
106#define EVENT12_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11) struct { EventCode code; EventSize size; Word clock; EventF##p0 f0; EventF##p1 f1; EventF##p2 f2; EventF##p3 f3; EventF##p4 f4; EventF##p5 f5; EventF##p6 f6; EventF##p7 f7; EventF##p8 f8; EventF##p9 f9; EventF##p10 f10; EventF##p11 f11; }
107#define EVENT13_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12) struct { EventCode code; EventSize size; Word clock; EventF##p0 f0; EventF##p1 f1; EventF##p2 f2; EventF##p3 f3; EventF##p4 f4; EventF##p5 f5; EventF##p6 f6; EventF##p7 f7; EventF##p8 f8; EventF##p9 f9; EventF##p10 f10; EventF##p11 f11; EventF##p12 f12; }
108#define EVENT14_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13) struct { EventCode code; EventSize size; Word clock; EventF##p0 f0; EventF##p1 f1; EventF##p2 f2; EventF##p3 f3; EventF##p4 f4; EventF##p5 f5; EventF##p6 f6; EventF##p7 f7; EventF##p8 f8; EventF##p9 f9; EventF##p10 f10; EventF##p11 f11; EventF##p12 f12; EventF##p13 f13; }
109
86/* Common prefix for all event structures. The size field allows an event 110/* Common prefix for all event structures. The size field allows an event
87 reader to skip over events whose codes it does not recognise. */ 111 reader to skip over events whose codes it does not recognise. */
88typedef struct EventAnyStruct { 112typedef EVENT0_STRUCT() EventAnyStruct;
89 EventCode code;
90 EventSize size;
91 Word clock;
92} EventAnyStruct;
93 113
94#define EVENT_STRUCT(X, name, _code, always, kind, count, format) \ 114#define EVENT_STRUCT(X, name, _code, always, kind, count, format) \
95 typedef struct Event##name##Struct { \ 115 typedef EVENT##count##_STRUCT format Event##name##Struct;
96 EventCode code; \
97 EventSize size; \
98 Word clock; \
99 EVENT_STRUCT_FIELDS_##count format \
100 } Event##name##Struct;
101
102#define EVENT_STRUCT_FIELDS_0()
103/* The following lines were generated with
104 python -c 'for i in range(1, 15): print "#define EVENT_STRUCT_FIELDS_%d(%s) %s" % (i, ", ".join(["p%s" % j for j in range(0, i)]), " ".join("EventF##p%d f%d;" % (j, j) for j in range(0,i)))'
105 */
106#define EVENT_STRUCT_FIELDS_1(p0) EventF##p0 f0;
107#define EVENT_STRUCT_FIELDS_2(p0, p1) EventF##p0 f0; EventF##p1 f1;
108#define EVENT_STRUCT_FIELDS_3(p0, p1, p2) EventF##p0 f0; EventF##p1 f1; EventF##p2 f2;
109#define EVENT_STRUCT_FIELDS_4(p0, p1, p2, p3) EventF##p0 f0; EventF##p1 f1; EventF##p2 f2; EventF##p3 f3;
110#define EVENT_STRUCT_FIELDS_5(p0, p1, p2, p3, p4) EventF##p0 f0; EventF##p1 f1; EventF##p2 f2; EventF##p3 f3; EventF##p4 f4;
111#define EVENT_STRUCT_FIELDS_6(p0, p1, p2, p3, p4, p5) EventF##p0 f0; EventF##p1 f1; EventF##p2 f2; EventF##p3 f3; EventF##p4 f4; EventF##p5 f5;
112#define EVENT_STRUCT_FIELDS_7(p0, p1, p2, p3, p4, p5, p6) EventF##p0 f0; EventF##p1 f1; EventF##p2 f2; EventF##p3 f3; EventF##p4 f4; EventF##p5 f5; EventF##p6 f6;
113#define EVENT_STRUCT_FIELDS_8(p0, p1, p2, p3, p4, p5, p6, p7) EventF##p0 f0; EventF##p1 f1; EventF##p2 f2; EventF##p3 f3; EventF##p4 f4; EventF##p5 f5; EventF##p6 f6; EventF##p7 f7;
114#define EVENT_STRUCT_FIELDS_9(p0, p1, p2, p3, p4, p5, p6, p7, p8) EventF##p0 f0; EventF##p1 f1; EventF##p2 f2; EventF##p3 f3; EventF##p4 f4; EventF##p5 f5; EventF##p6 f6; EventF##p7 f7; EventF##p8 f8;
115#define EVENT_STRUCT_FIELDS_10(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9) EventF##p0 f0; EventF##p1 f1; EventF##p2 f2; EventF##p3 f3; EventF##p4 f4; EventF##p5 f5; EventF##p6 f6; EventF##p7 f7; EventF##p8 f8; EventF##p9 f9;
116#define EVENT_STRUCT_FIELDS_11(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10) EventF##p0 f0; EventF##p1 f1; EventF##p2 f2; EventF##p3 f3; EventF##p4 f4; EventF##p5 f5; EventF##p6 f6; EventF##p7 f7; EventF##p8 f8; EventF##p9 f9; EventF##p10 f10;
117#define EVENT_STRUCT_FIELDS_12(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11) EventF##p0 f0; EventF##p1 f1; EventF##p2 f2; EventF##p3 f3; EventF##p4 f4; EventF##p5 f5; EventF##p6 f6; EventF##p7 f7; EventF##p8 f8; EventF##p9 f9; EventF##p10 f10; EventF##p11 f11;
118#define EVENT_STRUCT_FIELDS_13(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12) EventF##p0 f0; EventF##p1 f1; EventF##p2 f2; EventF##p3 f3; EventF##p4 f4; EventF##p5 f5; EventF##p6 f6; EventF##p7 f7; EventF##p8 f8; EventF##p9 f9; EventF##p10 f10; EventF##p11 f11; EventF##p12 f12;
119#define EVENT_STRUCT_FIELDS_14(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13) EventF##p0 f0; EventF##p1 f1; EventF##p2 f2; EventF##p3 f3; EventF##p4 f4; EventF##p5 f5; EventF##p6 f6; EventF##p7 f7; EventF##p8 f8; EventF##p9 f9; EventF##p10 f10; EventF##p11 f11; EventF##p12 f12; EventF##p13 f13;
120 116
121EVENT_LIST(EVENT_STRUCT, X) 117EVENT_LIST(EVENT_STRUCT, X)
122 118
@@ -137,48 +133,8 @@ typedef union EventUnion {
137} EventUnion, *Event; 133} EventUnion, *Event;
138 134
139 135
140/* EVENTn -- event emitting macros 136#if 0
141 * 137/* FIXME: Eliminate this in favour of some sort of table? */
142 * The macros EVENT0, EVENT1, etc. are used throughout the MPS to emit an
143 * event with parameters. They work by appending the event parameters to
144 * an event buffer, which is flushed to the telemetry output stream when
145 * full. EVENT2S is a special case that takes a variable length string.
146 */
147
148#ifdef EVENT
149
150#define EVENT2S(name, p0, length, string) \
151 BEGIN \
152 size_t _string_len = (length); \
153 size_t size; \
154 size = offsetof(Event##name##Struct, f1.str) + _string_len; \
155 EVENT_BEGIN(name, size) \
156 _event->f0 = (p0); \
157 AVER(_string_len < EventStringLengthMAX); \
158 _event->f1.len = (EventStringLen)_string_len; \
159 mps_lib_memcpy(_event->f1.str, (string), _string_len); \
160 EVENT_END(name, size); \
161 END
162
163#define EVENT0(name) EVENT_BEGIN(name, sizeof(EventAnyStruct)) EVENT_END(name, sizeof(EventAnyStruct))
164/* The following lines were generated with
165 python -c 'for i in range(1,15): print "#define EVENT%d(name, %s) EVENT_BEGIN(name, sizeof(Event##name##Struct)) %s EVENT_END(name, sizeof(Event##name##Struct))" % (i, ", ".join(["p%d" % j for j in range(0, i)]), " ".join(["_event->f%d = (p%d);" % (j, j) for j in range(0, i)]))'
166 */
167#define EVENT1(name, p0) EVENT_BEGIN(name, sizeof(Event##name##Struct)) _event->f0 = (p0); EVENT_END(name, sizeof(Event##name##Struct))
168#define EVENT2(name, p0, p1) EVENT_BEGIN(name, sizeof(Event##name##Struct)) _event->f0 = (p0); _event->f1 = (p1); EVENT_END(name, sizeof(Event##name##Struct))
169#define EVENT3(name, p0, p1, p2) EVENT_BEGIN(name, sizeof(Event##name##Struct)) _event->f0 = (p0); _event->f1 = (p1); _event->f2 = (p2); EVENT_END(name, sizeof(Event##name##Struct))
170#define EVENT4(name, p0, p1, p2, p3) EVENT_BEGIN(name, sizeof(Event##name##Struct)) _event->f0 = (p0); _event->f1 = (p1); _event->f2 = (p2); _event->f3 = (p3); EVENT_END(name, sizeof(Event##name##Struct))
171#define EVENT5(name, p0, p1, p2, p3, p4) EVENT_BEGIN(name, sizeof(Event##name##Struct)) _event->f0 = (p0); _event->f1 = (p1); _event->f2 = (p2); _event->f3 = (p3); _event->f4 = (p4); EVENT_END(name, sizeof(Event##name##Struct))
172#define EVENT6(name, p0, p1, p2, p3, p4, p5) EVENT_BEGIN(name, sizeof(Event##name##Struct)) _event->f0 = (p0); _event->f1 = (p1); _event->f2 = (p2); _event->f3 = (p3); _event->f4 = (p4); _event->f5 = (p5); EVENT_END(name, sizeof(Event##name##Struct))
173#define EVENT7(name, p0, p1, p2, p3, p4, p5, p6) EVENT_BEGIN(name, sizeof(Event##name##Struct)) _event->f0 = (p0); _event->f1 = (p1); _event->f2 = (p2); _event->f3 = (p3); _event->f4 = (p4); _event->f5 = (p5); _event->f6 = (p6); EVENT_END(name, sizeof(Event##name##Struct))
174#define EVENT8(name, p0, p1, p2, p3, p4, p5, p6, p7) EVENT_BEGIN(name, sizeof(Event##name##Struct)) _event->f0 = (p0); _event->f1 = (p1); _event->f2 = (p2); _event->f3 = (p3); _event->f4 = (p4); _event->f5 = (p5); _event->f6 = (p6); _event->f7 = (p7); EVENT_END(name, sizeof(Event##name##Struct))
175#define EVENT9(name, p0, p1, p2, p3, p4, p5, p6, p7, p8) EVENT_BEGIN(name, sizeof(Event##name##Struct)) _event->f0 = (p0); _event->f1 = (p1); _event->f2 = (p2); _event->f3 = (p3); _event->f4 = (p4); _event->f5 = (p5); _event->f6 = (p6); _event->f7 = (p7); _event->f8 = (p8); EVENT_END(name, sizeof(Event##name##Struct))
176#define EVENT10(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9) EVENT_BEGIN(name, sizeof(Event##name##Struct)) _event->f0 = (p0); _event->f1 = (p1); _event->f2 = (p2); _event->f3 = (p3); _event->f4 = (p4); _event->f5 = (p5); _event->f6 = (p6); _event->f7 = (p7); _event->f8 = (p8); _event->f9 = (p9); EVENT_END(name, sizeof(Event##name##Struct))
177#define EVENT11(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10) EVENT_BEGIN(name, sizeof(Event##name##Struct)) _event->f0 = (p0); _event->f1 = (p1); _event->f2 = (p2); _event->f3 = (p3); _event->f4 = (p4); _event->f5 = (p5); _event->f6 = (p6); _event->f7 = (p7); _event->f8 = (p8); _event->f9 = (p9); _event->f10 = (p10); EVENT_END(name, sizeof(Event##name##Struct))
178#define EVENT12(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11) EVENT_BEGIN(name, sizeof(Event##name##Struct)) _event->f0 = (p0); _event->f1 = (p1); _event->f2 = (p2); _event->f3 = (p3); _event->f4 = (p4); _event->f5 = (p5); _event->f6 = (p6); _event->f7 = (p7); _event->f8 = (p8); _event->f9 = (p9); _event->f10 = (p10); _event->f11 = (p11); EVENT_END(name, sizeof(Event##name##Struct))
179#define EVENT13(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12) EVENT_BEGIN(name, sizeof(Event##name##Struct)) _event->f0 = (p0); _event->f1 = (p1); _event->f2 = (p2); _event->f3 = (p3); _event->f4 = (p4); _event->f5 = (p5); _event->f6 = (p6); _event->f7 = (p7); _event->f8 = (p8); _event->f9 = (p9); _event->f10 = (p10); _event->f11 = (p11); _event->f12 = (p12); EVENT_END(name, sizeof(Event##name##Struct))
180#define EVENT14(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13) EVENT_BEGIN(name, sizeof(Event##name##Struct)) _event->f0 = (p0); _event->f1 = (p1); _event->f2 = (p2); _event->f3 = (p3); _event->f4 = (p4); _event->f5 = (p5); _event->f6 = (p6); _event->f7 = (p7); _event->f8 = (p8); _event->f9 = (p9); _event->f10 = (p10); _event->f11 = (p11); _event->f12 = (p12); _event->f13 = (p13); EVENT_END(name, sizeof(Event##name##Struct))
181
182 138
183#define EVENT0_FIELD_PTR(name, event, i) NULL 139#define EVENT0_FIELD_PTR(name, event, i) NULL
184 140
@@ -432,29 +388,7 @@ typedef union EventUnion {
432 : ((i) == 17) ? (void *)&((event)->name.f17) \ 388 : ((i) == 17) ? (void *)&((event)->name.f17) \
433 : ((i) == 18) ? (void *)&((event)->name.f18)\ 389 : ((i) == 18) ? (void *)&((event)->name.f18)\
434 : NULL) 390 : NULL)
435 391#endif
436#else /* EVENT not */
437
438#define EVENT0(name) NOOP
439/* The following lines were generated with
440 python -c 'for i in range(1,15): print "#define EVENT%d(name, %s) NOOP" % (i, ", ".join(["p%d" % j for j in range(0, i)]))'
441 */
442#define EVENT1(name, p0) NOOP
443#define EVENT2(name, p0, p1) NOOP
444#define EVENT3(name, p0, p1, p2) NOOP
445#define EVENT4(name, p0, p1, p2, p3) NOOP
446#define EVENT5(name, p0, p1, p2, p3, p4) NOOP
447#define EVENT6(name, p0, p1, p2, p3, p4, p5) NOOP
448#define EVENT7(name, p0, p1, p2, p3, p4, p5, p6) NOOP
449#define EVENT8(name, p0, p1, p2, p3, p4, p5, p6, p7) NOOP
450#define EVENT9(name, p0, p1, p2, p3, p4, p5, p6, p7, p8) NOOP
451#define EVENT10(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9) NOOP
452#define EVENT11(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10) NOOP
453#define EVENT12(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11) NOOP
454#define EVENT13(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12) NOOP
455#define EVENT14(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13) NOOP
456
457#endif /* EVENT */
458 392
459 393
460#endif /* eventcom_h */ 394#endif /* eventcom_h */
diff --git a/mps/code/eventpro.c b/mps/code/eventpro.c
index e3a2ed320da..ac7475498e4 100644
--- a/mps/code/eventpro.c
+++ b/mps/code/eventpro.c
@@ -70,14 +70,25 @@ struct EventProcStruct {
70/* eventTypes -- an array containing info about the event types */ 70/* eventTypes -- an array containing info about the event types */
71 71
72typedef struct { 72typedef struct {
73 char *name; 73 char *name; /* Event name e.g. "TraceStart" */
74 EventCode code; 74 EventCode code;
75 size_t length; 75 size_t size; /* event record size, rounded up from structure */
76 char *format; 76 Count count; /* Parameter count */
77 char *format; /* string format, e.g. "PPW" */
78 EventSize offsets[15]; /* FIXME: literal constant */
77} eventRecord; 79} eventRecord;
78 80
81/* EVENTn_FORMAT produces a short string version of an event format, e.g.
82 it converts (P,P,W) into "PPW"
83
84for i in range(1,15):
85 print "#define EVENT%d_FORMAT(%s) %s" % (
86 i,
87 ", ".join(["p%d" % j for j in range(0, i)]),
88 " ".join(["#p%d" % j for j in range(0, i)])
89 )
90*/
79#define EVENT0_FORMAT() "" 91#define EVENT0_FORMAT() ""
80/* for i in range(1,15): print "#define EVENT%d_FORMAT(%s) %s" % (i, ", ".join(["p%d" % j for j in range(0, i)]), " ".join(["#p%d" % j for j in range(0, i)])) */
81#define EVENT1_FORMAT(p0) #p0 92#define EVENT1_FORMAT(p0) #p0
82#define EVENT2_FORMAT(p0, p1) #p0 #p1 93#define EVENT2_FORMAT(p0, p1) #p0 #p1
83#define EVENT3_FORMAT(p0, p1, p2) #p0 #p1 #p2 94#define EVENT3_FORMAT(p0, p1, p2) #p0 #p1 #p2
@@ -94,11 +105,43 @@ typedef struct {
94#define EVENT14_FORMAT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13) #p0 #p1 #p2 #p3 #p4 #p5 #p6 #p7 #p8 #p9 #p10 #p11 #p12 #p13 105#define EVENT14_FORMAT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13) #p0 #p1 #p2 #p3 #p4 #p5 #p6 #p7 #p8 #p9 #p10 #p11 #p12 #p13
95#define EVENT15_FORMAT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14) #p0 #p1 #p2 #p3 #p4 #p5 #p6 #p7 #p8 #p9 #p10 #p11 #p12 #p13 #p14 106#define EVENT15_FORMAT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14) #p0 #p1 #p2 #p3 #p4 #p5 #p6 #p7 #p8 #p9 #p10 #p11 #p12 #p13 #p14
96 107
108/* EVENTn_OFFSETS is a macro which produces an. array initializer containing
109 the offsets of the fields within an event structure with the specified
110 format.
111
112for i in range(0, 15):
113 plist = ", ".join(["p%d" % i for i in range(0, i)])
114 print "#define EVENT%d_OFFSETS(%s) {%s}" % (
115 i, plist,
116 ", ".join(["offsetof(EVENT%d_STRUCT(%s), f%d)" % (i, plist, j)
117 for j in range(0, i)])
118 )
119*/
120#define EVENT0_OFFSETS() {}
121#define EVENT1_OFFSETS(p0) {offsetof(EVENT1_STRUCT(p0), f0)}
122#define EVENT2_OFFSETS(p0, p1) {offsetof(EVENT2_STRUCT(p0, p1), f0), offsetof(EVENT2_STRUCT(p0, p1), f1)}
123#define EVENT3_OFFSETS(p0, p1, p2) {offsetof(EVENT3_STRUCT(p0, p1, p2), f0), offsetof(EVENT3_STRUCT(p0, p1, p2), f1), offsetof(EVENT3_STRUCT(p0, p1, p2), f2)}
124#define EVENT4_OFFSETS(p0, p1, p2, p3) {offsetof(EVENT4_STRUCT(p0, p1, p2, p3), f0), offsetof(EVENT4_STRUCT(p0, p1, p2, p3), f1), offsetof(EVENT4_STRUCT(p0, p1, p2, p3), f2), offsetof(EVENT4_STRUCT(p0, p1, p2, p3), f3)}
125#define EVENT5_OFFSETS(p0, p1, p2, p3, p4) {offsetof(EVENT5_STRUCT(p0, p1, p2, p3, p4), f0), offsetof(EVENT5_STRUCT(p0, p1, p2, p3, p4), f1), offsetof(EVENT5_STRUCT(p0, p1, p2, p3, p4), f2), offsetof(EVENT5_STRUCT(p0, p1, p2, p3, p4), f3), offsetof(EVENT5_STRUCT(p0, p1, p2, p3, p4), f4)}
126#define EVENT6_OFFSETS(p0, p1, p2, p3, p4, p5) {offsetof(EVENT6_STRUCT(p0, p1, p2, p3, p4, p5), f0), offsetof(EVENT6_STRUCT(p0, p1, p2, p3, p4, p5), f1), offsetof(EVENT6_STRUCT(p0, p1, p2, p3, p4, p5), f2), offsetof(EVENT6_STRUCT(p0, p1, p2, p3, p4, p5), f3), offsetof(EVENT6_STRUCT(p0, p1, p2, p3, p4, p5), f4), offsetof(EVENT6_STRUCT(p0, p1, p2, p3, p4, p5), f5)}
127#define EVENT7_OFFSETS(p0, p1, p2, p3, p4, p5, p6) {offsetof(EVENT7_STRUCT(p0, p1, p2, p3, p4, p5, p6), f0), offsetof(EVENT7_STRUCT(p0, p1, p2, p3, p4, p5, p6), f1), offsetof(EVENT7_STRUCT(p0, p1, p2, p3, p4, p5, p6), f2), offsetof(EVENT7_STRUCT(p0, p1, p2, p3, p4, p5, p6), f3), offsetof(EVENT7_STRUCT(p0, p1, p2, p3, p4, p5, p6), f4), offsetof(EVENT7_STRUCT(p0, p1, p2, p3, p4, p5, p6), f5), offsetof(EVENT7_STRUCT(p0, p1, p2, p3, p4, p5, p6), f6)}
128#define EVENT8_OFFSETS(p0, p1, p2, p3, p4, p5, p6, p7) {offsetof(EVENT8_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7), f0), offsetof(EVENT8_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7), f1), offsetof(EVENT8_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7), f2), offsetof(EVENT8_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7), f3), offsetof(EVENT8_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7), f4), offsetof(EVENT8_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7), f5), offsetof(EVENT8_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7), f6), offsetof(EVENT8_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7), f7)}
129#define EVENT9_OFFSETS(p0, p1, p2, p3, p4, p5, p6, p7, p8) {offsetof(EVENT9_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8), f0), offsetof(EVENT9_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8), f1), offsetof(EVENT9_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8), f2), offsetof(EVENT9_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8), f3), offsetof(EVENT9_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8), f4), offsetof(EVENT9_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8), f5), offsetof(EVENT9_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8), f6), offsetof(EVENT9_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8), f7), offsetof(EVENT9_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8), f8)}
130#define EVENT10_OFFSETS(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9) {offsetof(EVENT10_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9), f0), offsetof(EVENT10_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9), f1), offsetof(EVENT10_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9), f2), offsetof(EVENT10_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9), f3), offsetof(EVENT10_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9), f4), offsetof(EVENT10_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9), f5), offsetof(EVENT10_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9), f6), offsetof(EVENT10_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9), f7), offsetof(EVENT10_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9), f8), offsetof(EVENT10_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9), f9)}
131#define EVENT11_OFFSETS(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10) {offsetof(EVENT11_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), f0), offsetof(EVENT11_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), f1), offsetof(EVENT11_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), f2), offsetof(EVENT11_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), f3), offsetof(EVENT11_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), f4), offsetof(EVENT11_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), f5), offsetof(EVENT11_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), f6), offsetof(EVENT11_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), f7), offsetof(EVENT11_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), f8), offsetof(EVENT11_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), f9), offsetof(EVENT11_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), f10)}
132#define EVENT12_OFFSETS(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11) {offsetof(EVENT12_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), f0), offsetof(EVENT12_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), f1), offsetof(EVENT12_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), f2), offsetof(EVENT12_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), f3), offsetof(EVENT12_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), f4), offsetof(EVENT12_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), f5), offsetof(EVENT12_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), f6), offsetof(EVENT12_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), f7), offsetof(EVENT12_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), f8), offsetof(EVENT12_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), f9), offsetof(EVENT12_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), f10), offsetof(EVENT12_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), f11)}
133#define EVENT13_OFFSETS(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12) {offsetof(EVENT13_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), f0), offsetof(EVENT13_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), f1), offsetof(EVENT13_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), f2), offsetof(EVENT13_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), f3), offsetof(EVENT13_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), f4), offsetof(EVENT13_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), f5), offsetof(EVENT13_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), f6), offsetof(EVENT13_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), f7), offsetof(EVENT13_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), f8), offsetof(EVENT13_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), f9), offsetof(EVENT13_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), f10), offsetof(EVENT13_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), f11), offsetof(EVENT13_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), f12)}
134#define EVENT14_OFFSETS(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13) {offsetof(EVENT14_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), f0), offsetof(EVENT14_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), f1), offsetof(EVENT14_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), f2), offsetof(EVENT14_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), f3), offsetof(EVENT14_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), f4), offsetof(EVENT14_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), f5), offsetof(EVENT14_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), f6), offsetof(EVENT14_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), f7), offsetof(EVENT14_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), f8), offsetof(EVENT14_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), f9), offsetof(EVENT14_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), f10), offsetof(EVENT14_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), f11), offsetof(EVENT14_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), f12), offsetof(EVENT14_STRUCT(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), f13)}
135
97static eventRecord eventTypes[] = { 136static eventRecord eventTypes[] = {
98 {"(unused)", 0, 0, "0"}, 137 {"(unused)", 0, 0, 0, "", {}},
99#define EVENT_INIT(X, name, code, always, kind, count, format) \ 138#define EVENT_INIT(X, name, code, always, kind, count, format) \
100 {#name, code, \ 139 {#name, \
101 EventSizeAlign(sizeof(Event##name##Struct)), EVENT##count##_FORMAT format}, 140 code, \
141 EventSizeAlign(sizeof(Event##name##Struct)), \
142 count, \
143 EVENT##count##_FORMAT format, \
144 EVENT##count##_OFFSETS format},
102 EVENT_LIST(EVENT_INIT, X) 145 EVENT_LIST(EVENT_INIT, X)
103}; 146};
104 147
@@ -152,6 +195,19 @@ char *EventCode2Format(EventCode code)
152} 195}
153 196
154 197
198/* EventCode2Field -- find pointer to a field within an event */
199
200void *EventField(Event event, unsigned i)
201{
202 Index j = eventCode2Index(event->any.code, TRUE);
203 ptrdiff_t offset;
204 if (i >= eventTypes[j].count)
205 error("Event field %u out of bounds", i);
206 offset = eventTypes[j].offsets[i];
207 return (void *)((char *)event + offset);
208}
209
210
155Bool EventCodeIsValid(EventCode code) 211Bool EventCodeIsValid(EventCode code)
156{ 212{
157 return (eventCode2Index(code, FALSE) != 0); 213 return (eventCode2Index(code, FALSE) != 0);
@@ -245,7 +301,7 @@ EventString LabelText(EventProc proc, Word id)
245 301
246Res EventRead(Event *eventReturn, EventProc proc) 302Res EventRead(Event *eventReturn, EventProc proc)
247{ 303{
248 size_t eventIndex, length; 304 size_t eventIndex, size;
249 Res res; 305 Res res;
250 EventCode code; 306 EventCode code;
251 Event event; 307 Event event;
@@ -256,7 +312,7 @@ Res EventRead(Event *eventReturn, EventProc proc)
256 return res; 312 return res;
257 313
258 eventIndex = eventCode2Index(code, TRUE); 314 eventIndex = eventCode2Index(code, TRUE);
259 length = eventTypes[eventIndex].length; 315 size = eventTypes[eventIndex].size;
260 if (proc->cachedEvent != NULL) { 316 if (proc->cachedEvent != NULL) {
261 event = proc->cachedEvent; 317 event = proc->cachedEvent;
262 proc->cachedEvent = NULL; 318 proc->cachedEvent = NULL;
@@ -282,7 +338,7 @@ Res EventRead(Event *eventReturn, EventProc proc)
282 if (res != ResOK) return res; 338 if (res != ResOK) return res;
283 } else { 339 } else {
284 res = proc->reader(proc->readerP, restOfEvent, 340 res = proc->reader(proc->readerP, restOfEvent,
285 length - sizeof(EventCode)); 341 size - sizeof(EventCode));
286 if (res != ResOK) return res; 342 if (res != ResOK) return res;
287 } 343 }
288 *eventReturn = event; 344 *eventReturn = event;
diff --git a/mps/code/eventpro.h b/mps/code/eventpro.h
index bd6cbebfc76..608b0a36bae 100644
--- a/mps/code/eventpro.h
+++ b/mps/code/eventpro.h
@@ -22,6 +22,7 @@ typedef Res (*EventProcReader)(void *, void *, size_t);
22extern EventCode EventName2Code(char *name); 22extern EventCode EventName2Code(char *name);
23extern char *EventCode2Name(EventCode code); 23extern char *EventCode2Name(EventCode code);
24extern char *EventCode2Format(EventCode code); 24extern char *EventCode2Format(EventCode code);
25extern void *EventField(Event event, unsigned i);
25extern Bool EventCodeIsValid(EventCode code); 26extern Bool EventCodeIsValid(EventCode code);
26 27
27extern Word AddrLabel(EventProc proc, Addr addr); 28extern Word AddrLabel(EventProc proc, Addr addr);