gcl-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Gcl-devel] Re: 2.6.7


From: Camm Maguire
Subject: [Gcl-devel] Re: 2.6.7
Date: 18 Jul 2005 13:18:04 -0400
User-agent: Gnus/5.09 (Gnus v5.9.0) Emacs/21.2

Greetings!

export CVS_RSH=ssh
export CVSROOT=:ext:address@hidden:/cvsroot/gcl

cvs -z9 -q co -d gcl-2.6.7pre -r Version_2_6_7pre gcl

BTW, I did see your issue when using full optimization.  gcc 4.0
clobbered a variable across a longjump without warning (typically one
gets a warning in this situation.)  The following mini-patch now in
the 2.6.7pre branch fixes this.  Perhaps you might be able to let the
gcc people know of this situation e.g. file a bug?  I'm too short on
time to do so myself now.

Take care,

=============================================================================
Ftagbody C function -- tinf and tinf_base are stored in registers on
opt level -O3 and clobbered across the longjump without warning using -Wall.
=============================================================================
FFD(Ftagbody)(object body)
{

        object *old_top = vs_top;
        object *new_top;
        VOL object *tinf;           /* These volatile declarations are
                                        needed to fix the problem. */
        VOL object *tinf_base;
        object *env = lex_env;
        object id = alloc_frame_id();
        object bodysv = body;
        object label;
        enum type item_type;

        vs_push(id);
        lex_copy();
        tinf_base = vs_top;
        while (!endp(body)) {
                label = MMcar(body);
                item_type = type_of(label);
                if (item_type == t_symbol || item_type == t_fixnum ||
                    item_type == t_bignum) {
                        lex_tag_bind(label, id);
                        vs_push(label);
                        vs_push(MMcdr(body));
                }
                body = MMcdr(body);
        }

        new_top = vs_top;

        frs_push(FRS_CATCH, id);
        body = bodysv;
        if (nlj_active) {
                label = cdr(nlj_tag);
                nlj_active = FALSE;
                for(tinf = tinf_base;
                    tinf < new_top && !eql(tinf[0],label);
                    tinf += 2)
                        ;
                if (tinf >= new_top)
                        FEerror("Someone tried to RETURN-FROM a TAGBODY.",0);
                body = tinf[1];
        }
        while (body != Cnil) {
                vs_top = new_top;
                item_type = type_of(MMcar(body));
                if (item_type != t_symbol && item_type != t_fixnum &&
                    item_type != t_bignum)
                        eval(MMcar(body));
                body = MMcdr(body);
        }
        frs_pop();
        lex_env = env;
        vs_base = old_top;
        vs_top = old_top+1;
        vs_base[0] = Cnil;
}


=============================================================================
Preprocessed output of above
=============================================================================

# 28 "prog.c" 2
# 47 "prog.c"
void Ftagbody(object body)
{

 object *old_top = vs_top;
 object *new_top;
 volatile object *tinf;
 volatile object *tinf_base;
 object *env = lex_env;
 object id = alloc_object(t_spice);
 object bodysv = body;
 object label;
 enum type item_type;

 (*vs_top++ = (id));
 ihs_top->ihs_base = vs_top; (*vs_top++ = (lex_env[0])); (*vs_top++ = 
(lex_env[1])); (*vs_top++ = (lex_env[2])); lex_env = vs_top - 3;
 tinf_base = vs_top;
 while (!({ static struct cons 
s_my_dot={t_cons,0,0,0,((object)&Dotnil_body),((object)&Dotnil_body)}; object 
_x=(body); bool _b=0; if (((enum type)(((object)(_x))->d.t))==t_cons) { if 
(((enum type)(((object)(_x->c.c_cdr))->d.t))!=t_cons && 
_x->c.c_cdr!=((object)&Cnil_body)) s_my_dot.c_car=_x->c.c_cdr; else 
s_my_dot.c_car=((object)&Dotnil_body); } else { if (_x==s_my_dot.c_car) 
body=(object)&s_my_dot; else { s_my_dot.c_car=((object)&Dotnil_body); if 
(_x==((object)&Cnil_body) || _x==((object)&Dotnil_body)) _b=1; else 
FEwrong_type_argument(sLlist, _x); } } _b; })) {
  label = (body)->c.c_car;
  item_type = ((enum type)(((object)(label))->d.t));
  if (item_type == t_symbol || item_type == t_fixnum ||
             item_type == t_bignum) {
   lex_tag_bind(label, id);
   (*vs_top++ = (label));
   (*vs_top++ = ((body)->c.c_cdr));
  }
  body = (body)->c.c_cdr;
 }

 new_top = vs_top;

 do { frame_ptr _frs_top = frs_top +1; if (_frs_top >= frs_limit) 
frs_overflow(); _frs_top->frs_lex = lex_env; _frs_top->frs_bds_top = bds_top; 
_frs_top->frs_class = (FRS_CATCH); _frs_top->frs_in_signal_handler = 
in_signal_handler; _frs_top->frs_val = (id); _frs_top->frs_ihs = ihs_top; 
frs_top=_frs_top; _setjmp (_frs_top->frs_jmpbuf); } while (0);
 body = bodysv;
 if (nlj_active) {
  label = cdr(nlj_tag);
  nlj_active = 0;
  for(tinf = tinf_base;
      tinf < new_top && !eql(tinf[0],label);
      tinf += 2)
   ;
  if (tinf >= new_top)
   FEerror("Someone tried to RETURN-FROM a TAGBODY.",0);
  body = tinf[1];
 }
 while (body != ((object)&Cnil_body)) {
  vs_top = new_top;
  item_type = ((enum type)(((object)((body)->c.c_car))->d.t));
  if (item_type != t_symbol && item_type != t_fixnum &&
      item_type != t_bignum)
   eval((body)->c.c_car);
  body = (body)->c.c_cdr;
 }
 frs_top--;
 lex_env = env;
 vs_base = old_top;
 vs_top = old_top+1;
 vs_base[0] = ((object)&Cnil_body);
}

=============================================================================


Take care,


Jorge Daza <address@hidden> writes:

> > If you want, I can show you how to get the
> > pre-release from cvs.
> 
> Yes, please, could you tell me ?
> 
> Thanks !
> 
> Jorge
> 
> 
> 

-- 
Camm Maguire                                            address@hidden
==========================================================================
"The earth is but one country, and mankind its citizens."  --  Baha'u'llah




reply via email to

[Prev in Thread] Current Thread [Next in Thread]