[Jprogramming] named noun internals

Henry Rich henryhrich at gmail.com
Mon Apr 4 23:55:37 UTC 2022


Accessing the symbol table is deprecated. Don't do it.  It should never 
have been allowed.

The J symbol table is a contiguous array of structures that connect 
names and values.  When the table fills, a larger one is allocated and 
the symbols are all relocated.  The table may become full any time a new 
symbol is created.

Thus, your very first line

s=. symget <y

is not robust.  symget will return a pointer (as an integer), but the 
assignment to s may relocate the symbol table, which means that your 
pointer may be invalid before you even store it into s.

There is no way around this, and the problem applies to all releases of JE.

If that's not bad enough, a routine you call, or a J task running in a 
thread, may delete any global name and leave you with an invalid pointer.

WHAT YOU NEED TO DO is use 15!:14 if you want the address of the first 
atom, or 15!:12 (new in J9.04) to get the address of the header.  The 
header and data will not be relocated.

Henry Rich

On 3/31/2022 11:35 AM, jph.butler at mailoo.org wrote:
> I am working on a binding for a dll which requires a bit of mema / memr / memw, and this brought me to looking at symget / symset / symdat
>
> With minor tweeking, I updated to 64bits the viewnoun verb from the "Guides/Named Noun Internals" page (running J903):
>
>
>
> NB. 64 bit version
>
> viewnoun=: 3 : 0
>
> s=. symget <y NB. pointer to symbol table entry
>
> sys=. memr s,0 2 4 NB. pointers to name, header
>
> h=. 1{sys NB. header pointer
>
> fheader=. memr h,0 7 4 NB. fixed header
>
> NB. 'offset flag size type refcount len rank'=. fheader
>
> 'offset flag size type refcount len rank'=. fheader
>
>       rank =. 2 NB. hard coded patch !!!
>
> shape=. memr h,56,rank,4 NB. shape
>
> data=. memr (h+offset),0,len,type
>
> sys;fheader;shape;data
>
> )
>
>
>
>    abc=:10+ i. 2 3
>
> viewnoun 'abc'
>
> ┌─────────────────────────────┬─────────────────────┬───┬─────────────────┐
>
> │94112853474752 94112853484736│72 0 1 4 1 6 37355522│2 3│10 11 12 13 14 15│
>
> └─────────────────────────────┴─────────────────────┴───┴─────────────────┘
>
>
> Something has clearly changed in the data organization.
>
> * where has the rank info gone to? why do I get 37355522 instead?
>
> * does "reserved size for data" still exist? does the 1 actually mean anything or is it just a placeholder?
>
>
>
>
>
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm


-- 
This email has been checked for viruses by AVG.
https://www.avg.com



More information about the Programming mailing list