Henry,
The following code reproduces the problem. The (decomm) verb reassigns y
during execution and it lingers.
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.
)
NB. character table representation of j words, call: jcr 'verb'
jcr=:[: ];._1 (10{a.) , [: 5!:5 <
vanishshape=:3 : 0
NB. run dewhitejcr (changes shape of y)
smoutput 'shape of y before';$y
NB. should not change shape of y
decomm y
smoutput 'shape of y after - has changed';$y
)
NB. run to show shape shifting
vanishshape jcr 'decomm'
On Sat, Feb 25, 2017 at 5:47 PM, John Baker <[email protected]> wrote:
> Boy talk about responsive support. I don't think any of us are expecting
> mostly volunteer J developers to leave parties to address bugs.
>
> Cheers
>
> On Sat, Feb 25, 2017 at 5:09 PM, Henry Rich <[email protected]> wrote:
>
>> I got away from the party & can confirm that the error is in inplaced y=.
>> ,y . I still need your testcase so I can verify the fix.
>>
>> hhr
>>
>>
>> On 2/25/2017 6:38 PM, John Baker wrote:
>>
>>> Hi Henry,
>>>
>>> I will put together a simple script that reproduces the problem. I will
>>> send a zip directly to your email to avoid all the line wrapping issues
>>> people suffer when sending j code through forum mail.
>>>
>>> Cheers
>>>
>>> On Sat, Feb 25, 2017 at 4:26 PM, Henry Rich <[email protected]>
>>> wrote:
>>>
>>> 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
>>>>
>>>
>>>
>>>
>>>
>> ----------------------------------------------------------------------
>> For information about J forums see http://www.jsoftware.com/forums.htm
>>
>
>
>
> --
> John D. Baker
> [email protected]
>
--
John D. Baker
[email protected]
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm