ref: 3e92cda1745121a0545c581d9f135feed9e280bd
parent: 543887f46d1d7796bd8f1e6d329401197b19ec56
author: Ori Bernstein <[email protected]>
date: Tue Feb 19 21:15:01 EST 2013
'#' is now the postfix pointer deref operator. This makes operator precedence less confusing.
--- a/libstd/alloc.myr
+++ b/libstd/alloc.myr
@@ -26,21 +26,21 @@
*/
pkg std =
- generic alloc : ( -> @a*)
- generic free : (v:@a* -> void)
+ generic alloc : ( -> @a#)
+ generic free : (v:@a# -> void)
generic slalloc : (len : size -> @a[:])
generic slgrow : (sl : @a[:], len : size -> @a[:])
generic slfree : (sl : @a[:] -> void)
- const bytealloc : (sz:size -> byte*)
- const bytefree : (m:byte*, sz:size -> void)
+ const bytealloc : (sz:size -> byte#)
+ const bytefree : (m:byte#, sz:size -> void)
;;
/* null pointers. only used internally. */
-const Zbyte = 0 castto(byte*)
-const Zslab = 0 castto(slab*)
-const Zchunk = 0 castto(chunk*)
+const Zbyte = 0 castto(byte#)
+const Zslab = 0 castto(slab#)
+const Zchunk = 0 castto(chunk#)
const Slabsz = 1048576 /* 1 meg slabs */
const Cachemax = 16 /* maximum number of slabs in the cache */
@@ -53,30 +53,30 @@
type bucket = struct
sz : size /* aligned size */
nper : size /* max number of elements per slab */
- slabs : slab* /* partially filled or free slabs */
- cache : slab* /* cache of empty slabs, to prevent thrashing */
+ slabs : slab# /* partially filled or free slabs */
+ cache : slab# /* cache of empty slabs, to prevent thrashing */
ncache : size /* size of cache */
;;
type slab = struct
- head : byte* /* head of virtual addresses, so we don't leak address space */
- next : slab* /* the next slab on the chain */
- freehd : chunk* /* the nodes we're allocating */
+ head : byte# /* head of virtual addresses, so we don't leak address space */
+ next : slab# /* the next slab on the chain */
+ freehd : chunk# /* the nodes we're allocating */
nfree : size /* the number of free nodes */
;;
type chunk = struct /* NB: must be smaller than sizeof(slab) */
- next : chunk* /* the next chunk in the free list */
+ next : chunk# /* the next chunk in the free list */
;;
/* Allocates an object of type @a, returning a pointer to it. */
-generic alloc = {-> @a*
- -> bytealloc(sizeof(@a)) castto(@a*)
+generic alloc = {-> @a#
+ -> bytealloc(sizeof(@a)) castto(@a#)
}
/* Frees a value of type @a */
-generic free = {v:@a* -> void
- bytefree(v castto(byte*), sizeof(@a))
+generic free = {v:@a# -> void
+ bytefree(v castto(byte#), sizeof(@a))
}
/* allocates a slice of 'len' elements. */
@@ -83,13 +83,13 @@
generic slalloc = {len
var p
- p = bytealloc(len*sizeof(@a)) castto(@a*)
+ p = bytealloc(len*sizeof(@a)) castto(@a#)
-> p[0:len]
}
/* Frees a slice */
generic slfree = {sl
- bytefree(sl castto(byte*), sl.len * sizeof(@a))
+ bytefree(sl castto(byte#), sl.len * sizeof(@a))
}
/* Grows a slice */
@@ -140,7 +140,7 @@
}
/* Sets up a single empty bucket */
-const bktinit = {b : bucket*, sz
+const bktinit = {b, sz
b.sz = align(sz, Align)
b.nper = (Slabsz - sizeof(slab))/b.sz
b.slabs = Zslab
@@ -149,7 +149,7 @@
}
/* Creates a slab for bucket 'bkt', and fills the chunk list */
-const mkslab = {bkt : bucket*
+const mkslab = {bkt
var i
var p
var s
@@ -173,12 +173,12 @@
die("Unable to mmap")
;;
- s = align(p castto(intptr), Slabsz) castto(slab*)
+ s = align(p castto(intptr), Slabsz) castto(slab#)
s.head = p
s.nfree = bkt.nper
/* skip past the slab header */
off = align(sizeof(slab), Align)
- bnext = nextchunk(s castto(chunk*), off)
+ bnext = nextchunk(s castto(chunk#), off)
s.freehd = bnext
for i = 0; i < bkt.nper; i++
b = bnext
@@ -217,7 +217,7 @@
s.next = Zslab
;;
- -> b castto(byte*)
+ -> b castto(byte#)
}
/*
@@ -230,8 +230,8 @@
var s
var b
- s = mtrunc(m, Slabsz) castto(slab*)
- b = m castto(chunk*)
+ s = mtrunc(m, Slabsz) castto(slab#)
+ b = m castto(chunk#)
if s.nfree == 0
s.next = bkt.slabs
bkt.slabs = s
@@ -273,7 +273,7 @@
index to get to the next one
*/
const nextchunk = {b, sz
- -> ((b castto(intptr)) + sz) castto(chunk*)
+ -> ((b castto(intptr)) + sz) castto(chunk#)
}
/*
@@ -289,5 +289,5 @@
be a power of two.
*/
const mtrunc = {m, align
- -> ((m castto(intptr)) & ~(align - 1)) castto(byte*)
+ -> ((m castto(intptr)) & ~(align - 1)) castto(byte#)
}
--- a/libstd/chartype.myr
+++ b/libstd/chartype.myr
@@ -1070,7 +1070,7 @@
;;
if t.len != 0 && c >= t[0]
- *ret = t
+ ret# = t
-> true
else
-> false
--- a/libstd/fmt.myr
+++ b/libstd/fmt.myr
@@ -49,7 +49,7 @@
var w_val : int16
var i_val : int32
var l_val : int64
- var p_val : byte*
+ var p_val : byte#
var c_val : char
n = 0
--- a/libstd/optparse.myr
+++ b/libstd/optparse.myr
@@ -15,9 +15,9 @@
arglist : byte[:][:]
;;
- const optinit : (opts : byte[:], args : byte[:][:] -> optctx*)
- const optnext : (ctx : optctx* -> char)
- const optarg : (ctx : optctx* -> byte[:])
+ const optinit : (opts : byte[:], args : byte[:][:] -> optctx#)
+ const optnext : (ctx : optctx# -> char)
+ const optarg : (ctx : optctx# -> byte[:])
;;
const optinit = {opts, args
--- a/libstd/rand.myr
+++ b/libstd/rand.myr
@@ -50,8 +50,8 @@
/* no mkrng() yet because we don't have anything to automatically
seed it with yet */
- const mksrng : (seed : uint32 -> rng*)
- const rand32 : (rng : rng* -> uint32)
+ const mksrng : (seed : uint32 -> rng#)
+ const rand32 : (rng : rng# -> uint32)
;;
type rng = struct
--- a/libstd/test.myr
+++ b/libstd/test.myr
@@ -1,7 +1,7 @@
use std
const main = {args : byte[:][:]
- var x : byte*[1024]
+ var x : byte#[1024]
var sz
var i
var opt
@@ -75,7 +75,7 @@
}
const testrng = {
- var r : std.rng*
+ var r
var i
r = std.mksrng(10)
--- a/libstd/varargs.myr
+++ b/libstd/varargs.myr
@@ -3,11 +3,11 @@
pkg std =
type valist
- const vastart : (args : ...* -> valist)
+ const vastart : (args : ...# -> valist)
generic vanext : (ap : valist -> [@a, valist])
;;
-type valist = byte*
+type valist = byte#
/*
* a valist is really just a pointer to the varargs.
@@ -44,7 +44,7 @@
p = (p + align - 1) & ~(align - 1)
ap = p castto(valist)
- v = *(ap castto(@a*))
+ v = (ap castto(@a#))#
/* only move on after we read through the value */
ap = ((p castto(intptr)) + sizeof(@a)) castto(valist)
--- a/parse/gram.y
+++ b/parse/gram.y
@@ -28,7 +28,7 @@
%token<tok> Terror
%token<tok> Tplus /* + */
%token<tok> Tminus /* - */
-%token<tok> Tstar /* * */
+%token<tok> Tmul /* * */
%token<tok> Tdiv /* / */
%token<tok> Tinc /* ++ */
%token<tok> Tdec /* -- */
@@ -71,7 +71,7 @@
%token<tok> Tcsqbrac /* ] */
%token<tok> Tat /* @ */
%token<tok> Ttick /* ` */
-%token<tok> Thash /* # */
+%token<tok> Tderef /* # */
%token<tok> Ttype /* type */
%token<tok> Tfor /* for */
@@ -327,7 +327,7 @@
: functype {$$ = $1;}
| type Tosqbrac Tcolon Tcsqbrac {$$ = mktyslice($2->line, $1);}
| type Tosqbrac expr Tcsqbrac {$$ = mktyarray($2->line, $1, $3);}
- | type Tstar {$$ = mktyptr($2->line, $1);}
+ | type Tderef {$$ = mktyptr($2->line, $1);}
| Tat Tident {$$ = mktyparam($1->line, $2->str);}
| name {$$ = mktyunres($1->line, $1, NULL, 0);}
| name Toparen typelist Tcparen {$$ = mktyunres($1->line, $1, $3.types, $3.ntypes);}
@@ -510,7 +510,7 @@
| shiftexpr
;
-mulop : Tstar | Tdiv | Tmod
+mulop : Tmul | Tdiv | Tmod
;
shiftexpr
@@ -524,7 +524,6 @@
prefixexpr
: Tinc prefixexpr {$$ = mkexpr($1->line, Opreinc, $2, NULL);}
| Tdec prefixexpr {$$ = mkexpr($1->line, Opredec, $2, NULL);}
- | Tstar prefixexpr {$$ = mkexpr($1->line, Oderef, $2, NULL);}
| Tband prefixexpr {$$ = mkexpr($1->line, Oaddr, $2, NULL);}
| Tlnot prefixexpr {$$ = mkexpr($1->line, Olnot, $2, NULL);}
| Tbnot prefixexpr {$$ = mkexpr($1->line, Obnot, $2, NULL);}
@@ -544,6 +543,8 @@
{$$ = mkexpr($1->line, Oidx, $1, $3, NULL);}
| postfixexpr Tosqbrac optexpr Tcolon optexpr Tcsqbrac
{$$ = mksliceexpr($1->line, $1, $3, $5);}
+ | postfixexpr Tderef
+ {$$ = mkexpr($1->line, Oderef, $1, NULL);}
| postfixexpr Toparen arglist Tcparen
{$$ = mkcall($1->line, $1, $3.nl, $3.nn);}
| atomicexpr
@@ -625,8 +626,6 @@
seqelt : Tdot Tident Tasn expr
{die("Unimplemented struct member init");}
- | Thash atomicexpr Tasn expr
- {die("Unimplmented array member init");}
| endlns expr endlns{$$ = $2;}
;
@@ -776,7 +775,7 @@
switch (tt) {
case Tplus: o = Oadd; break;
case Tminus: o = Osub; break;
- case Tstar: o = Omul; break;
+ case Tmul: o = Omul; break;
case Tdiv: o = Odiv; break;
case Tmod: o = Omod; break;
case Tasn: o = Oasn; break;
--- a/parse/tok.c
+++ b/parse/tok.c
@@ -375,7 +375,7 @@
case ']': tt = Tcsqbrac; break;
case ',': tt = Tcomma; break;
case '`': tt = Ttick; break;
- case '#': tt = Thash; break;
+ case '#': tt = Tderef; break;
case ':':
if (match(':'))
tt = Twith;
@@ -423,7 +423,7 @@
if (match('='))
tt = Tmuleq;
else
- tt = Tstar;
+ tt = Tmul;
break;
case '/':
if (match('='))
--- a/parse/util.c
+++ b/parse/util.c
@@ -68,7 +68,7 @@
va_list ap;
va_start(ap, msg);
- fprintf(stdout, "%s:%d: ", filename, line);
+ fprintf(stdout, "%s:%d: ", file->file.name, line);
vfprintf(stdout, msg, ap);
fprintf(stdout, "\n");
va_end(ap);
--- a/test/arrayaddr.myr
+++ b/test/arrayaddr.myr
@@ -6,6 +6,6 @@
v[1] = 42
p = &v[1]
- -> *p
+ -> p#
}
--- a/test/derefassign.myr
+++ b/test/derefassign.myr
@@ -5,6 +5,6 @@
var v
p = &v
- *p = 123
+ p# = 123
-> v
}
--- a/test/outparam-sl.myr
+++ b/test/outparam-sl.myr
@@ -2,7 +2,7 @@
/* should assign a slice through an out param, returning exiting with 2 */
const arr = [1,2,3,4]
const f = {out
- *out = arr[1:3]
+ out# = arr[1:3]
}
const main = {
--- a/test/outparam.myr
+++ b/test/outparam.myr
@@ -1,7 +1,7 @@
use std
/* should assign through an out pointer parameter, exiting with status 42 */
const f = {out
- *out = 42
+ out# = 42
}
const main = {
--- a/test/ptrpreinc.myr
+++ b/test/ptrpreinc.myr
@@ -1,7 +1,7 @@
use std
/* should preincrement through a pointer, exiting with status 9 */
const ppreinc = {p
- -> ++*p
+ -> ++p#
}
const main = {
--- a/test/test.sh
+++ b/test/test.sh
@@ -14,7 +14,7 @@
function build {
rm -f $1 $1.o $1.s $1.use
- ../myrbuild/myrbuild -b $1 $1.myr -C../6/6m -I../libstd
+ ../myrbuild/myrbuild -b $1 $1.myr -C../6/6m -M../muse/muse -I../libstd
}
function prints {
--- a/test/tyrec.myr
+++ b/test/tyrec.myr
@@ -1,7 +1,7 @@
use std
/* we just want to see if this file compiles */
type foo = struct
- v : foo*
+ v : foo#
;;
const main = {