? 1.txt Index: src/builtinOps/BitSize.m3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3front/src/builtinOps/BitSize.m3,v retrieving revision 1.4 diff -u -r1.4 BitSize.m3 --- src/builtinOps/BitSize.m3 18 Feb 2010 02:33:09 -0000 1.4 +++ src/builtinOps/BitSize.m3 30 Aug 2010 06:58:03 -0000 @@ -68,6 +68,7 @@ IF TypeExpr.Split (e, t) THEN Type.Compile (t); EVAL Type.CheckInfo (t, info); + <* ASSERT info.size > 0 *> CG.Load_intt ((info.size + unit - 1) DIV unit); RETURN; END; Index: src/types/RecordType.m3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3front/src/types/RecordType.m3,v retrieving revision 1.4 diff -u -r1.4 RecordType.m3 --- src/types/RecordType.m3 15 Jan 2010 21:50:12 -0000 1.4 +++ src/types/RecordType.m3 30 Aug 2010 06:58:04 -0000 @@ -315,9 +315,12 @@ PROCEDURE Compiler (p: P) = VAR fields := Scope.ToList (p.fields); o: Value.T; n: INTEGER; BEGIN - Scope.InitValues (p.fields); o := fields; n := 0; - WHILE (o # NIL) DO INC (n); o := o.next; END; + WHILE (o # NIL) DO + Field.Compile (NARROW (o, Field.T)); + o := o.next; + INC (n); + END; CG.Declare_record (Type.GlobalUID (p), p.recSize, n); o := fields; WHILE (o # NIL) DO Field.EmitDeclaration (o); o := o.next; END; Index: src/types/Type.m3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3front/src/types/Type.m3,v retrieving revision 1.9 diff -u -r1.9 Type.m3 --- src/types/Type.m3 18 Feb 2010 02:33:14 -0000 1.9 +++ src/types/Type.m3 30 Aug 2010 06:58:04 -0000 @@ -609,17 +609,15 @@ BEGIN IF (NOT compile_started) THEN InitCompilation () END; IF (TypeTbl.Put (compiled, u, u) # NIL) THEN RETURN END; + save := Scanner.offset; + Scanner.offset := t.origin; + t.compile (); + Scanner.offset := save; IF (TypeTbl.Get (visible_types, u) # NIL) THEN (* it's visible in one of our imports *) Host.env.note_type (GlobalUID (u), imported := TRUE); - ELSE - save := Scanner.offset; - Scanner.offset := t.origin; - t.compile (); - Scanner.offset := save; - IF Module.IsInterface () THEN - Host.env.note_type (GlobalUID (t), imported := FALSE); - END; + ELSIF Module.IsInterface () THEN + Host.env.note_type (GlobalUID (t), imported := FALSE); END; END Compile; Index: src/values/Field.i3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3front/src/values/Field.i3,v retrieving revision 1.1.1.1 diff -u -r1.1.1.1 Field.i3 --- src/values/Field.i3 14 Jan 2001 13:40:32 -0000 1.1.1.1 +++ src/values/Field.i3 30 Aug 2010 06:58:04 -0000 @@ -9,6 +9,8 @@ IMPORT M3ID, Type, Value, Expr; +TYPE T <: Value.T; + TYPE Info = RECORD name : M3ID.T; @@ -27,6 +29,9 @@ PROCEDURE Split (field: Value.T; VAR info: Info); +PROCEDURE Compile (field: T); +(* compile, i.e. declare, the underlying type *) + PROCEDURE EmitDeclaration (field: Value.T); (* emit the C struct member or bit-field for 'field' *) Index: src/values/Field.m3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3front/src/values/Field.m3,v retrieving revision 1.2 diff -u -r1.2 Field.m3 --- src/values/Field.m3 4 May 2008 11:03:49 -0000 1.2 +++ src/values/Field.m3 30 Aug 2010 06:58:04 -0000 @@ -11,7 +11,7 @@ IMPORT M3, CG, Value, ValueRep, Type, Expr, Error; IMPORT AssignStmt, M3Buf; -TYPE +REVEAL T = Value.T BRANDED OBJECT index : INTEGER; offset : INTEGER;