[CM] Possible bug with c-object & openlet

Christos Vagias chris.actondev at gmail.com
Mon Dec 20 05:45:11 PST 2021

Hi Bil,

I think I found a bug:
When creating an object with

  s7_pointer obj = s7_make_c_object(sc, type_foo, new Foo{});
  s7_pointer methods = s7_eval_c_string(
      sc, "(inlet :write foo-write))");
  // Without gc_protect the c_object loses its methods after gc
  if(arg_gc_protect == 1) s7_gc_protect(sc, methods);
  s7_c_object_set_let(sc, obj, methods);
  return s7_openlet(sc, obj);

(as the comment says) without gc_protect of the c_object let/methods, the
c_object loses its methods after gc.
I'd assume that since we "set_let" to a value that still is "alive", it's
"let/methods objects" would also not be garbage collected (at least I
assume that the let is getting gc'ed).

I'm attaching a demo program
- ./main 0 # no gc_protect, errors
- ./main 1 # gc_protect, no errors
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://cm-mail.stanford.edu/pipermail/cmdist/attachments/20211220/9a59238f/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: bug-cc.zip
Type: application/zip
Size: 1622 bytes
Desc: not available
URL: <https://cm-mail.stanford.edu/pipermail/cmdist/attachments/20211220/9a59238f/attachment.zip>

More information about the Cmdist mailing list