Hi!
[Note: this bug refers to Guile 1.7.0 from CVS, only some days old]
As my C++ <-> Guile bindings (ucxx.sf.net) are approaching
completeness, I have run into another strange problem. I have managed
to isolate the code that causes it and wrote a self-contained C
program that exposes the bug.
Here is what I do:
1) I create a new class, containing one slot using
scm_basic_create_class().
2) I then add a method to 'initialize', specialized for the newly
created class, that calls a C function.
3) I create a new class, inheriting from the C-created class, and
instantiate one object of the new class (using make).
4) I do (define-method (initialize (obj <new-class>) initargs) (next-method)).
This expression leads to this:
ERROR: In procedure struct-ref:
ERROR: Wrong type argument in position 1 (expecting STRUCTP): ()
A backtrace (using my original code) is attached, but you should
easily be able to reproduce and investigate this strange behaviour
using the attached C program.
I hope someone can shed light on this strange thing...
Regards, Andy
#include <stdio.h>
#include <libguile.h>
static SCM my_constructor(SCM obj, SCM initargs)
{
printf("constructor called!\n");
scm_slot_set_x(obj, scm_str2symbol("a-slot"), SCM_BOOL_T);
return obj;
}
static void set_constructor(SCM klass, SCM (*proc)(SCM, SCM))
{
SCM initialize = scm_variable_ref(
scm_c_module_lookup(scm_module_goops, "initialize"));
SCM sym_obj = scm_str2symbol("obj");
SCM sym_args = scm_str2symbol("args");
SCM constr = scm_c_make_gsubr("constructor", 1, 0, 1, proc);
SCM constrm = scm_closure(scm_list_2(scm_list_2(sym_obj, sym_args),
scm_list_3(constr, sym_obj, sym_args)),
SCM_EOL);
SCM meth = scm_make(scm_list_5(scm_class_method,
scm_c_make_keyword("specializers"),
scm_list_2(klass, scm_class_top),
scm_c_make_keyword("procedure"),
constrm));
scm_add_method(initialize, meth);
}
static void real_main(void *closure, int argc, char *argv[])
{
SCM klass, slots;
scm_load_goops();
slots = scm_list_1(scm_list_3(scm_str2symbol("a-slot"),
scm_c_make_keyword("init-value"),
SCM_BOOL_F));
klass = scm_basic_make_class(scm_class_class, scm_makfrom0str("<my-object>"),
scm_list_1(scm_class_object),
slots);
set_constructor(klass, my_constructor);
scm_c_define("<my-object>", klass);
scm_c_eval_string("(use-modules (oop goops))");
scm_c_eval_string("(define-class <new-object> (<my-object>))");
scm_c_eval_string("(make <new-object>)");
// this produces the error
scm_c_eval_string("(define-method (initialize (obj <new-object>) initargs)"
" (next-method))");
}
int main(int argc, char *argv[])
{
scm_boot_guile(argc, argv, real_main, NULL);
return 0;
}
--
Andreas Rottmann | Dru@ICQ | 118634484@ICQ | [EMAIL PROTECTED]
http://www.8ung.at/rotty | GnuPG Key: http://www.8ung.at/rotty/gpg.asc
Fingerprint | DFB4 4EB4 78A4 5EEE 6219 F228 F92F CFC5 01FD 5B62