Hi Bil,

I stumbled upon a case where s7 is segfaulting.
See the attached files.

g++ -o main ./main.cpp s7.o -ldl -I.

./main 1000 # ok
./main 10000 # seg fault

Thanks,
Christos
#include <stdlib.h>
#include <vector>
#include <stdio.h>
#include "s7.h"
#include <cassert>
struct Node {
  int gc_loc;
  s7_scheme* sc;
  s7_pointer data;
  ~Node() {
    s7_gc_unprotect_at(sc, gc_loc);
  }
};
typedef std::vector<Node *> Vec;
int g_type;

#define HELP_make_vec "(make-vec)"
s7_pointer scm_make_vec(s7_scheme* sc, s7_pointer args) {
  Vec* vec = new Vec;
  
  return s7_make_c_object(sc, g_type, vec);
}

void bind_make_vec(s7_scheme* sc, s7_pointer env) {
  s7_define(sc, env, s7_make_symbol(sc, "make-vec"),
            s7_make_function(sc, "make-vec",
                             scm_make_vec,
                             0, 0, false, // req, opt, rest?
                             HELP_make_vec)
            );
}


#define HELP_push_bang "(push! vec item)"
s7_pointer scm_push_bang(s7_scheme* sc, s7_pointer args) {
  Vec* vec = (Vec*)s7_c_object_value(s7_car(args));
  s7_pointer item = s7_cadr(args);
  Node* node = new Node;
  node->sc = sc;
  node->gc_loc = s7_gc_protect(sc, item);
  node->data = item;
  vec->push_back(node);
  
  return s7_nil(sc);
}

void bind_push_bang(s7_scheme* sc, s7_pointer env) {
  s7_define(sc, env, s7_make_symbol(sc, "push!"),
            s7_make_function(sc, "push!",
                             scm_push_bang,
                             2, 0, false, // req, opt, rest?
                             HELP_push_bang)
            );
}

s7_pointer free_vec(s7_scheme* sc, s7_pointer obj) {
  Vec* vec = (Vec*)s7_c_object_value(obj);
  printf("vec dtor..\n");
  int count = 0;
  for(Node* node : *vec) {
    count++;
    // printf("deleting node\n");
    delete node;
  }
  delete vec;
  printf("  deleted %d items\n", count);
  return s7_nil(sc);
}

int main(int argc, char** argv) {
  printf("hi there\n");
  s7_scheme* sc = s7_init();
  assert(argc == 2);
  int count = atoi(argv[1]);
  s7_define_variable(sc, "c/count", s7_make_integer(sc, count));
  g_type = s7_make_c_type(sc, "<vec>");
  s7_c_type_set_gc_free(sc, g_type, free_vec);
  bind_make_vec(sc, s7_nil(sc));
  bind_push_bang(sc, s7_nil(sc));
  s7_load(sc, "main.scm");
  s7_free(sc);

  return 0;
}
(define range
  (let ((+documentation+ "(range n (start 0) (step 1)) returns a list counting from start for n:\n\
    (iota 3) -> '(0 1 2)"))
    (lambda* (n (start 0) (step 1))
             (if (or (not (integer? n))
                     (< n 0))
                 (error 'wrong-type-arg "iota length ~A should be a non-negative integer" n))
             (let ((lst (make-list n)))
               (do ((p lst (cdr p))
                    (i start (+ i step)))
                   ((null? p) lst)
                 (set! (car p) i))))))

(define vec (make-vec))
(for-each (lambda (i)
	    (push! vec (inlet :i i)))
	  (range c/count))
_______________________________________________
Cmdist mailing list
[email protected]
https://cm-mail.stanford.edu/mailman/listinfo/cmdist

Reply via email to