diff --git a/src/main/java/dk/camelot64/kickc/passes/Pass1UnwindStructValues.java b/src/main/java/dk/camelot64/kickc/passes/Pass1UnwindStructValues.java index cfcc4b46d..d55fc3c9f 100644 --- a/src/main/java/dk/camelot64/kickc/passes/Pass1UnwindStructValues.java +++ b/src/main/java/dk/camelot64/kickc/passes/Pass1UnwindStructValues.java @@ -404,6 +404,7 @@ public class Pass1UnwindStructValues extends Pass1Base { return new StructUnwindingVariable(variable, structDefinition); } } else if(value instanceof StructMemberRef && ((StructMemberRef) value).getStruct() instanceof VariableRef) { + getLog().append("Postponing unwinding for "+currentStmt.toString(getProgram(), false)); return POSTPONE_UNWINDING; } else if(value instanceof PointerDereferenceSimple) { return new StructUnwindingPointerDerefSimple((PointerDereferenceSimple) value, structDefinition, stmtIt, currentBlock, currentStmt); diff --git a/src/test/ref/complex/splines/truetype-splines.log b/src/test/ref/complex/splines/truetype-splines.log index 083d5b1e6..2f028990d 100644 --- a/src/test/ref/complex/splines/truetype-splines.log +++ b/src/test/ref/complex/splines/truetype-splines.log @@ -224,7 +224,12 @@ Adding struct value member variable copy (signed word) show_letter::via_y ← (s Adding struct value member variable copy (byte) show_letter::segment_type ← *((const struct Segment*) letter_c + (byte~) show_letter::$22).type Adding struct value member variable copy (struct SplineVector16) show_letter::segment_to ← (struct SplineVector16) show_letter::to Adding struct value member variable copy (struct SplineVector16) show_letter::segment_via ← (struct SplineVector16) show_letter::via +Postponing unwinding for (struct SplineVector16) show_letter::current ← (struct Segment) show_letter::segment.to +Postponing unwinding for (void~) show_letter::$17 ← call spline_8segB (struct SplineVector16) show_letter::current (struct Segment) show_letter::segment.via (struct Segment) show_letter::segment.to +Postponing unwinding for (void~) show_letter::$17 ← call spline_8segB (struct SplineVector16) show_letter::current (struct Segment) show_letter::segment.via (struct Segment) show_letter::segment.to Converted procedure struct value parameter to member unwinding in call (void~) show_letter::$17 ← call spline_8segB (signed word) show_letter::current_x (signed word) show_letter::current_y (struct Segment) show_letter::segment.via (struct Segment) show_letter::segment.to +Postponing unwinding for (struct SplineVector16) show_letter::current ← (struct Segment) show_letter::segment.to +Postponing unwinding for (struct SplineVector16) show_letter::current ← (struct Segment) show_letter::segment.to Adding struct value member variable copy (signed word) bitmap_plot_spline_8seg::current_x ← *((signed word*~) bitmap_plot_spline_8seg::$10 + (number~) bitmap_plot_spline_8seg::$6) Adding struct value member variable copy (signed word) bitmap_plot_spline_8seg::current_y ← *((signed word*~) bitmap_plot_spline_8seg::$11 + (number~) bitmap_plot_spline_8seg::$6) Adding struct value member variable copy (signed word) bitmap_plot_spline_8seg::current_x ← *((signed word*~) bitmap_plot_spline_8seg::$12 + (byte~) bitmap_plot_spline_8seg::$9) diff --git a/src/test/ref/struct-19.log b/src/test/ref/struct-19.log index 4364524a7..0e0cbda60 100644 --- a/src/test/ref/struct-19.log +++ b/src/test/ref/struct-19.log @@ -1,6 +1,8 @@ Adding struct value member variable copy *(&(struct Vector) main::v) ← memset(struct Vector, (const byte) SIZEOF_STRUCT_VECTOR) Adding struct value member variable copy *(&(struct Point) main::p1) ← memcpy(*(&(const struct Point) $0), struct Point, (const byte) SIZEOF_STRUCT_POINT) Adding struct value member variable copy *(&(struct Point) main::p2) ← memcpy(*(&(const struct Point) $1), struct Point, (const byte) SIZEOF_STRUCT_POINT) +Postponing unwinding for (struct Vector) main::v.p ← (struct Point) main::p1 +Postponing unwinding for (struct Vector) main::v.q ← (struct Point) main::p2 Replacing struct member reference (struct Vector) main::v.p with member unwinding reference *((struct Point*)&(struct Vector) main::v+(const byte) OFFSET_STRUCT_VECTOR_P) Replacing struct member reference (struct Vector) main::v.q with member unwinding reference *((struct Point*)&(struct Vector) main::v+(const byte) OFFSET_STRUCT_VECTOR_Q) Replacing struct member reference (struct Vector) main::v.p with member unwinding reference *((struct Point*)&(struct Vector) main::v+(const byte) OFFSET_STRUCT_VECTOR_P) diff --git a/src/test/ref/struct-8.log b/src/test/ref/struct-8.log index 271eb6641..5ef1cf44e 100644 --- a/src/test/ref/struct-8.log +++ b/src/test/ref/struct-8.log @@ -14,6 +14,7 @@ Adding struct value member variable copy (byte) main::p_x ← (byte) $a Adding struct value member variable copy (byte) main::p_y ← (byte) $a Adding struct value member variable copy (struct Point) main::c_center ← (struct Point) main::p Adding struct value member variable copy (byte) main::c_radius ← (byte) 5 +Postponing unwinding for (struct Point) main::point ← (struct Circle) main::c.center Replacing struct member reference (struct Circle) main::c.center with member unwinding reference (struct Point) main::c_center Replacing struct member reference (struct Point) main::point.x with member unwinding reference (byte) main::point_x Replacing struct member reference (struct Point) main::point.y with member unwinding reference (byte) main::point_y diff --git a/src/test/ref/struct-9.log b/src/test/ref/struct-9.log index ffe6fced8..a5be9a635 100644 --- a/src/test/ref/struct-9.log +++ b/src/test/ref/struct-9.log @@ -11,6 +11,7 @@ Adding struct value member variable copy (byte) main::p_x ← (byte) $a Adding struct value member variable copy (byte) main::p_y ← (byte) $a Adding struct value member variable copy (struct Point) main::c_center ← {} Adding struct value member variable copy (byte) main::c_radius ← (byte) 0 +Postponing unwinding for (struct Circle) main::c.center ← (struct Point) main::p Replacing struct member reference (struct Circle) main::c.center with member unwinding reference (struct Point) main::c_center Replacing struct member reference (struct Circle) main::c.radius with member unwinding reference (byte) main::c_radius Replacing struct member reference (struct Circle) main::c.center with member unwinding reference (struct Point) main::c_center