Recent Posts

Pages: [1] 2 3 ... 10
1
Bugs & Feature Requests / Re: Small request for "direct string" parameters.
« Last post by Brian Alvarez on December 11, 2018, 05:27:40 AM »
 Great news charles! Looking forward to give it a try!

 This thing is working awesomely!, so, rest assured all your hard work is being put to good use!! :D

Added:
 If possible, make it work also for other string parameters besides literal strings.  ;D

 By the way, notice that, your example crashes on 64 bit mode and works fine in 32 bit mode,
just as i said in my first post. Too bad you cant reproduce it... is there a way i can provide you
info to make it work?
2
Bugs & Feature Requests / Re: Small request for "direct string" parameters.
« Last post by Charles Pegge on December 11, 2018, 05:03:48 AM »
Brian,

I can't reproduce your crash problem, but I will implement bycopy (same usage as in PowerBasic). Should be ready later today.

When passing a string literal byref, the compiler automatically makes a copy so that overwriting the original string constant is made impossible.

Code: [Select]
'11:37 11/12/2018
'check literals passed byref
$filename "c.exe"
uses rtl64
string f(string *s){s+=s+s : return s}
#show print f "ok"
3
Latest Version / Re: Self Compiling
« Last post by Arnold on December 11, 2018, 04:11:22 AM »
Hi John,

I do not see the link to sandbox.allbasic.info above any more. If I try to open it from allbasic.info I get a warning of a privacy error (the web site is not secure) and the page is not loaded. Is something missing?

What source control management tool can be used to fetch the contents of a project? I see there is TotoiseSVN, Mercurial and others. I do not know at the moment how these version control systems work. I also do not know if Charles will decide to apply such a history system at some point of Oxygen's development (which obviously is possible with GitHub too), but perhaps there are some advantages e.g. in view of the many examples which are provided with Oxygen. And perhaps Gitlab could be used for some major projects done with Oxygenbasic. Charles should not be held responsible for such kind of projects - maybe give some advice if necessary and appropriate.

Roland
4
Latest Version / Re: Self Compiling
« Last post by Charles Pegge on December 11, 2018, 04:01:52 AM »
Hi John,

The top-level organisation of o2:

BuildOxygenDLL.o2bas
Code: [Select]
  $dll
  $filename "oxygen.dll"
  uses RTL32
  uses main

main.inc components
Code: [Select]
  $ o2version chr(34)+"0.1.0 2018-12-11T12:00:00"+chr(34)
  '
  'DEFINITIONS GROUP
  '=================
  '
  uses glob 'GLOBAL STRUCTURES, CONSTANTS & VARIABLES
  uses lexa 'LOW LEVEL LEXING
  uses reco 'RECORDS
  uses lang 'CORE KEYWORDS AND EQUATES
  '
  'PARSING GROUP
  '=============
  '
  uses lexi 'LEXING
  uses pars 'PARSING
  '
  'COMPILATION GROUP
  '=================
  '
  uses meta 'META-PROGRAMMING
  uses decl 'DECLARATIVES
  uses enco 'ASM ENCODING FUNCTIONS
  uses expl 'LOWER EXPRESSIONS
  uses expr 'HIGHER EXPRESSIONS
  uses tran 'TOP TRANSLATION LAYER
  '
  'HEADERS ASSEMBLY AND LINKAGE GROUP
  '==================================
  '
  uses hdrs 'HEADERS FOR EXECUTABLE CODE
  uses assm 'ASSEMBLER (TO O2 MACHINE SCRIPT)
  uses link 'O2 MACHINE SCRIPT LINKER
  '

5
Latest Version / Re: Self Compiling
« Last post by John on December 11, 2018, 01:56:15 AM »
Charles,

It would be great to have a high level diagram of how O2 is assembled. Maybe a block diagram or a category / function tree.

Would Doxygen work with o2.

I'm going to play around with Doxygen using Script BASIC C source. It has a treeview option we might be able to use as a reference for O2.
6
Latest Version / OXSC20181210
« Last post by John on December 10, 2018, 09:20:12 PM »
OXSC20181210 Update.

