Skip to content

Commit 8ac9353

Browse files
committed
Crash if v. n with v undefined; pass WILLOPEN through u&n n&v hook; unfinished business
1 parent a7774a7 commit 8ac9353

File tree

14 files changed

+216
-199
lines changed

14 files changed

+216
-199
lines changed

jsrc/am.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -616,7 +616,7 @@ onecellframe:; // come here when we detect single cell, possibly of higher ran
616616
if(JT(jt,deprecct)!=0)RZ(jtdeprecmsg(jt,1,"(001) (x (<\"0 array)} y): consider using (<<array)}\n"));
617617
goto doubleboxednumeric; // the boxes were created with <"0 array. That is the same as <<array now
618618
}else if(AR(ind0)==indr+1){
619-
if(JT(jt,deprecct)!=0)RZ(jtdeprecmsg(jt,2,"(002) (x (<\"1 array)} y): consider using <array} or array}\n"));
619+
if(JT(jt,deprecct)!=0)RZ(jtdeprecmsg(jt,2,"(002) (x (<\"1 array)} y): consider using (<array)} or array}\n"));
620620
goto boxednumeric; // the boxes were created with <"1 array, which is like <array now
621621
}else ASSERT(0,EVRANK) // error if not <"0 or <"1
622622
}else{

jsrc/ca.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -482,6 +482,7 @@ F2(jtamp){F2PREFIP;A h=0;AF f1,f2;B b;C c;I flag,flag2=0,linktype=0,mode=-1,p,r;
482482
if(likely(f2==on2)){flag2|=VF2RANKATOP2; f2=r==RMAX?on2cell:f2; f2=r==0?on20:f2;}
483483
fdeffillall(z,flag2,CAMP,VERB, f1,f2, a,w,0L, flag, r,r,r,fffv->localuse.lu0.cachedloc=0,FAV(z)->localuse.lu1.linkvb=linktype);
484484
R z;
485+
485486
}else ASSERT((AT(a)|AT(w))&VERB,EVDOMAIN) // m&n not allowed
486487
// continuing must be m&v or u&n
487488
A va=AT(a)&VERB?a:w, na=AT(a)&VERB?w:a;
@@ -490,6 +491,9 @@ F2(jtamp){F2PREFIP;A h=0;AF f1,f2;B b;C c;I flag,flag2=0,linktype=0,mode=-1,p,r;
490491
p=FAV(va)->flag; flag=((p&(VJTFLGOK2|VIRS2))>>1)+(FAV(va)->flag&VASGSAFE);
491492
// the noun will be INCORPed by fdef
492493

494+
// take WILLOPEN/COUNT for the monad from the appropriate side of the dyadic verb.
495+
flag2=((FAV(va)->flag2)>>(AT(a)&VERB?VF2WILLOPEN2AX-VF2WILLOPEN1X:VF2WILLOPEN2WX-VF2WILLOPEN1X))&(VF2WILLOPEN1|VF2USESITEMCOUNT1);
496+
493497
// look for supported forms: comparison, i.-family, 128!:3. But not if the arg is atomic or empty - no value in that
494498
if((-AN(na)&-AR(na))<0){ // noun is not atomic and not empty
495499
if(unlikely(b=c==CFIT)){c=FAV(FAV(va)->fgh[0])->id; p=FAV(FAV(va)->fgh[0])->flag;} // if verb is u1!.n1, replace the id and flag with that of u1, and remember cct from n1
@@ -504,6 +508,7 @@ F2(jtamp){F2PREFIP;A h=0;AF f1,f2;B b;C c;I flag,flag2=0,linktype=0,mode=-1,p,r;
504508
}else if(unlikely(FAV(w)->valencefns[0]==jtcrc1)){RZ(h=crccompile(a)); f1=jtcrcfixedleft; flag&=~VJTFLGOK1; // m&128!:3
505509
}
506510
}
507-
fdeffillall(z,0,CAMP,VERB, f1,with2, a,w,h, flag, RMAX,RMAX,RMAX,fffv->localuse.lu0.cachedloc=0,FAV(z)->localuse.lu1.cct=cct);
511+
512+
fdeffillall(z,flag2,CAMP,VERB, f1,with2, a,w,h, flag, RMAX,RMAX,RMAX,fffv->localuse.lu0.cachedloc=0,FAV(z)->localuse.lu1.cct=cct);
508513
R z;
509514
}

jsrc/cf.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -323,9 +323,15 @@ A jthook(J jt,A a,A w,A h){AF f1=0,f2=0;C c,d,e,id;I flag=VFLAGNONE,linktype=0;V
323323
case CFROM: if(d==CGRADE){f2=jtordstati; flag &=~VJTFLGOK2;} else if(d==CTILDE&&e==CGRADE){f2=jtordstat; flag &=~VJTFLGOK2;}
324324
}
325325
}
326-
// scaf should inherit WILLOPEN/PROP from u and v
326+
327+
// Copy the open/raze status from u (for a) and v (for w) or both (for monad). PROP is not needed, since (u ][) is silly.
328+
// Since this status is a characteristic of the combined verb specs, it does not depend on the selection of f[12]
329+
I flag2=((v->flag2&(VF2WILLOPEN1|VF2USESITEMCOUNT1))<<(VF2WILLOPEN2WX-VF2WILLOPEN1X)) | // dyad w from v monad w
330+
(u->flag2&(VF2WILLOPEN2A|VF2USESITEMCOUNT2A)) | // dyad a from u dyad a
331+
(v->flag2&(VF2WILLOPEN1|VF2USESITEMCOUNT1) & ((u->flag2&(VF2WILLOPEN2A|VF2USESITEMCOUNT2A))>>(VF2WILLOPEN2AX-VF2WILLOPEN1X))); // monad only if monad w AND dyad a
332+
327333
// Return the derived verb
328-
fdeffillall(z,0,CHOOK, VERB, f1,f2, a,w,0L, flag, RMAX,RMAX,RMAX,fffv->localuse.lu0.cachedloc=0,FAV(z)->localuse.lu1.linkvb=linktype)
334+
fdeffillall(z,flag2,CHOOK, VERB, f1,f2, a,w,0L, flag, RMAX,RMAX,RMAX,fffv->localuse.lu0.cachedloc=0,FAV(z)->localuse.lu1.linkvb=linktype)
329335
R z;
330336
// All other cases produce a modifier unless they are immediately executable (V N or N/V A)
331337
}else{

jsrc/cip.c

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -227,8 +227,6 @@ typedef struct {
227227
I flgs; // complex, triangular processing flags
228228
I nbigtasks[2]; // number of tasks using taskm[0]; number of tasks that are not in the shortened tail
229229
I4 taskm[2]; // number of rows in leading tasks, unshortened trailing tasks
230-
// obsolete I nanerr; // nonzero whenever a nan was encountered; could indicate we should throw an error (_+__) or a case where we disagree with ieee (_*0)
231-
// scaf should deal with this case better; for the former case, should abort immediately (ideally siglonjmp or so but...); for the latter case, don't fall back to +/@(*"1 _), but rather recalculate the block with extra checks, maybe tell other threads about row/col containing inf/0
232230
} CACHEMMSTATE;
233231
#define OPHEIGHTX 2
234232
#define OPHEIGHT ((I)1<<OPHEIGHTX) // height of outer-product block
@@ -260,10 +258,7 @@ static NOINLINE C cachedmmultx(J jt,void *ctx,UI4 ti){ CACHEMMSTATE *pd=ctx;
260258
// Small problems should use a multiplier that does not use full cacheblock. For jobs, we make the decision for each task
261259
if(((((50-m)&(50-n)&(16-pstored)&((DCACHED_THRES-1)-m*n*pnom))|SGNIF(flgs,FLGCMPX))&SGNIFNOT(flgs,FLGWMINUSZX))>=0){ // blocked for small arrays in either dimension (after threading); not if CMP; force if WMINUSZ (can't be both)
262260
// blocked algorithm. there is no size limit on the blocks
263-
// obsolete I ok=blockedmmult(jt,av,wv,zv,m,n,pnom,pstored,flgs); // blockedmult uses normal JE return of 0=error
264261
R blockedmmult(jt,av,wv,zv,m,n,pnom,pstored,flgs)?0:EVNAN; // blockedmmult uses normal JE return of 0=error; we return job semantics, 0=OK
265-
// obsolete if(unlikely(!ok))__atomic_fetch_add(&pd->nanerr,1,__ATOMIC_RELAXED); //could be _fetch_or, but x86 has lock xadd
266-
// obsolete R 0; // scaf should return nonzero to abort if error
267262
}
268263

269264
D c[(CACHEHEIGHT+1)*CACHEWIDTH + (CACHEHEIGHT+1)*OPHEIGHT*OPWIDTH*2 + 2*CACHELINESIZE/sizeof(D)]; // 2 in case complex
@@ -522,9 +517,7 @@ static NOINLINE C cachedmmultx(J jt,void *ctx,UI4 ti){ CACHEMMSTATE *pd=ctx;
522517
flgs&=~(FLGZFIRST|FLGZLAST); // we have finished a 16x64 cache section. That touched all the columns of z. For the remaining sections we must accumulate into the z values. If this was the last pass, clear that flag too, since we're finished
523518
} // end of loop for each 16x64 section of w
524519
} // end of loop for each 64-col slice of w
525-
// obsolete if(unlikely(NANTEST))__atomic_fetch_add(&pd->nanerr,1,__ATOMIC_RELAXED);//could be _fetch_or, but x86 has lock xadd
526520
R unlikely(NANTEST)?EVNAN:0; // return job semantics, 0=OK
527-
// obsolete R 0; // scaf should return nonzero to abort if error
528521
}
529522
// looping entry point for cached mmul
530523
// We split the input into products where the left arg has at most MAXAROWS rows. This is to avoid overrunning L2 cache
@@ -562,7 +555,6 @@ I cachedmmult(J jt,D* av,D* wv,D* zv,I m,I n,I p,I flgs){
562555
CACHEMMSTATE ctx={.av=av,.wv=wv,.zv=zv,.m=m,.n=n,.p=p,.flgs=flgs,.nbigtasks={nfulltasks,nfulltasks+nremnant},.taskm={fulltasksize,endtasksize}};
563556
// number of full tasks, followed by number that have size 'endtasksize'. Later tasks have size endtasksize-CACHEHEIGHT
564557
R !jtjobrun(jt,cachedmmultx,&ctx,nfulltasks+tailtasks,0); // go run the tasks - default to threadpool 0. Switch return from job semantice to JE error samantics - 0 if error, 1 if OK
565-
// obsolete R !ctx.nanerr;
566558
}
567559

