diff --git a/mps/code/event.c b/mps/code/event.c
index d4b32f83a2c..0b4d16353b4 100644
--- a/mps/code/event.c
+++ b/mps/code/event.c
@@ -46,11 +46,15 @@ Word EventKindControl; /* Bit set used to control output. */
Res EventFlush(void)
{
Res res;
+ size_t size;
AVER(eventInited);
- res = (Res)mps_io_write(eventIO, (void *)eventBuffer,
- EventNext - eventBuffer);
+ AVER(eventBuffer <= EventNext);
+ AVER(EventNext <= eventBuffer + EventBufferSIZE);
+ size = (size_t)(EventNext - eventBuffer);
+
+ res = (Res)mps_io_write(eventIO, (void *)eventBuffer, size);
EventNext = eventBuffer;
if (res != ResOK) return res;
diff --git a/mps/code/event.h b/mps/code/event.h
index 139460955fa..97e622b628d 100644
--- a/mps/code/event.h
+++ b/mps/code/event.h
@@ -35,43 +35,8 @@ extern void EventLabelAddr(Addr, Word);
extern Res EventFlush(void);
-/* Event Kinds --- see
- *
- * All events are classified as being of one event type.
- * They are small enough to be able to be used as shifts within a word.
- */
-
-#define EventKindArena ((EventKind)0) /* Per space or arena */
-#define EventKindPool ((EventKind)1) /* Per pool */
-#define EventKindTrace ((EventKind)2) /* Per trace or scan */
-#define EventKindSeg ((EventKind)3) /* Per seg */
-#define EventKindRef ((EventKind)4) /* Per ref or fix */
-#define EventKindObject ((EventKind)5) /* Per alloc or object */
-#define EventKindUser ((EventKind)6) /* User-invoked */
-
-#define EventKindNumber ((Count)7) /* Number of event kinds */
-
-
-/* Event type definitions
- *
- * Define various constants for each event type to describe them.
- */
-
-/* Note that enum values can be up to fifteen bits long portably. */
-#define EVENT_ENUM(X, type, code, always, kind, count, format) \
- enum { \
- Event##type##High = ((code >> 8) & 0xFF), \
- Event##type##Low = (code & 0xFF), \
- Event##type##Always = always, \
- Event##type##Kind = EventKind##kind \
- };
-
-EVENT_LIST(EVENT_ENUM, X)
-
-
/* Event writing support */
-/* extern EventUnion EventMould; */
extern char *EventNext, *EventLimit;
extern Word EventKindControl;
diff --git a/mps/code/eventcom.h b/mps/code/eventcom.h
index 7d372cdd47a..18bef8ec4ca 100644
--- a/mps/code/eventcom.h
+++ b/mps/code/eventcom.h
@@ -16,8 +16,8 @@
/* Types for event fields */
typedef Word EventType;
-typedef size_t EventCode;
-typedef Index EventKind;
+typedef unsigned short EventCode;
+typedef unsigned EventKind;
typedef Byte EventStringLen;
@@ -33,6 +33,39 @@ typedef EventStringStruct *EventString;
#define EventCodeMAX ((EventCode)0x0069)
+/* Event Kinds --- see
+ *
+ * All events are classified as being of one event type.
+ * They are small enough to be able to be used as shifts within a word.
+ */
+
+enum {
+ EventKindArena, /* Per space or arena */
+ EventKindPool, /* Per pool */
+ EventKindTrace, /* Per trace or scan */
+ EventKindSeg, /* Per seg */
+ EventKindRef, /* Per ref or fix */
+ EventKindObject, /* Per alloc or object */
+ EventKindUser, /* User-invoked */
+ EventKindLIMIT
+};
+
+
+/* Event type definitions
+ *
+ * Define various constants for each event type to describe them.
+ */
+
+/* Note that enum values can be up to fifteen bits long portably. */
+#define EVENT_ENUM(X, name, code, always, kind, count, format) \
+ enum { \
+ Event##name##Always = always, \
+ Event##name##Kind = EventKind##kind \
+ };
+
+EVENT_LIST(EVENT_ENUM, X)
+
+
/* Event*Struct -- Event Structures
*
* Declare the structures that are used to encode events in the internal event
@@ -112,11 +145,11 @@ typedef union EventUnion {
BEGIN \
size_t _string_len = (length); \
size_t size; \
- AVER(_string_len < EventStringLengthMAX); \
size = offsetof(Event##name##Struct, f1.str) + _string_len; \
EVENT_BEGIN(name, size) \
_event->f0 = (p0); \
- _event->f1.len = _string_len; \
+ AVER(_string_len < EventStringLengthMAX); \
+ _event->f1.len = (EventStringLen)_string_len; \
mps_lib_memcpy(_event->f1.str, (string), _string_len); \
EVENT_END(name, size); \
END
@@ -141,7 +174,6 @@ typedef union EventUnion {
#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))
-
#define EVENT0_FIELD_PTR(name, event, i) NULL
/*
diff --git a/mps/code/eventpro.c b/mps/code/eventpro.c
index 07faea3226e..e66c76a69a9 100644
--- a/mps/code/eventpro.c
+++ b/mps/code/eventpro.c
@@ -72,7 +72,7 @@ struct EventProcStruct {
typedef struct {
EventType type;
char *name;
- size_t code;
+ EventCode code;
size_t length;
char *format;
} eventRecord;