MODULE TCallback; (* A top-level V3 procedure is C-callable after the callback ABI change. *) FROM SYSTEM IMPORT ADDRESS, ADR; PROCEDURE add (a, b : INTEGER) : INTEGER; BEGIN RETURN a + b END add; PROCEDURE call_add (fn : ADDRESS; a, b : INTEGER) : INTEGER; EXTERNAL "m2_c_call_add"; PROCEDURE call_two (fn, a, b : ADDRESS); EXTERNAL "m2_c_call_two"; VAR ExitCode : INTEGER; gotA, gotB : ADDRESS; PROCEDURE two (a, b : ADDRESS); BEGIN gotA := a; gotB := b END two; BEGIN gotA := NIL; gotB := NIL; call_two(ADR(two), ADR(gotA), ADR(gotB)); IF (call_add(ADR(add), 20, 22) = 42) AND (gotA = ADR(gotA)) AND (gotB = ADR(gotB)) THEN ExitCode := 42 ELSE ExitCode := 1 END END TCallback.