Please send me a simple case to reproduce this.

Henry Rich

On 2/25/2017 6:15 PM, John Baker wrote:
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

----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to