Re: Congratulation! Bug found!! (GC & C interfacing problems)

From: Markus Mottl (mottl@miss.wu-wien.ac.at)
Date: Tue Feb 22 2000 - 17:27:45 MET

  • Next message: Pascal Cuoq: "Re: Preferred GUI Toolkit for O'Caml 3?"

    > 3. However, this macro is calling modify (function defined in
    > byterun/memory.c) which in turn calls the Modify macro (defined in
    > byterun/memory.h). As Markus said, this macro adds the address
    > given in argument to a list of memory addresses (ref_table_ptr)
    > that should be examined by the GC at collection time.
    [...]
    > I also subscribe to this documentation revision. I also volunteer, if
    > needed, to review/rewrite the doc part related to Interfacing C with
    > OCaml.

    I guess that the confusion about the real things happening as explained in
    "3" above comes from "rule 6" in the documentation of the C-interface,
    which says:

      Direct assignment to a field of a block, as in

              Field(v, n) = w;

      is safe only if v is a block newly allocated by alloc_small; that
      is, if no allocation took place between the allocation of v and the
      assignment to the field. In all other cases, never assign directly.

    This "safe only" and "in all other cases, never assign directly" leaves the
    impression that the "Field" macro is a bit "evil" and could be avoided,
    possibly by using this nice "Store_field"-macro. However, it is not only
    "safe" to use "Field" in this case, it seems (?) that this is the only way
    to do it correctly. Furthermore, I did not find any documentation on
    correctly placing values into blocks created with "alloc_final", which
    seems to be pretty similar to "alloc_small" in this respect.

    The only information I found concerning "alloc_small" which appears to
    indicate correct usage is:

      alloc_small(n, t) returns a fresh small block of size n <=
      Max_young_wosize words, with tag t. If this block is a structured block
      (i.e. if t < No_scan_tag), then the fields of the block (initially
      containing garbage) must be initialized with legal values (using direct
      assignment to the fields of the block) before the next allocation.

    The intention of "using direct assignment to the fields" is obviously meant
    as hint to use the "Field"-macro. Because most people don't know that
    "Store_field" not only assigns directly, but does unexpected other things,
    this information does probably not help...

    Best regards,
    Markus Mottl

    -- 
    Markus Mottl, mottl@miss.wu-wien.ac.at, http://miss.wu-wien.ac.at/~mottl
    



    This archive was generated by hypermail 2b29 : Tue Feb 22 2000 - 18:59:01 MET