Greetings,
While preparing a minor JOD update to better support editing when running
JOD from
jconsole I noticed the compj verb in JOD was no longer completely
compressing words.
This caused my JOD build scripts to fail so I started debugging and noticed
J 8.05 can lose the shape of explicit J y arguments under some
circumstances. This is
a very serious bug! Observe the following debugging trace of the
(compressj) word listed
at the end of this message.
NB. debugging trace - of running JOD session with all objects created
JVERSION
Engine: j805/j64/windows
Release: commercial/2016-12-11T08:02:16
Library: 8.05.11
Qt IDE: 1.5.3/5.6.2
Platform: Win 64
Installer: J805 install
InstallPath: c:/j64/j64-805
Contact: www.jsoftware.com
dbr 1
1 pick compj_3_ 'docfmt2'
|stop: compressj
| w=.1 e.CWSONLY E.,y
|compressj[13]
$y
28 71
|stop
| iy=.y
|compressj[16]
|stop
| u=.dewhitejcr y
|compressj[17]
|stop
| w
|compressj[18]
$ y
1988
$ iy
1988
At no point is y reassigned in the local scope yet its shape has changed.
Even the shape
of the copy iy was also changed. The verb dewhitejcr seems to strip the
shape from y
in the local scope. This verb has been working fine for years so this is
clearly some
change in J system code.
Local values losing their shape due to system side effects is one of those
all out the water bugs. All the code compressj references is attached
below.
Please contact me if you need help reproducing the error.
NB. compressj code follows
compressj=:3 : 0
NB.*compressj v-- removes all white space from J words and
NB. shortens local names. This process reduces the readability of
NB. code and should only be applied to production code.
NB.
NB. monad: cl =. compressj ct
NB.
NB. compressj jcr 'verbname'
NB.
NB. NB. call in object context
NB. compressj__UT__JODobj jcr_ajod_ 'compressj_base_'
NB. check for presence of white space only removal tag
w=. 1 e. CWSONLY E. ,y
NB. always remove white space
u=. dewhitejcr y
if. w do. u return. end.
NB. do not compress identifiers in code that cannot be
NB. reliably classified by the namecats verb.
if. badrc m=. 1 namecats__MK y do. u return. end.
d=. ~. ;(<2 3 4;1){m=. rv m
NB. check for presence of obfuscation tag
if. o=. 1 e. OBFUSCATE E. ,y do.
NB. local names less J arguments
l=. ;(<1;1){m
l=. l -. JARGS__MK
else.
NB. local names less any single char names
l=. ;(<1;1){m
s=. l #~ 1 = #&> l
l=. l -. s
end.
NB. remove object references
l=. l -. exobrefs l,;(<0;1){m
NB. local names less any declared and for. names
if. 0=#m=. l -. d do. u return. end.
NB. remove any names with embedded locale references
if. 0=#m=. m #~ -. islocref&> m do. u return. end.
if. o do.
NB. form obsfucated name replacements - drop trailing _ in (NAMEALPHA)
bnr=. (<:#NAMEALPHA)&#.@((}:NAMEALPHA)&i.)^:_1
r=. ' ' -.~ ,'/' ,"1 (>m) ,"1 '/' ,"1 OBFUSCPFX ,"1 bnr (#m)?OBFUSCCNT
else.
NB. form replacements from any remaining chars !(*)=. SHORTNAMES
NB. J arguments m n x y u v are not on SHORTNAMES
if. 0=#r=. SHORTNAMES -. ,&.> s do. u return. end.
if. (#r) < #m do.
NB. we have more replacements than available SHORTNAMES
NB. form base (#r) numbers using SHORTNAMES digits
bnr=. (#r)&#.@((;r)&i.)^:_1
r=. r,<"1(#r) }. bnr i. #m
end.
r=. ; '/' ,&.> m ,. (#m) {. r
end.
NB. replace tokens
r changetok u
)
decomm=:3 : 0
NB.*decomm v-- removes comments from j words. The (x) argument
NB. specifies whether all blank lines are removed or retained.
NB.
NB. monad: decomm ctWord
NB.
NB. decomm jcr 'decomm' NB. decomment self
NB.
NB. dyad: pa decomm ctWord
NB.
NB. 1 decomm jcr 'decomm' NB. remove blanks (default)
NB. 0 decomm jcr 'decomm' NB. retain all blank lines
1 decomm y
:
NB. mask of unquoted comment starts
c=. ($y)$'NB.' E. ,y
c=. +./\"1 c > ~:/\"1 y e. ''''
y=. ,y
NB. blank out comments
y=. ' ' (I. ,c)} y
y=. y $~ $c
NB. remove blank lines - default
if. x do. y #~ y +./ . ~: ' ' end.
)
dewhitejcr=:3 : 0
NB.*dewhitejcr v-- removes all redundant blanks from J code.
NB. Result is a character list in linear representation format.
NB.
NB. monad: cl =. dewhitejcr ct
NB.
NB. dewhitejcr jcr 'anyword'
tt=. ;:&.> <"1 (ljust@:decomm) y NB. list of tokenized lines
; (blkaft&.> tt) ,&.> LF NB. insert blanks, LF's and raise
)
NB. extract object references from blcl of names
exobrefs=:a:"_ -.~ [: ~. [: ; [: <;._1&.> ([: +./\&.> (<'__')"_ E.&.> ])
#&.> ]
NB. 1 if name is a locale reference 0 otherwise
islocref=:('_'"_ = {:) +. [: +./ '__'"_ E. ]
NB. left justify table
ljust=:' '&$: :(] |."_1~ i."1&0@(] e. [))
NB. ok return value
rv=:>@(1&{)
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm