t_callback.mod 722 B

12345678910111213141516171819202122232425262728293031323334
  1. MODULE TCallback;
  2. (* A top-level V3 procedure is C-callable after the callback ABI change. *)
  3. FROM SYSTEM IMPORT ADDRESS, ADR;
  4. PROCEDURE add (a, b : INTEGER) : INTEGER;
  5. BEGIN
  6. RETURN a + b
  7. END add;
  8. PROCEDURE call_add (fn : ADDRESS; a, b : INTEGER) : INTEGER;
  9. EXTERNAL "m2_c_call_add";
  10. PROCEDURE call_two (fn, a, b : ADDRESS); EXTERNAL "m2_c_call_two";
  11. VAR
  12. ExitCode : INTEGER;
  13. gotA, gotB : ADDRESS;
  14. PROCEDURE two (a, b : ADDRESS);
  15. BEGIN
  16. gotA := a;
  17. gotB := b
  18. END two;
  19. BEGIN
  20. gotA := NIL;
  21. gotB := NIL;
  22. call_two(ADR(two), ADR(gotA), ADR(gotB));
  23. IF (call_add(ADR(add), 20, 22) = 42)
  24. AND (gotA = ADR(gotA)) AND (gotB = ADR(gotB)) THEN
  25. ExitCode := 42
  26. ELSE
  27. ExitCode := 1
  28. END
  29. END TCallback.