unofficial mirror of bug-guile@gnu.org 
 help / color / mirror / Atom feed
From: Andreas Rottmann <a.rottmann@gmx.at>
Subject: GOOPS bug found?
Date: 17 Apr 2002 21:35:00 +0200	[thread overview]
Message-ID: <a9kirg$tug$2@main.gmane.org> (raw)

[-- Attachment #1: Type: text/plain, Size: 1086 bytes --]

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


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: bug.c --]
[-- Type: text/x-csrc, Size: 1984 bytes --]

#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;
}

[-- Attachment #3: Type: text/plain, Size: 232 bytes --]


-- 
Andreas Rottmann         | Dru@ICQ        | 118634484@ICQ | a.rottmann@gmx.at
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

             reply	other threads:[~2002-04-17 19:35 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2002-04-17 19:35 Andreas Rottmann [this message]
     [not found] <87sn5uce57.fsf@alice.rhinosaur.lan>
2002-04-17 20:01 ` GOOPS bug found? Andreas Rottmann
2002-05-07 18:19 ` Marius Vollmer
2002-05-12 13:17   ` Andreas Rottmann

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/guile/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='a9kirg$tug$2@main.gmane.org' \
    --to=a.rottmann@gmx.at \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).