568560
#else

jsrc/cx.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -155,10 +155,9 @@ static B jtforinit(J jt,CDATA*cv,A t){A x;C*s,*v;I k;
155155
// result is address of cv after stack popped
156156
static CDATA* jtunstackcv(J jt,CDATA*cv,I assignvirt){
157157
if(cv->w==CFOR){
158-
if(cv->t){A svb; // if for_xyz. that has processed forinit ...
158+
if(cv->t){A svb; // if for_xyz. that has processed forinit ... svb=the virtual block for the item
159159
SYMORIGIN[cv->indexsym].flag&=~LREADONLY; // set xyz_index is no longer readonly. It is still available for inspection
160160
// If xyz still points to the virtual block, we must be exiting the loop early: the value must remain, so realize it
161-
; // the virtual block for the item
162161
if(likely((svb=cv->item)!=0)){ // if the svb was allocated...
163162
if(unlikely(SYMORIGIN[cv->itemsym].val==svb)){A newb; // svb was allocated, loop did not complete, and xyz has not been reassigned
164163
fa(svb); // remove svb from itemsym.val. Safe, because it can't be the last free
@@ -526,7 +525,7 @@ nextlinetcesx:; // here when we have the next tcesx already loaded, possibly w
526525
tdv->trap=PUSHTRYSTK;
527526
// turn off debugging UNLESS there is a catchd; then keep on only if user set debug mode
528527
// if debugging is already off, it stays off
529-
if(unlikely(jt->uflags.trace&TRACEDB)){jt->uflags.trace&=~TRACEDB; if((NPGpysfmtdl&16)&&isd)jt->uflags.trace|=TRACEDB1&(JT(jt,dbuser));} // scaf avoid branches
528+
if(unlikely(jt->uflags.trace&TRACEDB)){jt->uflags.trace&=~TRACEDB; if(unlikely(NPGpysfmtdl&(isd<<4)))jt->uflags.trace|=TRACEDB1&(JT(jt,dbuser));} // isd&&(flag&16)
530529
// debugging is now off if we are trapping. In that case, indicate that we are trapping errors, to prevent holding them for debug
531530
jt->emsgstate|=(~jt->uflags.trace&TRACEDB1)<<EMSGSTATETRAPPINGX; // turn on trapping if not now debug
532531
// We allow verbose messages in case the catch. wants to display them. This is different from u :: v
@@ -594,9 +593,10 @@ nextlinetcesx:; // here when we have the next tcesx already loaded, possibly w
594593
tcesx&=~(32<<TCESXTYPEX); // the flag for DOF is for the loop, but we are exiting, so turn off the flag
595594
case CENDSEL:
596595
// end. for select., and do. for for. after the last iteration, must pop the stack - just once
597-
// Must rat() if the current result might be final result, in case it includes the variables we will delete in unstack
598-
// (scaf this is no longer needed since names are not deleted but the result case is rare)
599-
if(unlikely(!(tcesx&TCESXCECANT)))BZ(z=rat(z)); cv=unstackcv(cv,1);
596+
// obsolete // Must rat() if the current result might be final result, in case it includes the variables we will delete in unstack
597+
// obsolete // (this is no longer needed since names are not deleted but the result case is rare)
598+
// obsolete if(unlikely(!(tcesx&TCESXCECANT)))BZ(z=rat(z));
599+
cv=unstackcv(cv,1); // This leaves xyz[_index] defined, so there is no need to rat() z
600600
if(FLAGGEDNOTRACE(tcesx)){--ic; goto dobblock;} // if flagged (must be ENDSEL), NSI is bblock, go do it without reading
601601
ic=CWGO(cwsent,CNSTOREDCW,ic); // continue at new location
602602
goto nextline;

jsrc/jt.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -404,15 +404,16 @@ typedef struct JSTstruct {
404404
// Cacheline 7: startup (scripts and deprecmsgs), essentially read-only
405405
C _cl7[0];
406406
A slist; // boxed list of filenames used in right arg to 0!:, the entries made in sn field of L blocks are indexes into this. AM has # valid entries
407-
A deprecex; // list of INTs of messages not to display // scaf could be a short mask
408407
I4 deprecct; // number of deprecation errors to display, -1 to emsg
409408
S startlock; // lock for slist
409+
US deprecex; // bitmask of messages not to display
410410
// rest of cacheline used only in exceptional paths
411+
US cachesizes[3]; // [0]: size of fastest cache [1]: size of largest cache private to each core [2]: size of largest cache shared by all cores, in multiples of 4KB
411412
C bx[11]; /* box drawing characters */
412413
UC disp[7]; // # different verb displays, followed by list thereof in order of display could be 15 bits
413-
US cachesizes[3]; // [0]: size of fastest cache [1]: size of largest cache private to each core [2]: size of largest cache shared by all cores, in multiples of 4KB
414414
C oleop; /* com flag to capture output */
415415
UC cstacktype; /* cstackmin set during 0: jt init 1: passed in JSM 2: set in JDo */
416+
// 6 bytes free
416417
#if PYXES || 1
417418
JOBQ (*jobqueue)[MAXTHREADPOOLS]; // one JOBQ block for each threadpool
418419
I filler7[1];

jsrc/jtype.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -531,7 +531,7 @@ typedef I SI;
531531
#define TRAVERSIBLE (BOX|VERB|ADV|CONJ|RAT|XNUM|NAME|SYMB|SPARSE)
532532
// Allow recursive usecount in one of these types
533533
// A recursive block is flagged by having the recursible type bit copied into the AFLAG. But note: the block is not recursible unless the same bit is set in both
534-
// the type and the flag, where something like (0$a:) + 0$0 might reuse an argument block and leave the flags showing boxed when the type is B01. scaf should fix this?
534+
// the type and the flag, where something like (0$a:) + 0$0 might reuse an argument block and leave the flags showing boxed when the type is B01.
535535
// We know that any block that has been ra()d is recursive, and therefore that fa() can assume recursibility for any recursible type
536536
#define RECURSIBLE (BOX|VERB|ADV|CONJ|RAT|XNUM|NAME|SYMB) // sparse box not allowed
537537
// SYMB is TRAVERSIBLE so that fa() will call to free the symbols, and RECURSIBLE so that fanapop will pass the type-flag. To ensure that a SYMB is always freed when
@@ -1219,7 +1219,7 @@ typedef struct {
12191219
#define VF2WILLOPEN1X 4 // This verb will open y as its first act, or will discard y. No boxed contents in y can appear in the result (they may be virtual). Monad case only. This becomes the WILLBEOPENED flag in jt
12201220
#define VF2WILLOPEN1 ((I)(((I)1)<<VF2WILLOPEN1X))
12211221
// must leave a gap for WILLBEOPENED in result.h
1222-
// 6 free
1222+
// 5-6 free
12231223
// next flag must be same as JTCOUNTITEMS
12241224
#define VF2USESITEMCOUNT1X 7 // This verb can make use of an item count stored in m. Monad case only
12251225
#define VF2USESITEMCOUNT1 ((I)(((I)1)<<VF2USESITEMCOUNT1X))
@@ -1251,10 +1251,10 @@ typedef struct {
12511251
#define VF2WILLOPEN2A ((I)(((I)1)<<VF2WILLOPEN2AX))
12521252
#define VF2USESITEMCOUNT2WX 19 // This verb can make use of an item count stored in m. This becomes the COUNTITEMS flag in jt
12531253
#define VF2USESITEMCOUNT2W ((I)(((I)1)<<VF2USESITEMCOUNT2WX))
1254-
#define VF2USESITEMCOUNT2AX 21 // This verb can make use of an item count stored in m. This becomes the COUNTITEMS flag in jt
1255-
#define VF2USESITEMCOUNT2A ((I)(((I)1)<<VF2USESITEMCOUNT2AX))
12561254
#define VF2IMPLOCX 20 // This verb is one of u. v.
12571255
#define VF2IMPLOC ((I)(((I)1)<<VF2IMPLOCX))
1256+
#define VF2USESITEMCOUNT2AX 21 // This verb can make use of an item count stored in m. This becomes the COUNTITEMS flag in jt
1257+
#define VF2USESITEMCOUNT2A ((I)(((I)1)<<VF2USESITEMCOUNT2AX))
12581258
#define VF2CACHEABLEX 21 // In a nameref, indicates the nameref is cacheable
12591259
#define VF2CACHEABLE ((I)(((I)1)<<VF2CACHEABLEX))
12601260
#define VF2PRIMX 22 // Set in primitive ACV

jsrc/sc.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,11 +83,11 @@ DF2(jtunquote){A z;
8383
}
8484
fs=jtsyrd1((J)((I)jt+NAV(thisname)->m),NAV(thisname)->s,NAV(thisname)->hash,explocale); // Look up the name starting in the locale of the locative
8585
}else{ // u./v. We have to look at the assigned name/value to know whether this is an implied locative (it usually is)
86-
if(fs=jtprobe((J)((I)jt+NAV(thisname)->m),NAV(thisname)->s,NAV(thisname)->hash,jt->locsyms)){ // look only in local symbols
86+
if(likely((fs=jtprobe((J)((I)jt+NAV(thisname)->m),NAV(thisname)->s,NAV(thisname)->hash,jt->locsyms))!=0)){ // look only in local symbols
8787
// u/v, assigned by xdefn. Implied locative. Switch locals and globals to caller's environment
8888
jt->locsyms=(A)AM(jt->locsyms); explocale=AKGST(jt->locsyms); // move to new locals and their globals (up the local-sym chain)
8989
raposlocal(QCWORD(fs),fs); // incr usecount to match what syrd1 does
90-
}
90+
}else explocale=jt->global; // explocale must be defined for flgd0cpC
9191
}
9292
flgd0cpC|=((explocale!=jt->global)&~(LXAV0(explocale)[SYMLEXECCT]>>EXECCTPERMX))<<FLGLOCINCRDECRX; // remember that there is a change of locale to non-PERMANENT
9393
SYMSETGLOBAL(explocale); // switch to the (possibly new) locale. We DO NOT change AKGST because if we are calling a non-operator modifier we need the old locale if the modifier calls u./v. .
@@ -101,7 +101,6 @@ DF2(jtunquote){A z;
101101
// ** as of here we know there is a value for the name, and it has been ra()d. We must not take an error exit without fa
102102
ASSERTSUFF(PARTOFSPEECHEQACV(AT(self),AT(fs)),EVDOMAIN,z=0; fa(fs); goto exitname;); // make sure its part of speech has not changed since the name was parsed; if error must use general fa
103103
// if this reference allows caching (lI4[0]<0), save the value if it comes from a cachable source, and attach the primitive block to the name
104-
// we have to wait till here to
105104
if(unlikely((FAV(self)->flag2>>(VF2CACHEABLEX-QCNAMEDX))&namedloc)){ // cacheable nameref, and value found in a named locale
106105
thisname=jt->curname; // refresh thisname
107106
// the nameref is cachable. Fill it in. Happens the first time a cachable reference is encountered.

jsrc/vo.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -684,7 +684,8 @@ F1(jtraze){A*v,y,z;C* RESTRICT zu;I *wws,d,i,klg,m=0,n,r=1,t=0,te=0;
684684
GA(z,t,m*nitems,r,wws); AS(z)[0]=nitems; // allocate the result area; finish shape
685685
zu=CAV(z); klg=bplg(t); // input pointers, depending on type; length of an item
686686
// loop through the boxes copying the data into sequential output positions. pyx impossible
687-
DO(n, y=v[i]; d=AN(y)<<klg; MC(zu,AV(y),d); zu+=d;) // scaf use JMC
687+
// obsolete DO(n, y=v[i]; d=AN(y)<<klg; MC(zu,AV(y),d); zu+=d;)
688+
DO(n, y=v[i]; d=AN(y)<<klg; JMC(zu,AV(y),d,0); zu+=d;) // copy the items
688689
}
689690

690691
RETF(z);

jsrc/x.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -286,9 +286,6 @@ void jtforeigninit(J jt){UI i;
286286
MN(9,57) XPRIM(VERB, jtaudittdisab, 0, VFLAGNONE,VF2NONE,RMAX,RMAX,RMAX);
287287
MN(9,58) XPRIM(VERB, jtgemmtune, jtgemmtune2, VFLAGNONE,VF2NONE,RMAX,RMAX,RMAX);
288288
MN(9,59) XPRIM(VERB, jtemsglevel, 0, VFLAGNONE,VF2NONE,RMAX,RMAX,RMAX);
289-
MN(9,60) XPRIM(VERB, jtleakblockread, 0, VFLAGNONE,VF2NONE,RMAX,RMAX,RMAX);
290-
MN(9,61) XPRIM(VERB, jtleakblockreset, 0, VFLAGNONE,VF2NONE,RMAX,RMAX,RMAX);
291-
MN(9,63) XPRIM(VERB, jtshowinplacing1, jtshowinplacing2, VASGSAFE|VJTFLGOK1|VJTFLGOK2,VF2NONE,RMAX,RMAX,RMAX);
292289
MN(9,66) XPRIM(VERB, jtcheckcompfeatures, 0, VASGSAFE,VF2NONE,RMAX,RMAX,RMAX);
293290
MN(13,0) XPRIM(VERB, jtdbc, 0, VFLAGNONE,VF2NONE,RMAX,RMAX,RMAX);
294291
MN(13,1) XPRIM(VERB, jtdbstack, 0, VFLAGNONE,VF2NONE,RMAX,RMAX,RMAX);
@@ -346,12 +343,15 @@ void jtforeigninit(J jt){UI i;
346343
MN(128,8) XPRIM(VERB, jtqhash12, jtqhash12, VASGSAFE|VJTFLGOK1|VJTFLGOK2,VF2NONE,RMAX,RMAX,RMAX);
347344
MN(128,10) XPRIM(VERB, jtludecomp, jtludecomp, VASGSAFE,VF2NONE,RMAX, RMAX,RMAX);
348345
MN(18,6) XPRIM(VERB, jtresetbloom, 0, VFLAGNONE,VF2NONE,RMAX,RMAX,RMAX);
349-
#if 0 // withdrawn
346+
#if 0 // obsolete
350347
MN(18,7) XPRIM(VERB, jtsetpermanent, 0, VFLAGNONE,VF2NONE,RMAX,RMAX,RMAX);
351348
#endif
352349

353350
MN(0,-1) XPRIM(VERB, jtskipinscript, 0, VFLAGNONE,VF2NONE,RMAX,RMAX,RMAX);
354351
MN(5,-1) XPRIM(VERB, 0, jtoutstr, VASGSAFE,VF2NONE,RMAX,RMAX,RMAX);
352+
MN(9,-1) XPRIM(VERB, jtleakblockread, 0, VFLAGNONE,VF2NONE,RMAX,RMAX,RMAX);
353+
MN(9,-2) XPRIM(VERB, jtleakblockreset, 0, VFLAGNONE,VF2NONE,RMAX,RMAX,RMAX);
354+
MN(9,-3) XPRIM(VERB, jtshowinplacing1, jtshowinplacing2, VASGSAFE|VJTFLGOK1|VJTFLGOK2,VF2NONE,RMAX,RMAX,RMAX);
355355
MN(13,-1) XPRIM(VERB, 0, jtfindrange, VFLAGNONE,VF2NONE,RMAX,RMAX,RMAX);
356356
MN(13,-2) XPRIM(VERB, 0, jtfindrange4, VFLAGNONE,VF2NONE,RMAX,RMAX,RMAX);
357357
MN(13,-3) XPRIM(VERB, 0, jtfindrange2, VFLAGNONE,VF2NONE,RMAX,RMAX,RMAX);

0 commit comments

Comments
 (0)