Code: Diff
  1. diff --git a/BDelO2Binaries.bat b/BDelO2Binaries.bat
  2. index ccbb450ad576800e5ef0cb7091ca453ccbf219a8..6524c06a731c3d08336483226dffa3ffe31816f7 100644
  3. --- a/BDelO2Binaries.bat
  4. +++ b/BDelO2Binaries.bat
  5. @@ -1,2 +1,3 @@
  6. +del c.exe
  7.  del co2???.exe
  8.  del oxygen??.dll
  9. diff --git a/OxyLog.txt b/OxyLog.txt
  10. index f8ba585c97acd792fc02b6e3003eb99961aae0a4..a42afefa38cfde68ab722a20b973d5e84b7f725c 100644
  11. --- a/OxyLog.txt
  12. +++ b/OxyLog.txt
  13. @@ -21,6 +21,14 @@ itr 10:17 18/11/2018 Fix multiply unsigned by number (oper w1="mul ")
  14.  itr 16:07 16/11/2018 Rework rtl321 and rtl641 cats. expose char count. (catbufprp badcatl3 joinsi)
  15.  
  16.  
  17. +11:43 10/12/2018 Change expression order (expr.inc hlex hiex)
  18. +10:49 10/12/2018 Support "save" operation for register-based accumulators ("save")
  19. +01:18 10/12/2018 Revokevoke support for primitive down-converting load
  20. +10:57 09/12/2018 Refactor typa1 htyp (typx typh)
  21. +10:31 09/12/2018 Fix macromember name search (pars.bas rmk)
  22. +02:48 08/12/2018 Suppress del / destructor nullify call
  23. +18:19 07/12/2018 Add nullify function to wrap _nullify (tran.inc lang.inc)
  24. +13:45 06/12/2018 Jit mode early copy call vectors (posbin(3) pvd)
  25.  05:29 05/12/2018 Support redim string s(n) clear (lang.inc clear)
  26.  04:44 05/12/2018 Fix redim to include nullify for UDTs (lang.inc)
  27.  04:41 05/12/2018 Fix match and leftmatch (removing noquotes) (meta.inc)
  28. diff --git a/decl.inc b/decl.inc
  29. index 4bdac61d79ad1ef4a1e876a348b0a2216e9ca447..c9d49d28b38774b631ace4ab0556d0f2a29f5b75 100644
  30. --- a/decl.inc
  31. +++ b/decl.inc
  32. @@ -281,7 +281,7 @@ function encodele(string*wm, int*k, string*ty, int n, vtl, vtp, string*ws) as st
  33.      if vtl>1 then m=9 else m=8 'method / procedure
  34.      w5=" 0       "
  35.    else
  36. -    if (n>=htyp)or(indt>0) then m=3 else m=1 'pointer / direct
  37. +    if (n>=typh)or(indt>0) then m=3 else m=1 'pointer / direct
  38.      w5=" 0 "
  39.    endif
  40.    '
  41. @@ -316,8 +316,8 @@ function encodele(string*wm, int*k, string*ty, int n, vtl, vtp, string*ws) as st
  42.    '
  43.    'n = 0x01.. 0xff primitive / 0x11f procedure / 0x200.. higher type
  44.    '
  45. -  if n>=htyp
  46. -    w3=str(n) 'higher types (location+htyp)
  47. +  if n>=typh
  48. +    w3=str(n) 'higher types (location+typh)
  49.    elseif ty
  50.      w3=ty
  51.    else
  52. @@ -526,7 +526,7 @@ sub vars(string*s)
  53.      ' maco 2 offset
  54.      ' maco 3 indirection level of variable
  55.      ' maco 4 type indirection level
  56. -    ' maco 5 type code >=htyp = user defined
  57. +    ' maco 5 type code >=typh = user defined
  58.      '------------------------------
  59.      '
  60.      i=1
  61. @@ -568,7 +568,7 @@ sub vars(string*s)
  62.        '
  63.        w=lent
  64.        '
  65. -      if it>=htyp
  66. +      if it>=typh
  67.          k=it  'CLASS OR UDT
  68.          if ndstr=0 then hasd=findop(it,a,"destructor",dstr)
  69.        endif
  70. @@ -922,7 +922,9 @@ sub vars(string*s)
  71.      if ise(ascn)=0
  72.        mc=0 : goto varss 'FURTHER VAR STATEMENTS
  73.      endif
  74. -    if lclv=0 then aoffs=aoff
  75. +    if lclv=0
  76. +      aoffs=aoff
  77. +    endif
  78.  end sub
  79.  
  80.  
  81. @@ -1509,8 +1511,8 @@ sub types(int unip,vtp,*ttc,*tuc)
  82.          '
  83.          'COMPOUND OR CUSTOM TYPE
  84.          '
  85. -        if a>=htyp
  86. -          m=macio(a-htyp,0)
  87. +        if a>=typh
  88. +          m=macio(a-typh,0)
  89.            '
  90.            'FUNCTION TYPES
  91.            '
  92. @@ -1519,7 +1521,7 @@ sub types(int unip,vtp,*ttc,*tuc)
  93.              bb=pk
  94.              'itr overload matching
  95.              string wt1
  96. -            nextproc(macso(a-htyp,1),1,wt1,0)
  97. +            nextproc(macso(a-typh,1),1,wt1,0)
  98.              if (sig="#@")or(sig="") then sig=","
  99.              'if priv=0 then priv=0x39
  100.              '
  101. @@ -1537,7 +1539,7 @@ sub types(int unip,vtp,*ttc,*tuc)
  102.        typebfna: 'TYPE BEFORE NAME (C STYLE)
  103.        '=========
  104.        '
  105. -      if ((a<>0)and(a<0x100))or(a>=htyp)
  106. +      if ((a<>0)and(a<0x100))or(a>=typh)
  107.          typ=a
  108.          m=isptr(wm,k)
  109.          if ascn<>lbr
  110. @@ -1683,7 +1685,7 @@ sub types(int unip,vtp,*ttc,*tuc)
  111.            if wr="void" then typ=cpuw : lent=0 'IN THIS CONTEXT
  112.            v=lent : n=typ ': midspace(wm,b,k)
  113.            '
  114. -        elseif n<htyp
  115. +        elseif n<typh
  116.            '
  117.            'A PRIMITIVE TYPE OR PART OF MULTIELEMENT
  118.            '----------------------------------------
  119. @@ -1711,7 +1713,7 @@ sub types(int unip,vtp,*ttc,*tuc)
  120.            endif
  121.            v=lent
  122.            '
  123. -        else 'n>=htyp
  124. +        else 'n>=typh
  125.            '
  126.            'CHECK IF POINTER TO ANOTHER STRUCTURE
  127.            '-------------------------------------
  128. @@ -1724,12 +1726,12 @@ sub types(int unip,vtp,*ttc,*tuc)
  129.              endif
  130.            endif
  131.            '
  132. -          if macio(n-htyp,0)=-33
  133. +          if macio(n-typh,0)=-33
  134.              n=4 : v=4 'ENUMERATIONS ASSUME LONG TYPE
  135.            endif
  136.            '
  137.            '
  138. -        endif 'n, htyp
  139. +        endif 'n, typh
  140.          '
  141.          m=1
  142.          do
  143. @@ -1762,7 +1764,7 @@ sub types(int unip,vtp,*ttc,*tuc)
  144.        '
  145.        'POINTER TO ANOTHER STRUCT
  146.        '
  147. -      if sni>=htyp
  148. +      if sni>=typh
  149.          'itr auto single-level indirect in encodE ele()
  150.          v=0
  151.          if ascn=42
  152. @@ -1774,8 +1776,8 @@ sub types(int unip,vtp,*ttc,*tuc)
  153.          v=cpuw
  154.        endif
  155.        '
  156. -      'if v or (sni<htyp)
  157. -      if (v=0)and(sni>=htyp) then goto ncompor
  158. +      'if v or (sni<typh)
  159. +      if (v=0)and(sni>=typh) then goto ncompor
  160.        '
  161.        '
  162.        'AUTO-ADJUST BOUNDARY ALIGNMENT (PADDING)
  163. @@ -1946,7 +1948,7 @@ sub types(int unip,vtp,*ttc,*tuc)
  164.          endif
  165.        endif
  166.        '
  167. -      a=sni-htyp 'STRUCTURE INDEX
  168. +      a=sni-typh 'STRUCTURE INDEX
  169.        '
  170.        if a>0 then e=1 else e=0
  171.        if e=0 then ers="Undefined "+ty : ert=10 : exit sub
  172. @@ -2283,11 +2285,6 @@ sub types(int unip,vtp,*ttc,*tuc)
  173.        '
  174.      endif
  175.      '
  176. -    'INITIAL ASSIGNMENT OF MEMBER VALUES
  177. -    '===================================
  178. -    '
  179. -    'hiex+="def "+macso(b,0)+"_init"+cr+vlist+"end def"+cr
  180. -    'rps=1
  181.      '
  182.  end sub
  183.  
  184. @@ -2476,7 +2473,7 @@ sub makeheaders(string*s,*w4,*w3, int mo)
  185.        '--------------------------
  186.        '
  187.        a=0
  188. -      if idt>=htyp
  189. +      if idt>=typh
  190.          if ascn<>42 then a=1
  191.        'elseif instrword(" static of from has incl ",w1)
  192.        elseif instrword(" of from has incl ",w1) 'members removed
  193. diff --git a/enco.inc b/enco.inc
  194. index e4015f941b096d7fe07e4c168bff0581c345b282..8460fb03f7fc946680cac872d042264857577416 100644
  195. --- a/enco.inc
  196. +++ b/enco.inc
  197. @@ -496,7 +496,7 @@ function oper(int qp,tp, string*wk) as string
  198.    case -1 : exit function
  199.    end select
  200.    '
  201. -  if tp>=htyp
  202. +  if tp>=typh
  203.      'exit function 'IGNORE
  204.      tp=cpuw        'ASSUME VALUE IS IN ACCUM
  205.    endif
  206. @@ -1300,7 +1300,7 @@ function cvta(int typa,typb) as string
  207.    'HIGHER TYPE CHECK
  208.    '=================
  209.    '
  210. -  if (typa>=htyp)or(typb>=htyp)
  211. +  if (typa>=typh)or(typb>=typh)
  212.      if typb<>typa
  213.        'ers="type mismatch " : ert=98
  214.        'ASSUME NO CONVERSION REQUIRED
  215. diff --git a/expl.inc b/expl.inc
  216. index a5ac978585ba929191ad5762ab493bf70397ec58..dd5a6f0be46838c5038bb34adcbe07a7ec395a3e 100644
  217. --- a/expl.inc
  218. +++ b/expl.inc
  219. @@ -375,7 +375,7 @@ sub prepforlocalspace(int pn)
  220.      a=typp
  221.      w3=" returnvar"
  222.      '
  223. -    if a<htyp
  224. +    if a<typh
  225.        if a=&h40 then a=&h68 : wva(1)="double" 'fpu return type using qword slot
  226.        a and=31
  227.        vars(wva(1)+w3)
  228. @@ -462,7 +462,7 @@ sub noprototype(string*wd,*w1)
  229.      endif
  230.    elseif (isstr(typg)<>0)or(wg=qedi)
  231.      typg=cpuw
  232. -  elseif (typg>=htyp)and(bvg=0) 'bvg: null flag
  233. +  elseif (typg>=typh)and(bvg=0) 'bvg: null flag
  234.      'passing direct higher types: rect etc
  235.      if wpfx=""
  236.        wd=leaedi(wg) : w1=qedi : typg=cpuw
  237. @@ -487,7 +487,7 @@ sub newcleanvar(string *wn,*wr,int p)
  238.  =====================================
  239.    wn=newtmpvar(typename(p))
  240.    wr=macso(me-1,1) 'vector
  241. -  if p<htyp
  242. +  if p<typh
  243.      exit sub
  244.    endif
  245.    int n=macio(me-1,1) 'size
  246. @@ -529,7 +529,7 @@ function  buildparamblock(int pb, cc) as string
  247.          mpfx=left(mpfx,m-1)+w3+mid(mpfx,m+5)
  248.        endif
  249.        pas(d)=w2
  250. -      if pat(d)>=htyp
  251. +      if pat(d)>=typh
  252.          pat(d)=cpuw
  253.        endif
  254.      next
  255. @@ -709,7 +709,7 @@ function preparecall(string*wp,*w4,*wm, int cc) as string
  256.    'COMPOSE THE CALL INCLUDING 'THIS' IN THE ECX REGISTER
  257.    '
  258.    if asc(pls)=48
  259. -    pls=","+macso(macio(mp,0)-htyp,0)+"."+wm 'FWD REF REQUIRES NAMED CLASS.PROCEDURE
  260. +    pls=","+macso(macio(mp,0)-typh,0)+"."+wm 'FWD REF REQUIRES NAMED CLASS.PROCEDURE
  261.    endif
  262.    '
  263.    w5=pls+" "+w5+" "+hex(nsi)+" "+hex(nsp)
  264. @@ -1020,7 +1020,7 @@ function compatsig(string*p1,*p2, int pb) as int
  265.      'NULL OR BYVAL V, REQUIRING EXTRA STACK
  266.      'exclude byval double or extended
  267.      if d=95
  268. -      if m>=htyp then goto nxtel
  269. +      if m>=typh then goto nxtel
  270.        'ALLOW FLOAT CONVERSION
  271.        if e>0 then n=cpuw
  272.        if isfloat(n)=0 then n=cpuw
  273. @@ -1042,7 +1042,7 @@ function compatsig(string*p1,*p2, int pb) as int
  274.          if d>48 then a=1 : d-- : e-- : m=cpuw 'VOID* TO int
  275.        elseif m=cpuw
  276.          if d=48 then a=1 : e-- 'ALLOW BYVAL int TYPES TO BE TREATED LIKE VOID*
  277. -      elseif m>=htyp
  278. +      elseif m>=typh
  279.          if d>48 then a=1 : m=cpuw 'VOID* COMPATIBILITY
  280.        endif
  281.        if a then n=cpuw 'TREAT AS int TYPES (HANDLES ETC) itr
  282. @@ -1052,7 +1052,7 @@ function compatsig(string*p1,*p2, int pb) as int
  283.        if b<a
  284.          m=cpuw : n=cpuw 'NO UP CONVERSION CODE REQUIRED
  285.        endif
  286. -    elseif n>=htyp 'up-convert
  287. +    elseif n>=typh 'up-convert
  288.        if uk and 2
  289.          if findop(n,a,"constructor",w1)
  290.            'deferred object creation
  291. @@ -1070,23 +1070,23 @@ function compatsig(string*p1,*p2, int pb) as int
  292.            k=0 : exit function
  293.          endif
  294.        endif
  295. -    elseif m>=htyp
  296. -      'n<htyp 'down-convert
  297. +    elseif m>=typh
  298. +      'n<typh 'down-convert
  299.        if uk and 2
  300. -        if findop(m,a,"load",w1)
  301. -          'deferred object creation
  302. -          paj(pa)=n
  303. -          mpfx+=por(pa)+".load(#obj#)"+cr
  304. -          pas(pa)=operi(1,n,"#obj#")+cr
  305. -          pav(pa)=callcnvi(c,n,e)
  306. -          k=2
  307. -          goto nxtel
  308. -        else
  309. +        'if findop(m,a,"load",w1)
  310. +        '  'deferred object creation
  311. +        '  paj(pa)=n
  312. +        '  mpfx+=por(pa)+".load(#obj#)"+cr
  313. +        '  pas(pa)=operi(1,n,"#obj#")+cr
  314. +        '  pav(pa)=callcnvi(c,n,e)
  315. +        '  k=2
  316. +        '  goto nxtel
  317. +        'else
  318.            if (d<=48)or(e<=48)
  319.              k=0 : exit function
  320.            endif
  321.            'allow vectors to pass as floats etc
  322. -        endif
  323. +        'endif
  324.        endif
  325.      endif
  326.      '
  327. @@ -1445,7 +1445,7 @@ function compatsig(string*p1,*p2, int pb) as int
  328.      a=asc(wg)
  329.      b=0
  330.      '
  331. -    if typg>=htyp
  332. +    if typg>=typh
  333.        goto nxtel 'ALLOW HIGHER TYPE TO PASS TO PRIMITIVE PARAM
  334.      elseif opg>1
  335.        b=1
  336. diff --git a/expr.inc b/expr.inc
  337. index 01ac483247cd6c0221cc1f706646a4ae6d8757e2..a9f98e7c4b4c20584616772bed46324c8910dacb 100644
  338. --- a/expr.inc
  339. +++ b/expr.inc
  340. @@ -26,18 +26,18 @@
  341.  
  342.    'CONVERT NUMERIC ACCUM TO STRING ACCUM
  343.    '
  344. -  function numtostr(int typa1,typa) as string
  345. -  '==========================================
  346. +  function numtostr(int typx,typa) as string
  347. +  '=========================================
  348.    int c
  349.    string wt
  350.    if typa<0x80 then 'CONVERT NUM ACCUM TO STRING APPEND
  351.      if jn then c=43 else c=1
  352.      wt=cvtai(typa,0xc1) 'VAL TO STRING THEN APPEND
  353. -    if (c=43)or(isstr(typa1)=0)or(parx>0)
  354. +    if (c=43)or(isstr(typx)=0)or(parx>0)
  355.      '(
  356.      ' (
  357.      '  cmp c,43 : jz exit
  358. -    '  isstr(typa1) : cmp eax,0 : jz exit
  359. +    '  isstr(typx) : cmp eax,0 : jz exit
  360.      '  cmp parx,0 : jg exit
  361.      '  exit 2
  362.      ' )
  363. @@ -72,15 +72,15 @@
  364.    '  #################
  365.    '
  366.    '
  367. -  function express(string*s, int *i,*typa1) as string
  368. -  ===================================================
  369. +  function express(string*s, int *i,*typx) as string
  370. +  ==================================================
  371.    '
  372.    int    a,b,c,d,e,f,m,r,n,v,typa,typc,typi,opo,cp,tp,clbr,cbj,qp,pid,ctop
  373.    int    nsl,ofpu,noto,fxsq,ocp,omp,ojn,uex,usx,ixnd,ixnt,pargl
  374.    int    xmode,xoffs,opcn,lazn,tya1
  375.    string w1,w2,w3,w4,w5,w6,wr,wrp,wt,wp,laz,lazt
  376.    string ixns,wpfxa,wpfxi,wra,wri,memba,xcalc
  377. -  string opsh,cpsh,wacc,waco,waccp,wacop,wrsp
  378. +  string opsh,cpsh,wacc,waco,waccp,wacop,wrsp,hlex
  379.  
  380.    static int    po[8]
  381.    static double dw=0x7fffffff
  382. @@ -149,7 +149,7 @@
  383.      "mov rsp,"+wrsp+cr
  384.    else
  385.      'MACRO OP
  386. -    hiex+=w2+"("+owa+cm+wacc+")"+cr
  387. +    hlex+=w2+"("+owa+cm+wacc+")"+cr
  388.      rps=1
  389.    endif
  390.    skiplspace(s,i)
  391. @@ -179,6 +179,18 @@
  392.      ert=433 : ers="object requires operator: "+opsh
  393.    endif
  394.    ret
  395. +  '
  396. +  'saveregacc: 'subroutine
  397. +  =======================
  398. +  '
  399. +  'if findop(typ,b,"save",w2)
  400. +  '  if b
  401. +  '    'macro only
  402. +  '    hlex+=w2+"("+owa+cm+wacc+")"+cr
  403. +  '    rps=1
  404. +  '  endif
  405. +  'endif
  406. +  'ret
  407.  
  408.  
  409.    ======
  410. @@ -186,16 +198,16 @@
  411.    ======
  412.  
  413.    accg=""
  414. -  tya1=typa1
  415. +  tya1=typx
  416.    if nst=0
  417.      '
  418.      if op=-1
  419.        w2=mid(s,i,1)
  420.        i++
  421. -    elseif typa1
  422. -      expandexpr(s,i,typa1) 'EXPAND IIF EXPRESIONS: AA=(A>B ? C : D )
  423. +    elseif typx
  424. +      expandexpr(s,i,typx) 'EXPAND IIF EXPRESIONS: AA=(A>B ? C : D )
  425.        if rps=2
  426. -        if typa1>=htyp
  427. +        if typx>=typh
  428.            owa=aword(s,i) : goto exitexpr
  429.          endif
  430.        endif
  431. @@ -229,11 +241,11 @@
  432.    elseif fpum<0
  433.      typc=cpuw ' CPU PREFERRED
  434.    else
  435. -    typc=typa1
  436. +    typc=typx
  437.    endif
  438.    '
  439.    if asgm
  440. -    if typc>=htyp then typc=cpuw 'FOR MULTI-ASSIGNMENTS
  441. +    if typc>=typh then typc=cpuw 'FOR MULTI-ASSIGNMENTS
  442.    endif
  443.    '
  444.    '
  445. @@ -259,9 +271,9 @@
  446.    '
  447.    select op
  448.    case -1
  449. -    typc=typa1 : op=0 : goto nestpush 'ARRAY INDEX EVALUATION
  450. +    typc=typx : op=0 : goto nestpush 'ARRAY INDEX EVALUATION
  451.    case -2
  452. -    typc=typa1 : goto nextops  'OPERATOR OR TERMINATOR EXPECTED
  453. +    typc=typx : goto nextops  'OPERATOR OR TERMINATOR EXPECTED
  454.    case 47 '/
  455.      if typc<0x40
  456.        wt+=cvtai(typc,0x68) : typc=0x68
  457. @@ -273,7 +285,7 @@
  458.    '
  459.    if (mc=-3)or(mc=-15)or(mc=-8)
  460.      if op<=1
  461. -      if typa1=0 then typa1=typ
  462. +      if typx=0 then typx=typ
  463.        typc=typ
  464.      endif
  465.      uex or=1024
  466. @@ -292,7 +304,7 @@
  467.        if a
  468.          rps=4
  469.          wr=NewTmpVar(wr)
  470. -        hiex+=wr+"="+captsx(s,i)+cr
  471. +        hlex+=wr+"="+captsx(s,i)+cr
  472.          inserts(s,wr,i)
  473.          wr=pword(s,i)
  474.        endif
  475. @@ -302,7 +314,7 @@
  476.    if ert then goto endexpr
  477.    '
  478.    if cpoint
  479. -    if typ>=htyp then typ=cpuw
  480. +    if typ>=typh then typ=cpuw
  481.    endif
  482.    '
  483.    'CAPTURE FOR ARRAY TERMS
  484. @@ -326,7 +338,7 @@
  485.    endif
  486.    '
  487.    'HIGHER TYPES
  488. -  if typ>=htyp
  489. +  if typ>=typh
  490.      '
  491.      if asgm
  492.        typc=typ 'CAST ACCUM
  493. @@ -349,7 +361,7 @@
  494.    '
  495.    '
  496.    'HIGHER ACCUM
  497. -  if typc>=htyp
  498. +  if typc>=typh
  499.      'NESTED EXPRESSION
  500.      if ascw=lbr
  501.        a=i
  502. @@ -357,7 +369,9 @@
  503.        i=a
  504.        opo=op
  505.        op=0
  506. +      nst++
  507.        w1=express(s,i,0) 'RECURSE
  508. +      nst--
  509.        op=opo
  510.        'accum operand wg
  511.        if ascn=rbr then i++
  512. @@ -375,9 +389,9 @@
  513.        newcleanvar(owa,wr,m) 'new owa and wr
  514.        if findop(m,a,"constructor",w2)
  515.          if a
  516. -          hiex+=w2+"("+owa+cm+w4")"+cr
  517. +          hlex+=w2+"("+owa+cm+w4")"+cr
  518.          else
  519. -          hiex+=owa+".constructor("+w4+")"+cr
  520. +          hlex+=owa+".constructor("+w4+")"+cr
  521.          endif
  522.        endif
  523.        rps=1
  524. @@ -388,26 +402,26 @@
  525.      '
  526.    endif
  527.    '
  528. -  if typ>=htyp
  529. +  if typ>=typh
  530.      '
  531.      'PRIMITIVE ACCUM
  532. -    if (typa1>0)and(typa1<htyp)
  533. +    if (typx>0)and(typx<typh)
  534.        '
  535.        'POSSIBLE METHOD RETURNING PRIMITIVE?
  536. -      w3=typename(typa1)
  537. -      if findop(typ,b,"primitive",w1) 'w1 dummy
  538. -        if b 'MACRO
  539. -          w2=newtmpvar(w3)
  540. -          hiex+=macso(typ-htyp,0)+"_op.prim("+
  541. -          owa+cm+w2+")"
  542. -          w2+=" "
  543. -          rps=1
  544. -        else 'METHOD
  545. -          w2=owa+".prim()"
  546. -        endif
  547. -        inserts(s,w2,i)
  548. -        goto oploop 'reparse
  549. -      endif
  550. +      'w3=typename(typx)
  551. +      'if findop(typ,b,"primitive",w1) 'w1 dummy
  552. +      '  if b 'MACRO
  553. +      '    w2=newtmpvar(w3)
  554. +      '    hlex+=macso(typ-typh,0)+"_op.prim("+
  555. +      '    owa+cm+w2+")"
  556. +      '    w2+=" "
  557. +      '    rps=1
  558. +      '  else 'METHOD
  559. +      '    w2=owa+".prim()"
  560. +      '  endif
  561. +      '  inserts(s,w2,i)
  562. +      '  goto oploop 'reparse
  563. +      'endif
  564.        ert=437 : ers=w3+" needs method: prim()"
  565.      end if
  566.      '
  567. @@ -452,7 +466,7 @@
  568.      if wr="null"
  569.        bvg=1 'always accept as param
  570.        wr="0"
  571. -      typc=typa1
  572. +      typc=typx
  573.        if cnd=0
  574.          wt+=operi(1,cpuw,"0")
  575.          goto endexpr
  576. @@ -481,7 +495,7 @@
  577.          if ascw=43 then a=12 else a=13
  578.          i++ : wr=pword(s,i) '++A --A
  579.          if cpoint
  580. -          if typ>=htyp then typ=cpuw
  581. +          if typ>=typh then typ=cpuw
  582.          endif
  583.          wpfx+=operi(a,typ,wr) 'USES LENT TO STEP
  584.          if ert then goto exitexpr
  585. @@ -539,9 +553,9 @@
  586.      goto cvtop 'regs
  587.    case -15 'PRIMITIVE TYPE
  588.      'EXPLICITLY CHANGE ACCUM TYPE 'a=double b + 7
  589. -    if typa1=0
  590. +    if typx=0
  591.        if op<2
  592. -        typ=identype(wr) : typa1=typ : typc=typ 'force expression type
  593. +        typ=identype(wr) : typx=typ : typc=typ 'force expression type
  594.        endif
  595.      endif
  596.      goto oploop
  597. @@ -618,8 +632,8 @@
  598.    '
  599.    if typ=0
  600.      'ADOPT ASSIGNMENT TYPE
  601. -    if (nst<1)and(typa1<>0)
  602. -      typ=typa1
  603. +    if (nst<1)and(typx<>0)
  604. +      typ=typx
  605.      else
  606.        typ=cpuw
  607.      endif
  608. @@ -672,7 +686,7 @@
  609.      bvg=b
  610.      nst--
  611.      if fpum>0
  612. -      if (op<2)and(typa1=0)and(typ<0x40)and(isxn()<>0)
  613. +      if (op<2)and(typx=0)and(typ<0x40)and(isxn()<>0)
  614.          fpum=0 : typc=cpuw
  615.        endif
  616.      endif
  617. @@ -692,7 +706,7 @@
  618.        goto doneprocs 'NOTIONAL RETURN TYPE
  619.      endif
  620.      '
  621. -    if (typ>=htyp)and(indt=0)
  622. +    if (typ>=typh)and(indt=0)
  623.        wr=wg
  624.        wt+=wp
  625.        gosub operationsh
  626. @@ -756,7 +770,7 @@
  627.        '===============================
  628.        '
  629.        a=typ and 15
  630. -      b=typa1 and 15
  631. +      b=typx and 15
  632.        c=isxn()
  633.        d=0
  634.        typ=upgradelen(0xc1,a)
  635. @@ -768,12 +782,12 @@
  636.        '
  637.        if (c<>0)and(jn=0)and(op<2)
  638.          '
  639. -        tya1=typa1
  640. +        tya1=typx
  641.          if (isdstr(tya1)<>0)and(a=b)
  642.            '
  643.            d=1 'ASSIGN TO VARIABLE
  644.            '
  645. -        elseif (typa1=0)and(parx>0)
  646. +        elseif (typx=0)and(parx>0)
  647.            '
  648.            d=1
  649.            w2=logas() 'TO FUNCTION PARAM (ALSO LOG FOR DELETION)
  650. @@ -824,7 +838,7 @@
  651.      'OTHER PRIMITIVES
  652.      '================
  653.      '
  654. -    if typc<htyp
  655. +    if typc<typh
  656.        '
  657.        a=typa
  658.        '
  659. @@ -904,7 +918,7 @@
  660.    if wr="o2"
  661.      w1=""
  662.      wt+=wr+" "+captureblock(s,i,w1)+cr
  663. -    typc=typa1
  664. +    typc=typx
  665.      goto xassigns
  666.    endif
  667.    '
  668. @@ -990,7 +1004,7 @@
  669.      '
  670.      c=0
  671.      n=1
  672. -    if typc<htyp
  673. +    if typc<typh
  674.        if (fpum<=0)or(typc<0x40)
  675.          w1=tmpvar() : w1="" : a=me-1
  676.          if op>1
  677. @@ -1176,7 +1190,7 @@
  678.          wt+=operi(cp,tp,w4)
  679.          usx=0
  680.          '
  681. -      elseif typc<htyp 'NON STRING PRIMITIVES
  682. +      elseif typc<typh 'NON STRING PRIMITIVES
  683.          '
  684.          int ta=asc(wrp)
  685.          if (op<2)and(tp<0x40)and(isn(ta)<>0)
  686. @@ -1193,7 +1207,7 @@
  687.          '
  688.        endif
  689.        '
  690. -      if typc<htyp
  691. +      if typc<typh
  692.          'PRIMITIVES
  693.        endif
  694.        typc=cpuw 'int type for logical result
  695. @@ -1374,9 +1388,9 @@
  696.      '
  697.      if c>0
  698.        '
  699. -      if typa1>=htyp 'HIGHER TYPES
  700. +      if typx>=typh 'HIGHER TYPES
  701.          if tye
  702. -          typa1=tye 'CAST AS ELEMENT TYPE
  703. +          typx=tye 'CAST AS ELEMENT TYPE
  704.          endif
  705.        endif
  706.        '
  707. @@ -1416,7 +1430,7 @@
  708.        '
  709.        if isstr(typc) 'string accum
  710.          wt+=cvtai(typa,typc)
  711. -        if (op>1)or(typa1=0)
  712. +        if (op>1)or(typx=0)
  713.            wt+=logas() 'LOG AS TEMP STRING
  714.          endif
  715.          wt+=operi(op,typc,qeax)
  716. @@ -1512,12 +1526,8 @@
  717.        '
  718.        'TO SUPPORT NESTED EXPRESSIONS
  719.        '
  720. -      epfx+=wt+w1+laz  'STORE NEST RESULT IN TEMP VAR (IN ADVANCE)
  721. -      if hix=0
  722. -        epfx+=lazt+operi(2,b,w3)
  723. -      else
  724. -        b=macio(nstu.g,5)
  725. -      endif
  726. +      epfx+=wt+w1+laz+  'STORE NEST RESULT IN TEMP VAR (IN ADVANCE)
  727. +      lazt+operi(2,b,w3)
  728.        wt=wtn(nst)+w2+lazt+operi(op,b,w3) 'OPERATE ON TEMP VAR
  729.        wtn(nst)=""
  730.        typc=b
  731. @@ -1536,7 +1546,7 @@
  732.            endif
  733.            w3=macso(-nstu.g,1)
  734.            epfx+=wt+laz
  735. -          if typa1<htyp
  736. +          if typx<typh
  737.              epfx+=lazt+operi(2,b,w3)
  738.              wt=lazt+operi(1,b,w3)
  739.            else
  740. @@ -1552,7 +1562,6 @@
  741.      ocp=0
  742.      if op<=1 then typc=typa
  743.      nstu.g=0
  744. -    hix=0
  745.      '
  746.      '
  747.      '=======
  748. @@ -1809,22 +1818,22 @@
  749.      op or=uex 'uex procedures flag, prevents direct variable assign
  750.      '
  751.      if nst=0
  752. -      if typa1<htyp 'ASSIGNIN TO PRIMITIVE TYPES
  753. -        typ=typa1
  754. -        a=typa1 and 15
  755. -        if typa1>0xa0 then a=cpuw
  756. +      if typx<typh 'ASSIGNIN TO PRIMITIVE TYPES
  757. +        typ=typx
  758. +        a=typx and 15
  759. +        if typx>0xa0 then a=cpuw
  760.          asgi=a 'MAIN STRIDE
  761.          '
  762. -      elseif typa1=typc
  763. +      elseif typx=typc
  764.          '
  765. -        asgi=macio(typa1-htyp,1) 'MAIN STRIDE
  766. +        asgi=macio(typx-typh,1) 'MAIN STRIDE
  767.          asgo=asgj
  768.          '
  769.        else 'ASSIGNING TO HIGHER TYPES
  770.          '
  771.          'TRAVERSE ELEMENTS OF TYPE OR CLASS
  772.          b=0 'LOOP ITERATION FLAG
  773. -        asgi=macio(typa1-htyp,1) 'MAIN STRIDE
  774. +        asgi=macio(typx-typh,1) 'MAIN STRIDE
  775.          '
  776.          'nextmember
  777.          do
  778. @@ -1840,7 +1849,7 @@
  779.              amc--                'COUNT OFF ARRAY ELEMENTS
  780.              amo+=ami              'STRIDE ARRAY
  781.              exit do               'READY FOR DATA TRANSFER
  782. -          elseif typc>=htyp
  783. +          elseif typc>=typh
  784.              htf=1
  785.              do
  786.                nextmemb(asgs,asgk,htf)    'NEXT SUBMEMBER HEADER
  787. @@ -1848,7 +1857,7 @@
  788.                if typ=typc then exit do 'MATCHING TYPE
  789.              loop
  790.              amo=0
  791. -          else 'typc<htyp
  792. +          else 'typc<typh
  793.              htf=0
  794.              nextmemb(asgs,asgk,htf)
  795.              amo=0                       'CLEAR ANY PRIOR MEMBER ARRAY OFFSET
  796. @@ -1871,7 +1880,7 @@
  797.            endif
  798.            '
  799.            if b 'ALREADY TRIED TO LOCATE ONCE
  800. -            ers="Element not located "+macso(typa1-htyp,0)
  801. +            ers="Element not located "+macso(typx-typh,0)
  802.              ert=202
  803.              goto endexpr
  804.            endif
  805. @@ -1887,15 +1896,15 @@
  806.        '
  807.        'HIGHER (COMPOUND) MEMBERS ASSIGN
  808.        '
  809. -      if typc>=htyp
  810. -        if typa1<htyp
  811. +      if typc>=typh
  812. +        if typx<typh
  813.            asgo=asgj 'ARRAY OFFSET WHEN ASSIGNING TO PRIMITIVE ARRAY
  814.          endif
  815.          'COPY HIGHER MEMBER
  816.          rps=32
  817. -        a=macio(typc-htyp,1)
  818. -        hiex+="copy @"+osg+"+"+str(asgo)+cm+"@"+owa+cm+str(a)+cr 'EXPRESSION TO BE REPROCESSED
  819. -        if typa1<htyp
  820. +        a=macio(typc-typh,1)
  821. +        hlex+="copy @"+osg+"+"+str(asgo)+cm+"@"+owa+cm+str(a)+cr 'EXPRESSION TO BE REPROCESSED
  822. +        if typx<typh
  823.            asgi=a 'STRIDE USING ARRAY OFFSET ASGJ
  824.          endif
  825.          goto nextmulti 'FWD
  826. @@ -1953,7 +1962,7 @@
  827.        nextmulti:
  828.        '=========
  829.        '
  830. -      if (typa1<htyp)or(typa1=typc)
  831. +      if (typx<typh)or(typx=typc)
  832.          asgj+=asgi
  833.          asgo=asgj 'STRIDE FOR NEXT ELEMENT (BUT HIGHER TYPES RECALCULATE ASGO)
  834.        endif
  835. @@ -1966,7 +1975,7 @@
  836.          nextinstruct(s,i)
  837.          if ascn=asgb
  838.            i++ : asgm--
  839. -          if (asgm=1)and(typa1>=htyp)and(typa1<>typc)
  840. +          if (asgm=1)and(typx>=typh)and(typx<>typc)
  841.              asgj+=asgi : asgk=0 'NEXT ELEMENT IN MAIN ARRAY
  842.              asgo=asgj 'FOR FUTURE PRIMITIVE ASSIGNMENTS
  843.            endif
  844. @@ -2253,7 +2262,7 @@
  845.    '
  846.    'HIGHER TYPE COMPARE
  847.    '
  848. -  if typc>=htyp
  849. +  if typc>=typh
  850.      waccp=wacc
  851.      wacop=waco
  852.      op=0
  853. @@ -2466,19 +2475,19 @@
  854.    if jn
  855.      if funi then lcl=1 : lcls=1
  856.      if typc<0x80
  857. -      wt+=numtostr(typa1,typc)
  858. -      typc=typa1
  859. +      wt+=numtostr(typx,typc)
  860. +      typc=typx
  861.      endif
  862.      '
  863.      'CONCATENATE NOW (OTHERWISE CONCAT ON ASSIGN)
  864.      '
  865. -    tya1=typa1
  866. +    tya1=typx
  867.      if iszstra(tya1)=0 'exclude zstring variable assigns
  868. -      if typa1 then typc=typa1
  869. +      if typx then typc=typx
  870.        if typc<0x80 then typc=1 'STRING TO VAL CONVERSION LATER
  871.        typc=upgradelen(0xc1,typc)
  872.        wt+=operi(96,typc,qeax) 'CONCATENATE
  873. -      if (parx>0)or(typa1<0x80) then wt+=logas() 'mark as temp for deletion
  874. +      if (parx>0)or(typx<0x80) then wt+=logas() 'mark as temp for deletion
  875.      endif
  876.    endif
  877.    '
  878. @@ -2488,7 +2497,7 @@
  879.    if cp
  880.      '
  881.      'HIGHER TYPE COMPARE
  882. -    if typc>=htyp
  883. +    if typc>=typh
  884.        if findop(typc,b,cpsh,w2)
  885.          wr=wacop
  886.          owa=waccp
  887. @@ -2550,9 +2559,9 @@
  888.    '
  889.    'PREPARE FOR ASSIGNMENT
  890.    '
  891. -  if (typa1<>0)and(cnd=0)
  892. +  if (typx<>0)and(cnd=0)
  893.      if parx then typa=typc 'ENSURE ANY 'convert' STICKS
  894. -    wt+=cvtai(typc,typa1) : typc=typa1 'CONVERT TO ASSIGNMENT TYPE
  895. +    wt+=cvtai(typc,typx) : typc=typx 'CONVERT TO ASSIGNMENT TYPE
  896.    endif
  897.    '
  898.    '
  899. @@ -2572,9 +2581,18 @@
  900.      removemarked(epfx,chr(3),1-a) 'LAZY JUMPS
  901.    endif
  902.    '
  903. +  if hlex
  904. +    if nst
  905. +      if findop(typc,b,"save",w2)
  906. +        hlex+=w2+"("+owa+cm+wacc+")"+cr
  907. +      end if
  908. +    endif
  909. +    hiex+=hlex
  910. +  endif
  911.    '
  912.    'RETURNING HIGHER ACCUM ADDRESS
  913.    if uex>=4096
  914. +    'gosub saveregacc
  915.      accg=wacc
  916.      wg=waco
  917.    else
  918. @@ -2809,7 +2827,7 @@ function subsas(string*s, int*i, string*ur,*v, int igb) as int
  919.    if vf=8
  920.      m=mp : oo=1
  921.    else 'vf>8
  922. -   m=macio(mp,0)-htyp : oo=-1
  923. +   m=macio(mp,0)-typh : oo=-1
  924.    endif
  925.    '
  926.    dvl=macso(m,1)
  927. @@ -2902,7 +2920,7 @@ function subsas(string*s, int*i, string*ur,*v, int igb) as int
  928.    rgst=regst
  929.    '
  930.    ct=macio(mp,0)
  931. -  if ct>=htyp
  932. +  if ct>=typh
  933.      if varf=8 then ct=-5 'FUNCTION TABLES
  934.    endif
  935.    lvaf=vaf : vaf=vp      'methods with parameters containing methods
  936. @@ -3145,7 +3163,7 @@ function subsas(string*s, int*i, string*ur,*v, int igb) as int
  937.            sti=cpuw
  938.          endif
  939.        else 'cpuw=4
  940. -        b=typg : if b>=htyp then b=cpuw
  941. +        b=typg : if b>=typh then b=cpuw
  942.          if isfpu(b) then w1="" else w1=qeax
  943.          w1=operi(4,b,w1) 'DEFAULT
  944.          sti=cpuw
  945. @@ -3169,7 +3187,7 @@ function subsas(string*s, int*i, string*ur,*v, int igb) as int
  946.      '
  947.      if (lid>0)and(opg<2)
  948.        sog="sys"
  949. -    elseif typg<htyp
  950. +    elseif typg<typh
  951.        a=typg and 0x7fffffe0
  952.        if a=0xc0
  953.          a=typg+32
  954. @@ -3182,7 +3200,7 @@ function subsas(string*s, int*i, string*ur,*v, int igb) as int
  955.      '
  956.      a=opg and 0x3ff
  957.      if a<2
  958. -      if (typg>=htyp)or(len(wpfx)<>0)
  959. +      if (typg>=typh)or(len(wpfx)<>0)
  960.          if c<>95
  961.            int g=asc(wg)
  962.            if isq(g)
  963. @@ -3356,7 +3374,7 @@ function subsas(string*s, int*i, string*ur,*v, int igb) as int
  964.        '
  965.        stkb=0 'FOR COMPATSIG CDECL
  966.        '
  967. -      if (typ>=htyp)and(indt=0)
  968. +      if (typ>=typh)and(indt=0)
  969.          coret=1 'CALLER ORIGINATED RETURN
  970.        endif
  971.        '
  972. @@ -3495,7 +3513,7 @@ function subsas(string*s, int*i, string*ur,*v, int igb) as int
  973.    a=instr(wp,".")+1
  974.    w3=w5+preparecall(wp,w4,mid(wp,a)+splitsig(sig),cc)
  975.    '
  976. -  if typ>=htyp
  977. +  if typ>=typh
  978.      if (indt=0)and(nobj=0)
  979.        'ALLOCATE RETURN VAR AND CLEAR IT
  980.        m=typ
  981. diff --git a/glob.inc b/glob.inc
  982. index 581969077cf9b443a4767584719e1279ed2dac6a..5f68af1c2a635aa53029930439acdfd6b9bab695 100644
  983. --- a/glob.inc
  984. +++ b/glob.inc
  985. @@ -72,7 +72,7 @@
  986.    'GENERAL CONSTANTS
  987.    '=================
  988.  
  989. -  int    htyp=512       'HIGHER TYPES BASE
  990. +  int    typh=512       'HIGHER TYPES BASE
  991.    int    hasa=124       ' | HIGH ASSEMBLER INSTRUCTION CODE
  992.    string she=chr(248)   '#show DELIMITER
  993.    int    iqi=250        'INTERNAL QUOTE CODE
  994. @@ -170,6 +170,7 @@
  995.    ========================================================
  996.    '
  997.    sys     pvm[255]  'POINTERS TO VIRTUALALLOC MEMORY
  998. +  sys     pvd[255]  'POINTERS TO VIRTUALALLOC MEMORY BSSDATA
  999.    sys     lbuf[255] 'LENGTH OF SELECTED PVM
  1000.    string  dbuf      'BUFFER FOR COMPILE CODE
  1001.    int     ibuf      'INDEX FOR SELECTED BUFFER
  1002. @@ -573,7 +574,7 @@
  1003.    int nsto,stkb,parx,divi,met,newline,pakd,arf,ccx,casg
  1004.    int nobr,ebdi,nmac,nstod,cboolf,convs,plistend,clistend,dlistend,plp,plq
  1005.    int compact,tranpass,preproc,asxp,elct,elsz,ctal,cpoint
  1006. -  int nsi,nsp,nsq,rps,tyd,hix,independent,cnsl,eord,noco
  1007. +  int nsi,nsp,nsq,rps,tyd,independent,cnsl,eord,noco
  1008.    int omo,ert,epif,epli,epgi,nobj,ndstr,coret
  1009.  
  1010.  
  1011. diff --git a/hdrs.inc b/hdrs.inc
  1012. index baf69766f292fedae0dc1200fa1b74bf53af3ddc..2885126dd9bc04e9a936dfc39ae5a7e96a21e808 100644
  1013. --- a/hdrs.inc
  1014. +++ b/hdrs.inc
  1015. @@ -864,14 +864,9 @@ endif
  1016.  '
  1017.  'PROGRAM ENTRY FOR PRIMARY COMPILED CODE:
  1018.  'CREATE BSS STATIC SPACE FOR GLOBALS ETC
  1019. -'COPY RUNTIME LIBRARY INTO BSS
  1020.  '
  1021.  aoff+=15 : aoff and= 0xfffffff0  'ROUND UP TO NEAREST 16
  1022.  '
  1023. -'JIT MODE:
  1024. -'copy 0-512 and 2048 to 4095 of the RTFT
  1025. -'the .bss section is assumed to be pre-initialised with nulls
  1026. -'
  1027.  ddat="._data_"+cr+left(dats,dati)+cr+"00 01 `end_of_data` 01 /+1000"+cr
  1028.  udat=".bssdata"+cr+"$"+hex(sizebss())+cr
  1029.  string cpuws=str(cpuw)
  1030. @@ -905,40 +900,12 @@ sub rbx,here
  1031.  add rbx,bssdata
  1032.  ret
  1033.  '
  1034. -'COPY ALL CALL-VECTORS INTO PROGS BBSSDATA SPACE
  1035. -'===============================================
  1036. -.CopyLib
  1037. -mov rsi,rbx 'PARENT BSSDATA
  1038. -call _mem
  1039. -mov rdi,rbx
  1040. -mov ecx,192 'COPY FROM 0 TO 767
  1041. -(
  1042. - mov eax,[rsi]
  1043. - mov [rdi],eax
  1044. - add rsi,4
  1045. - add rdi,4
  1046. - dec ecx
  1047. - jg repeat
  1048. -)
  1049. -add rsi,1280
  1050. -add rdi,1280
  1051. -mov ecx,150 'COPY FROM 2048 TO 2647
  1052. -(
  1053. - mov eax,[rsi]
  1054. - mov [rdi],eax
  1055. - add rsi,4
  1056. - add rdi,4
  1057. - dec ecx
  1058. - jg repeat
  1059. -)
  1060. -ret
  1061. -'
  1062.  '
  1063.  'MAIN ENTRY POINT
  1064.  '================
  1065.  ._initjit
  1066.  push rbp : mov rbp,rsp
  1067. -call CopyLib
  1068. +'call CopyLib
  1069.  'SPACE FOR GLOBAL BUFFER POINTERS
  1070.  push 0
  1071.  push 0
  1072. @@ -983,42 +950,12 @@ jmp fwd _initjit
  1073.    ._mem
  1074.    lea rip rbx,bssdata
  1075.    ret
  1076. -
  1077. -'
  1078. -'COPY ALL CALL-VECTORS INTO PROGS BBSSDATA SPACE
  1079. -'===============================================
  1080. -.CopyLib
  1081. -mov rsi,rbx 'PARENT BSSDATA
  1082. -call _mem
  1083. -mov rdi,rbx
  1084. -mov ecx,192 'COPY FROM 0 TO 767
  1085. -(
  1086. - mov eax,[rsi]
  1087. - mov [rdi],eax
  1088. - add rsi,4
  1089. - add rdi,4
  1090. - dec ecx
  1091. - jg repeat
  1092. -)
  1093. -add rsi,1280
  1094. -add rdi,1280
  1095. -mov ecx,150 'COPY FROM 2048 TO 2647
  1096. -(
  1097. - mov eax,[rsi]
  1098. - mov [rdi],eax
  1099. - add rsi,4
  1100. - add rdi,4
  1101. - dec ecx
  1102. - jg repeat
  1103. -)
  1104. -ret
  1105.  '
  1106.  '
  1107.  'MAIN ENTRY POINT
  1108.  '================
  1109.  ._initjit
  1110.  push rbp : mov rbp,rsp
  1111. -call CopyLib
  1112.  'SPACE FOR GLOBAL BUFFER POINTERS
  1113.  push 0
  1114.  push 0
  1115. @@ -1059,7 +996,9 @@ function="
  1116.  "+asms+"
  1117.  o2 (
  1118.  /+1000
  1119. -"+ddat+udat+"
  1120. +"+ddat+"
  1121. +o2 p3
  1122. +"+udat+"
  1123.  )
  1124.  "
  1125.  exit function 'JIT MODE
  1126. diff --git a/lang.inc b/lang.inc
  1127. index ff17cd32b6a38b57bde2e710650bdd350d6b77f4..86ccbe4a621b96756c563fb5660b91aa5339baae 100644
  1128. --- a/lang.inc
  1129. +++ b/lang.inc
  1130. @@ -229,10 +229,6 @@ redim 18
  1131.            #ifdef %1.destructor
  1132.              %2[_i_].destructor
  1133.            #endif
  1134. -          sys _p_=@%2[_i_]
  1135. -          mov rcx,_p_
  1136. -          mov edx,sizeof %2
  1137. -          nullify
  1138.          #elseif typecodeof(%2)>=0xa0
  1139.            %2[_i_]=""
  1140.          #else
  1141. @@ -328,7 +324,6 @@ copyn 4 72
  1142.  copy 4 72
  1143.  mbox 4 2048 'mboxa
  1144.  comparestr 4 2192 ' comps ' COMPARING BSTRS
  1145. -nullify 4 _nullify
  1146.  
  1147.  '=============================
  1148.  '>>COMMON RESERVED WORDS
  1149. diff --git a/link.inc b/link.inc
  1150. index c25eca4199988bce8e3d9fd087f9dd9253ca69e1..2fd60ada4bfadc6811b547252b4f7039c9c00c66 100644
  1151. --- a/link.inc
  1152. +++ b/link.inc
  1153. @@ -416,8 +416,9 @@ do ' main loop
  1154.      '
  1155.      case 0x70
  1156.      '
  1157. -    a=wdval(s,i+1,i)
  1158. -    posbin(a)=j
  1159. +    i++
  1160. +    a=readint(s,i)
  1161. +    posbin(a)=j-1
  1162.      exit do
  1163.      '
  1164.      '
  1165. diff --git a/main.inc b/main.inc
  1166. index 2ff8ea7adf8150dc30335cf81c4b41662c30f644..0c48bd5cb06cb92b2f1a6a7f0f0c22d6b58657f8 100644
  1167. --- a/main.inc
  1168. +++ b/main.inc
  1169. @@ -125,7 +125,8 @@
  1170.    endif
  1171.    pam=VirtualAlloc 0,lam,0x1000,0X40 'MEM_COMMIT, PAGE_EXECUTE_READWRITE
  1172.    lbuf[ibuf]=lam
  1173. -  pvm[ibuf]=pam
  1174. +  pvm[ibuf]=pam 'BASE (ALSO ENTRY POINT)
  1175. +  pvd[ibuf]=pam+posbin[3] 'BSSDATA
  1176.    copy pam,pbuf,lam
  1177.    end sub
  1178.  
  1179. @@ -138,7 +139,7 @@
  1180.      return 0 'EXCLUDE (AFTER MAKING A PE FILE)
  1181.    endif
  1182.    '
  1183. -  sys mbx
  1184. +  sys mbx,nbx
  1185.    '
  1186.    if p=0
  1187.      p=pvm[ibuf]
  1188. @@ -147,8 +148,10 @@
  1189.      endif
  1190.    endif
  1191.    '
  1192. -  mov rax,0
  1193.    mov mbx,rbx
  1194. +  nbx=pvd[ibuf]
  1195. +  mov rbx,nbx
  1196. +  mov rax,0
  1197.    call p
  1198.    mov rbx,mbx
  1199.    return
  1200. @@ -273,6 +276,11 @@
  1201.      endif
  1202.    endif
  1203.    '
  1204. +  'JIT MODE
  1205. +  if len(dbuf)>0x1000
  1206. +    'copy over runtime links
  1207. +    copy strptr(dbuf)+posbin[3],rbx,0xc00 '3k
  1208. +  endif
  1209.    SetExecSpace()
  1210.    '
  1211.    end sub
  1212. diff --git a/meta.inc b/meta.inc
  1213. index a6d49292b0e0ea6f92a75dc69b68fce5a96e2716..450ebe8e2c8fa656016a118a7226f787ac346a3d 100644
  1214. --- a/meta.inc
  1215. +++ b/meta.inc
  1216. @@ -56,12 +56,12 @@ function multiassign(string*s, int *i,tp) as string
  1217.    asgk=0
  1218.    asgl=0
  1219.    '
  1220. -  if tp>=htyp
  1221. -    asgs=macso(tp-htyp,1)
  1222. +  if tp>=typh
  1223. +    asgs=macso(tp-typh,1)
  1224.    elseif tp>0x100
  1225.      '
  1226.    elseif tp>=0xe0
  1227. -    w2=mid(macso(tp-htyp,1),3,3)
  1228. +    w2=mid(macso(tp-typh,1),3,3)
  1229.      if w2="bp-"
  1230.        asgl=1 'LOCAL(ELSE GLOBAL) ARRAY
  1231.      endif
  1232. @@ -69,8 +69,8 @@ function multiassign(string*s, int *i,tp) as string
  1233.    '
  1234.    nextinstruct(s,i)
  1235.    '
  1236. -  if (tp>=htyp)and(ascn=123)
  1237. -    w2=macso(tp-htyp,2) 'TYPE DEFAULT EXPRESSIONS
  1238. +  if (tp>=typh)and(ascn=123)
  1239. +    w2=macso(tp-typh,2) 'TYPE DEFAULT EXPRESSIONS
  1240.      if w2
  1241.        i++ : skiplspace(s,i)
  1242.        string wt1 'sink
  1243. @@ -110,8 +110,8 @@ end function
  1244.  
  1245.  
  1246.  
  1247. -function expandexpr(string*s, int*i, typa1) as int
  1248. -==================================================
  1249. +function expandexpr(string*s, int*i, typx) as int
  1250. +=================================================
  1251.  '
  1252.  int a,b,p,m,n,bg,ndo
  1253.  string wr,wt,w1,w2,w3,w4,w5
  1254. @@ -160,7 +160,7 @@ do
  1255.        if ndo
  1256.          i++ 'SKIP ')'
  1257.        endif
  1258. -      a=typa1
  1259. +      a=typx
  1260.        if a<=0 'DETERMINE TYPE FROM EXPRESSION
  1261.          wt=w3
  1262.          nsto=1 : wt=express(wt,1,0) : jn=0 : epfx="" : nsto=0
  1263. @@ -455,7 +455,7 @@ function findop(int ty, *mo, string*name,*mthd) as int
  1264.    int i,a,n,u
  1265.    mthd=""
  1266.    mo=0
  1267. -  u=ty-htyp
  1268. +  u=ty-typh
  1269.    s=macso(u,1)
  1270.    i=instrevn(-1,s,rmk+name+" ")
  1271.    if i
  1272. @@ -477,7 +477,7 @@ function findop(int ty, *mo, string*name,*mthd) as int
  1273.      if a
  1274.        mthd=name
  1275.        w=macso(a,1)
  1276. -      mo=instr(w,rmk+mthd+" ") 'LOCATE OPERATOR / FUNCTION MACROMEMBER
  1277. +      mo=instrword(w,rmk+mthd) 'LOCATE OPERATOR / FUNCTION MACROMEMBER
  1278.        if mo
  1279.          mthd=ts+"_op."+qu+mthd+qu
  1280.        else
  1281. diff --git a/o2tests.o2bas b/o2tests.o2bas
  1282. index 7d4121ebc6d1b02c8c6ff17ca5b1d4f828d1f4f0..21778b8321811290f234569f58bcb31d107513f4 100644
  1283. --- a/o2tests.o2bas
  1284. +++ b/o2tests.o2bas
  1285. @@ -1,4 +1,169 @@
  1286.  
  1287. +'save
  1288. +type azm
  1289. +int v
  1290. +end type
  1291. +
  1292. +macro azm_op(a,b,c)
  1293. +===================
  1294. +  '
  1295. +  macro .load(b,a)
  1296. +  mov eax,b.v
  1297. +  end macro
  1298. +  '
  1299. +  macro .+ (b,a)
  1300. +  add eax,b.v
  1301. +  end macro
  1302. +  macro .* (b,a)
  1303. +  imul eax,b.v
  1304. +  end macro
  1305. +  '
  1306. +  macro .save(b,a)
  1307. +  mov a.v,eax
  1308. +  end macro
  1309. +  '
  1310. +end macro
  1311. +
  1312. +'#recordof azm
  1313. +'#recordof azm_op
  1314. +
  1315. +function f()
  1316. +azm a,b,c,d
  1317. +#show a=b+(c*d)
  1318. +end function
  1319. +
  1320. +/*
  1321. +'09:07 10/12/2018
  1322. +$filename "c.exe"
  1323. +uses ..\rtl64
  1324. +long var=2
  1325. +print string(var,"0")
  1326. +*/
  1327. +
  1328. +/*
  1329. +'10:29 09/12/2018
  1330. +'fix creating class in child macro
  1331. +macro myclasses(a,b,c,d)
  1332. +  macro .create(a,b,c,d)
  1333. +    class a
  1334. +      sys bu
  1335. +      int n
  1336. +      int e
  1337. +      '
  1338. +      function constructor(b*c,int d)
  1339. +      e=d*sizeof b
  1340. +      bu=getmemory e
  1341. +      copy bu,@c,e
  1342. +      n=d
  1343. +      end function
  1344. +      '
  1345. +      function destructor()
  1346. +      freememory bu
  1347. +      end function
  1348. +    end class
  1349. +  end macro
  1350. +end macro
  1351. +#recordof myclasses
  1352. +myclasses.create(cfloat,float,f,nf)
  1353. +#recordof cfloat
  1354. +*/
  1355. +
  1356. +/*
  1357. +Class StringBuf
  1358. +===============
  1359. +  sys bu
  1360. +  int mx
  1361. +  int le
  1362. +  int qu
  1363. +  int wi
  1364. +  '
  1365. +  function constructor(string*s)
  1366. +  ==============================
  1367. +    int ls=len s
  1368. +    wstring ws=s
  1369. +    qu=512
  1370. +    mx=qu+(ls*2)
  1371. +    le=ls
  1372. +    wi=2
  1373. +    bu=getmemory mx*2
  1374. +    copy bu,strptr(ws),ls*2
  1375. +  end function
  1376. +  '
  1377. +  function constructor(wstring*s)
  1378. +  ===============================
  1379. +    int ls=len s
  1380. +    qu=512
  1381. +    mx=qu+(ls*2)
  1382. +    le=ls
  1383. +    wi=2
  1384. +    bu=getmemory mx*2
  1385. +    copy bu,strptr(s),ls*2
  1386. +  end function
  1387. +  '
  1388. +  function constructor(stringbuf*b)
  1389. +  =================================
  1390. +    le=b.le
  1391. +    mx=b.mx
  1392. +    wi=b.wi
  1393. +    qu=b.qu
  1394. +    bu=getmemory mx*2
  1395. +    copy bu,b.bu,le*2
  1396. +  end function
  1397. +  '
  1398. +  function destructor()
  1399. +  =====================
  1400. +    freememory bu
  1401. +    bu=0 : mx=0
  1402. +  end function
  1403. +  '
  1404. +  function primitive() as wstring
  1405. +  ===============================
  1406. +    return left( cast(bstring2) bu, le)
  1407. +  end function
  1408. +  '
  1409. +  operator load(wstring*s)
  1410. +  ========================
  1411. +    s=left( cast(bstring2) bu, le)
  1412. +  end function
  1413. +  '
  1414. +  operator load(stringbuf*a)
  1415. +  ==========================
  1416. +    sys abu=a.bu
  1417. +    int amx=a.mx
  1418. +    if le>amx
  1419. +      amx=a.qu+(le*2)
  1420. +      abu=getmemory amx*2
  1421. +      copy abu,bu,le*2
  1422. +      freememory a.bu
  1423. +      a.bu=abu
  1424. +      a.mx=amx
  1425. +    else
  1426. +      copy a.bu,bu,le*2
  1427. +    end if
  1428. +    a.le=le
  1429. +  end operator
  1430. +  '
  1431. +  operator + (stringbuf*a)
  1432. +  ========================
  1433. +    sys abu=a.bu
  1434. +    int amx=a.mx
  1435. +    if le+a.le>amx
  1436. +      amx+=a.qu+(le*2)
  1437. +      sys abu=getmemory amx*2
  1438. +      copy abu,a.bu,a.le*2
  1439. +      copy abu+(a.le*2),bu,le*2
  1440. +      freememory a.bu
  1441. +      a.bu=abu
  1442. +      a.mx=amx
  1443. +    else
  1444. +      copy abu+a.le*2,bu,le*2
  1445. +    end if
  1446. +    a.le+=le
  1447. +  end operator
  1448. +end class
  1449. +*/
  1450. +
  1451. +
  1452.  /*
  1453.  '07:01 05/12/2018
  1454.  'TEST REDIM DESTRUCTORS
  1455. @@ -2167,58 +2332,6 @@ finit
  1456.  */
  1457.  
  1458.  
  1459. -/*
  1460. -
  1461. -sub ddestructors(sys b,d,z,n)
  1462. -=============================
  1463. -sys i
  1464. -sys s
  1465. -'dual 32/64 direct
  1466. -for i=1 to n
  1467. -  mov s,rsp
  1468. -  sub rsp,32
  1469. -  mov rcx,b
  1470. -  mov [rsp],rcx
  1471. -  call d
  1472. -  mov rsp,s
  1473. -  b+=z  
  1474. -next
  1475. -end sub
  1476. -
  1477. -
  1478. -sub nullify(sys p, int n)
  1479. -=========================
  1480. -mov rdx,p
  1481. -mov ecx,n
  1482. -(
  1483. - mov byte [rdx],0
  1484. - inc rdx
  1485. - dec ecx
  1486. - jg repeat
  1487. -)
  1488. -end function
  1489. -
  1490. -
  1491. -function isnull(sys p, int n) as int
  1492. -====================================
  1493. -mov rdx,p
  1494. -mov ecx,n
  1495. -(
  1496. - cmp byte [rdx],0
  1497. - jnz exit
  1498. - inc rdx
  1499. - dec ecx
  1500. - jg repeat
  1501. - return 1
  1502. -)
  1503. -return 0
  1504. -end function
  1505. -
  1506. -print "ok"
  1507. -*/
  1508. -
  1509. -
  1510. -
  1511.  /*
  1512.  extern lib "t.dll"
  1513.  ! hello()
  1514. diff --git a/oxygen.dll b/oxygen.dll
  1515. index deca0f87985cc114f42cde1a98a0fb9038b9e8fe..6122da5e2df07147e9d8fddccd558158a84d7ed2 100644
  1516. Binary files a/oxygen.dll and b/oxygen.dll differ
  1517. diff --git a/pars.inc b/pars.inc
  1518. index 92493c9fb3b8f3f5771fe642435d700fdd0b7752..bd941007699a202caf935912c59019513d792b3b 100644
  1519. --- a/pars.inc
  1520. +++ b/pars.inc
  1521. @@ -9,7 +9,7 @@
  1522.  ! stodata(string*s) as string
  1523.  ! arrayres(string*s, int*i, string*wr) as string
  1524.  ! procedures(string*s, int*i, string*wr) as string
  1525. -! express( string*s, int*i,*typa1) as string
  1526. +! express( string*s, int*i,*typx) as string
  1527.  ! indiri(string*wr, int n)
  1528.  ! tmpvar() as string
  1529.  ! operi(int qp,tp, string*wk) as string
  1530. @@ -126,7 +126,7 @@ function identype(string*s) as int
  1531.    '
  1532.    select b
  1533.      case -3
  1534. -      n=a+htyp : lent=macio(a,1) 'TYPE / STRUCT / CLASS
  1535. +      n=a+typh : lent=macio(a,1) 'TYPE / STRUCT / CLASS
  1536.      case -8
  1537.        n=macio(a,5)
  1538.        lent=n and 15 ' pointer (BSTR or BSTR byref)
  1539. @@ -138,7 +138,7 @@ function identype(string*s) as int
  1540.          ary=w1+" "+ary
  1541.        endif
  1542.        b=macio(a,4) 'GET UNDERLYING TYPE
  1543. -      if b<htyp
  1544. +      if b<typh
  1545.          n=b
  1546.          if n=-5
  1547.            indt=0 : ary="" : return cpuw 'FUNCTION POINTER TYPE AS int
  1548. @@ -146,7 +146,7 @@ function identype(string*s) as int
  1549.          lent=macio(a,1)
  1550.          return n
  1551.        else
  1552. -        a=b-htyp 'LOCATE TYPE OR TYPEDEF
  1553. +        a=b-typh 'LOCATE TYPE OR TYPEDEF
  1554.          goto ridentype2
  1555.        endif
  1556.      case -15 'PRIMITIVE TYPES
  1557. @@ -199,10 +199,10 @@ function typename(int n) as string
  1558.  ==================================
  1559.    if n<=0
  1560.      return "void"
  1561. -  elseif n<htyp
  1562. +  elseif n<typh
  1563.      return revdic(idtype,n)
  1564.    else
  1565. -    return macso(n-htyp,0)
  1566. +    return macso(n-typh,0)
  1567.    endif
  1568.  end function
  1569.  
  1570. @@ -372,11 +372,18 @@ function MacroMember(string*s,*wm,*wp) as int
  1571.    if asc(w2)=34
  1572.      w2=mid(w2,2,len(w2)-2)
  1573.    endif
  1574. -  w2=rmk+w2+" " 'see findop instr
  1575. +  w2=rmk+w2 'see findop instr
  1576. +  '
  1577.    'SCAN MACRO BLOCK
  1578. -  a=instr(s,w2)
  1579. +  a=1
  1580. +  rsrch:
  1581. +  ======
  1582. +  a=instr(a,s,w2)
  1583.    if a>0
  1584.      a+=len(w2)
  1585. +    if asc(s,a)>0x40
  1586. +      goto rsrch 'part of another name
  1587. +    endif
  1588.      macromembertype(s,a,t)
  1589.      wp=captureblock(s,a,wm) 'MEMBER MACRO PROTOTYPE OR MEMBER DEF BLOCK
  1590.      ow="("+wm+" member) "+ow
  1591. @@ -796,8 +803,8 @@ sub findmemb(string*wki,*wr, int*ki,*kl)
  1592.    '=================
  1593.    '
  1594.    m=macio(ml,0)
  1595. -  if m>=htyp
  1596. -    m-=htyp
  1597. +  if m>=typh
  1598. +    m-=typh
  1599.    endif
  1600.    '
  1601.    'STRUCTURE INDEX
  1602. @@ -1038,7 +1045,7 @@ sub findmemb(string*wki,*wr, int*ki,*kl)
  1603.        endif
  1604.        '
  1605.        wn=qedi
  1606. -      ml=typ-htyp
  1607. +      ml=typ-typh
  1608.        m=ml : ind=0
  1609.        voff=0 : toff=0
  1610.        if kl
  1611. @@ -1284,7 +1291,7 @@ function identopeq(string*s, int*i, string*w1) as int
  1612.    i++
  1613.    skiplspace(s,i)
  1614.    '
  1615. -  if (op=0)or(op>=htyp)
  1616. +  if (op=0)or(op>=typh)
  1617.      function=op
  1618.      exit function
  1619.    endif
  1620. @@ -1980,7 +1987,7 @@ function identow(string*wr,*wk) as int
  1621.        ''check for register-like names eg ax bx cx
  1622.        '
  1623.        if macio(mm,0)=-10
  1624. -        w1=wr : m=macio(ths,0)-htyp
  1625. +        w1=wr : m=macio(ths,0)-typh
  1626.          c=instrevn(-1,macso(m,1),rmk+w1+" ")
  1627.          if c
  1628.            wk=w1 : dtf=5 : function=ths : exit function
  1629. @@ -1998,7 +2005,7 @@ function identow(string*wr,*wk) as int
  1630.      'CHECK FOR IMPLICIT THIS.
  1631.      '------------------------
  1632.      '
  1633. -    m=macio(ths,0)-htyp
  1634. +    m=macio(ths,0)-typh
  1635.      c=0
  1636.      '
  1637.      if dtf
  1638. @@ -2908,7 +2915,7 @@ function pword(string*s, int*i) as string
  1639.              a=1 'IS A CLASS RATHER THAN AN OBJECT
  1640.            endif
  1641.          elseif mc>0
  1642. -          if macio(macio(mp,0)-htyp,2)
  1643. +          if macio(macio(mp,0)-typh,2)
  1644.              a=1 'OTHERWISE CHECK THE CLASS OF THE OBJECT
  1645.            endif
  1646.          endif
  1647. diff --git a/tran.inc b/tran.inc
  1648. index b60568b88de0a10f73875e2d0d3802019a646385..6deb925e490678f065ec3aa806bc08c65843c69b 100644
  1649. --- a/tran.inc
  1650. +++ b/tran.inc
  1651. @@ -75,10 +75,10 @@
  1652.        mov rcx,b
  1653.        mov [rsp],rcx
  1654.        call d
  1655. -      mov rsp,s
  1656. -      mov rcx,b
  1657. -      mov edx,z
  1658. -      call _nullify
  1659. +      'mov rsp,s
  1660. +      'mov rcx,b
  1661. +      'mov edx,z
  1662. +      'call _nullify
  1663.      end if
  1664.      b+=z  
  1665.    next
  1666. @@ -92,6 +92,13 @@
  1667.      return
  1668.    end function
  1669.  
  1670. +  function nullify(sys p,int n)
  1671. +  =============================
  1672. +  mov rcx,p
  1673. +  mov edx,n
  1674. +  call _nullify
  1675. +  end function
  1676. +
  1677.    " 'end Util
  1678.  
  1679.  
  1680. @@ -1047,7 +1054,7 @@ end function
  1681.        inserts(s,wr+" ",i)
  1682.        goto mainloop
  1683.      endif
  1684. -    m=b-htyp                              '
  1685. +    m=b-typh                              '
  1686.      a=1 'C style UDT variable 'VAR
  1687.    '
  1688.    end select
  1689. @@ -1248,13 +1255,13 @@ end function
  1690.    '
  1691.    if mp>0
  1692.      if cpoint
  1693. -      if typ>=htyp
  1694. +      if typ>=typh
  1695.          typ=cpuw
  1696.          typm=cpuw
  1697.        endif
  1698.      endif
  1699.      '
  1700. -    if typm<htyp
  1701. +    if typm<typh
  1702.        asg=psg+operi(2,typ,wsg) 'ASSIGNMENT FOR PRIMITIVE TYPES
  1703.        '
  1704.        'ASSIGNMENT PROCEDURE FOR DYNAMIC STRINGS
  1705. @@ -1292,12 +1299,16 @@ end function
  1706.    op=0
  1707.    string loadh
  1708.    '
  1709. -  if typm>=htyp
  1710. +  if typm>=typh
  1711.      asg=""
  1712. -    loadh="load"
  1713. +    if findop(typm,a,"save",w2)
  1714. +      loadh="save"
  1715. +    else
  1716. +      loadh="load"
  1717. +    endif
  1718.      if cpa>2
  1719.        w3=wr+"="
  1720. -      if findop(typg,a,w3,w2)
  1721. +      if findop(typm,a,w3,w2)
  1722.          loadh=w3
  1723.          jmp fwd expract
  1724.        endif
  1725. @@ -1312,7 +1323,7 @@ end function
  1726.    expract:
  1727.    ========
  1728.    '
  1729. -  if typm>=htyp then asg=""
  1730. +  if typm>=typh then asg=""
  1731.    '
  1732.    w1=express(s,i,typm)+asg
  1733.    '
  1734. @@ -1327,9 +1338,9 @@ end function
  1735.    '
  1736.    'ASSIGNMENT BY 'LOAD' MACRO OR METHOD
  1737.    '
  1738. -  if typg>=htyp
  1739. +  if typg>=typh
  1740.      if rps=0
  1741. -      if typm<htyp
  1742. +      if typm<typh
  1743.          goto cleardown 'address assign etc
  1744.        endif
  1745.      endif
  1746. @@ -1346,9 +1357,9 @@ end function
  1747.      end if
  1748.    endif
  1749.    '
  1750. -  'htypes:
  1751. +  'typhes:
  1752.    '
  1753. -  if typm>=htyp
  1754. +  if typm>=typh
  1755.      'EXPRESSIONS USING HIGHER TYPE OPERANDS
  1756.      'RPS
  1757.      '
  1758. @@ -1366,7 +1377,7 @@ end function
  1759.          endif
  1760.        endif
  1761.        '
  1762. -      m=typm-htyp  'record
  1763. +      m=typm-typh  'record
  1764.        n=macio(m,1) 'size
  1765.        w4=str(n)
  1766.        hiex+=storecode(w1)+
  1767. @@ -1948,9 +1959,9 @@ end function
  1768.      endif
  1769.    endif
  1770.    '
  1771. -  if typp>=htyp
  1772. +  if typp>=typh
  1773.      'SETUP RETURN VAR LOCATION
  1774. -    w1=macso(typp-htyp,0)
  1775. +    w1=macso(typp-typh,0)
  1776.      retr=retb+cpuw
  1777.      ndstr=1
  1778.      vars(w1+" returnvar at "+memreg(qebp,retr)+cr)
  1779. @@ -2036,7 +2047,7 @@ end function
  1780.      case 0x0               : typm=cpuw
  1781.      case 0x40              : typm=0x68 'fpu type treated as double
  1782.      case 0xe0 to 0xff      : typm-=32  'return bstring
  1783. -    case htyp to 999999999 : typm=0    'force return of address
  1784. +    case typh to 999999999 : typm=0    'force return of address
  1785.      end select
  1786.      '
  1787.      'THE RESULT IS LEFT IN THE ACCUM (CPU / FPU / SIMD )
  1788. @@ -2619,7 +2630,7 @@ end function
  1789.    if cnd<0 then w2="jnz " else w2="jz "
  1790.    '
  1791.    if isendofexpr(s,i)=0 then goto condexpression
  1792. -  if (varf>=8)or(typ>=htyp)or(rps=1) then goto condexpression
  1793. +  if (varf>=8)or(typ>=typh)or(rps=1) then goto condexpression
  1794.    '
  1795.    if ascn=0x74
  1796.      if wordahead(s,i)="then"
  1797. @@ -3193,7 +3204,7 @@ end function
  1798.        if a then
  1799.          goto mainloop
  1800.        else
  1801. -        b+=htyp
  1802. +        b+=typh
  1803.          goto rtypedef
  1804.        endif
  1805.      elseif wr="const"
  1806. @@ -3410,7 +3421,7 @@ end function
  1807.      b=me-1
  1808.      lent=macio(b,1)
  1809.      wn=macso(b,0)
  1810. -    b+=htyp
  1811. +    b+=typh
  1812.      indt=0
  1813.      if tdst=0
  1814.        goto typesdone
  1815. @@ -3742,7 +3753,7 @@ end function
  1816.          c=lookupm(w4)
  1817.          if c
  1818.            d=macio(c,0)
  1819. -          if d>=htyp then d-=htyp
  1820. +          if d>=typh then d-=typh
  1821.            if d<=0 then d=c
  1822.            w2=macso(d,1) 'BODY OF TYPE / CLASS / MACRO
  1823.            a=me 'NO SCAN
  1824. @@ -4192,7 +4203,7 @@ terminate
  1825.      '
  1826.      'ASSUME HIGHER TYPES IMPLICITLY RETURN A POINTER
  1827.      '      
  1828. -    'if a>=htyp
  1829. +    'if a>=typh
  1830.        '
  1831.      if a>=0x100
  1832.        '
  1833.  
7
Bugs & Feature Requests / Small request for "direct string" parameters.
« Last post by Brian Alvarez on December 10, 2018, 08:11:44 PM »
 I Noticed that when you pass a literal string as a parameter, you cannot assign text to it, but
when you pass the reference to the string you can.

At least on 32 bit mode, because in 64 bit mode it crashes.

 My small request is, can we alter the text of "direct string" parameters in 64 bit mode just like
in 32 bit mode? I dont care to alter the text of these parameters:

Code: [Select]
string param
I need it only for these:

Code: [Select]
string *param
Otherwise i have to make an ugly hack.

 In other words, i think what i am really asking is either:
  • Allow string ("") to be passed as parameter....
  • Allow non byref parameters to be modified in the target modules.
  • A way to pass string parameters bycopy.

 If possible. Thanks!

8
Problems & Solutions / Re: passing a chain of CHAR byref
« Last post by Brian Alvarez on December 10, 2018, 01:54:14 PM »
Perfect, this way i can do it in one line. :)
9
Problems & Solutions / Re: passing a chain of CHAR byref
« Last post by Charles Pegge on December 10, 2018, 01:29:58 PM »
Actually, you can simplify it further. Copy understands strings and their pointers:

   copy s,"* changed in module *",len s
10
Bugs & Feature Requests / Re: Crash with STR
« Last post by Brian Alvarez on December 10, 2018, 12:07:23 PM »
 Charles, this update (121kb) is giving me trouble with macro members:

Code: [Select]
ERROR: Unable to find macro member
WORD: )
IN: pbmain
LINE: 125
FILE: "main source

 Rolling back to previous DLL (139kb) makes everything work again.
Pages: [1] 2 3 ... 10