]> Cypherpunks repositories - gostls13.git/commitdiff
unsafe.Sizeof and unsafe.Offsetof
authorKen Thompson <ken@golang.org>
Sat, 7 Feb 2009 20:34:45 +0000 (12:34 -0800)
committerKen Thompson <ken@golang.org>
Sat, 7 Feb 2009 20:34:45 +0000 (12:34 -0800)
R=r
OCL=24639
CL=24639

src/cmd/gc/dcl.c
src/cmd/gc/go.h
src/cmd/gc/go.y
src/cmd/gc/unsafe.go

index 9f7244fc7ca347cf22253990a5d52c3c1f21bb03..d5d3a9bf4df19f625a5bba8da87d7e7fa4ad0011 100644 (file)
@@ -1483,3 +1483,54 @@ loop:
        c = listnext(&citer);
        goto loop;
 }
+
+/*
+ * look for
+ *     unsafe.Sizeof
+ *     unsafe.Offsetof
+ * rewrite with a constant
+ */
+Node*
+unsafenmagic(Node *l, Node *r)
+{
+       Node *n;
+       Sym *s;
+       long v;
+       Val val;
+
+       if(l == N || r == N)
+               goto no;
+       if(l->op != ONAME)
+               goto no;
+       s = l->sym;
+       if(s == S)
+               goto no;
+       if(strcmp(s->opackage, "unsafe") != 0)
+               goto no;
+
+       if(strcmp(s->name, "Sizeof") == 0) {
+               walktype(r, Erv);
+               if(r->type == T)
+                       goto no;
+               v = r->type->width;
+               goto yes;
+       }
+       if(strcmp(s->name, "Offsetof") == 0) {
+               if(r->op != ODOT && r->op != ODOTPTR)
+                       goto no;
+               walktype(r, Erv);
+               v = n->xoffset;
+               goto yes;
+       }
+
+no:
+       return N;
+
+yes:
+       val.ctype = CTINT;
+       val.u.xval = mal(sizeof(*n->val.u.xval));
+       mpmovecfix(val.u.xval, v);
+       n = nod(OLITERAL, N, N);
+       n->val = val;
+       return n;
+}
index 7b861d38c26a0e1510e369103faab1c5e1207c91..436ddd9a9b9af25005eba8f6c69923f18daa2eac 100644 (file)
@@ -763,6 +763,7 @@ void        constiter(Node*, Type*, Node*);
 
 void   funclit0(Type*);
 Node*  funclit1(Type*, Node*);
+Node*  unsafenmagic(Node*, Node*);
 
 /*
  *     export.c
index 5ed7ed09c9fa97fe37b9c96bfe7b3f2f2528428e..29a08912d4a2fd72c04067a885e133fdcebe0edf 100644 (file)
@@ -804,7 +804,9 @@ pexpr:
        }
 |      pexpr '(' oexpr_list ')'
        {
-               $$ = nod(OCALL, $1, $3);
+               $$ = unsafenmagic($1, $3);
+               if($$ == N)
+                       $$ = nod(OCALL, $1, $3);
        }
 |      LLEN '(' expr ')'
        {
index 2b2187b3e3bd51cfdd10bc42a4cda7df519307e7..47703f6e0ffb1d65cec8340fdf8a2fee054b92d5 100644 (file)
@@ -6,3 +6,5 @@
 package PACKAGE
 
 type   Pointer *any;
+func   Offsetof(any) int;
+func   Sizeof(any) int;