I don't know what has happened or any idea about symbol table. It crashed in s.c , back trace:
#0 0x00007ffff7065ff4 in jtprobe (jt=jt@entry=0x643e70, a=<optimized out>, g=0x7ffff7f315a0) at /home/bill/gitdev/jsource/jsrc/s.c:167 #1 0x00007ffff7066467 in jtprobelocal (jt=jt@entry=0x643e70, a=a@entry=0x7ffff7f31620) at /home/bill/gitdev/jsource/jsrc/s.c:202 #2 0x00007ffff70667f4 in jtsyrd (jt=jt@entry=0x643e70, a=0x7ffff7f31620, symb=symb@entry=0x0) at /home/bill/gitdev/jsource/jsrc/s.c:314 #3 0x00007ffff706b2ec in jtex (jt=jt@entry=0x643e70, w=<optimized out>) at /home/bill/gitdev/jsource/jsrc/sn.c:205 #4 0x00007ffff717b09a in jttest (jt=0x643e70, w=0x7ffff7f317a0) at /home/bill/gitdev/jsource/jsrc/x.c:262 #5 0x00007ffff701a09b in jtdfs1 (jt=jt@entry=0x643e70, w=<optimized out>, self=<optimized out>) at /home/bill/gitdev/jsource/jsrc/au.c:32 #6 0x00007ffff705bdbd in jtparsea (jt=jt@entry=0x643e70, w=w@entry=0x7ffff7f31320) at /home/bill/gitdev/jsource/jsrc/p.c:376 #7 0x00007ffff705c890 in jtparse (jt=jt@entry=0x643e70, w=0x7ffff7f31320) at /home/bill/gitdev/jsource/jsrc/p.c:126 #8 0x00007ffff705ea5a in jtimmex (jt=jt@entry=0x643e70, w=w@entry=0x7ffff7f312a0) at /home/bill/gitdev/jsource/jsrc/px.c:37 #9 0x00007ffff7052f0b in jdo (jt=jt@entry=0x643e70, lp=<optimized out>) at /home/bill/gitdev/jsource/jsrc/io.c:148 #10 0x00007ffff7052f4a in JDo (jt=0x643e70, lp=<optimized out>) at /home/bill/gitdev/jsource/jsrc/io.c:203 #11 0x0000000000402422 in jedo () #12 0x000000000040240c in main () list starting from 161 (crashed at line 167), perhaps you may want to reinstate line 166 for checking. 161 // a is A for name, g is symbol table 162 // result is L* address of the symbol-table entry for the name, or 0 if not found 163 L*jtprobe(J jt,A a,A g){C*s;I*hv,m;L*v;NM*u; 164 RZ(a&&g);u=NAV(a); 165 // If there is bucket information, 166 // obsolete ASSERTSYS(jt->local||(u->bucket==0&&u->bucketx==0),"bucket"); 167 m=u->m; s=u->s; hv=AV(g)+SYMHASH(u->hash,AN(g)-SYMLINFOSIZE); // get bucket number among the hash tables 168 if(!*hv)R 0; /* (0) empty slot */ 169 v=*hv+jt->sympv; 170 while(1){ 171 u=NAV(v->name); 172 if(m==u->m&&!memcmp(s,u->s,m))R v->val?v:0; // (1) exact match - if there is a value, use this slot, else say not found 173 if(!v->next)R 0; /* (2) link list end */ 174 v=v->next+jt->sympv; 175 }} Пт, 12 авг 2016, Thomas Costigliola написал(а): > I am having trouble with custom code that used to work but no longer does in > the latest beta sources. The trouble seems to be related to symbol tables > and/or reference counting etc. I managed to reduce the issues to a small > piece of code which crashes under some circumstances but does not in the > pre-805 J sources. > > // in x.c > // Foreign 104 !: 1 > ... > case XC(104,1): R CDERIV(CIBEAM, jttest, 0, RMAX, 0, 0 ); > ... > > static F1(jttest){A z, n, loc=jt->local; > RZ(w); > RZ(jt->local=stcreate(2,1L,0L,0L)); > n=nfs(1,"A"); > IS(n,w); > ex(box(cstr("A"))); > symfreeh(jt->local,0L); > jt->local=loc; > R w; > } > > The code does the following: > 1. Create a local symbol table > 2. Assign the argument w to A in the local symbol table > 3. Erase A in the local symbol table > 4. Erase the local symbol table > 5. Return the argument > > Doing the following in the J session causes a crash in symfreeh due to > accessing invalid memory in jt->sympv > > 104!:1 ] 1 2 3 > 1 2 3 > B=. 1 2 3 > 104!:1 B > 1 2 3 > 104!:1 B > 1 2 3 > 104!:1 B > 1 2 3 > 104!:1 B > 1 2 3 > 104!:1 B > BOOM! > > Is this a bug or is there a new way to deal with local symbol tables? > ---------------------------------------------------------------------- > For information about J forums see http://www.jsoftware.com/forums.htm -- regards, ==================================================== GPG key 1024D/4434BAB3 2008-08-24 gpg --keyserver subkeys.pgp.net --recv-keys 4434BAB3 gpg --keyserver subkeys.pgp.net --armor --export 4434BAB3 ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm