mirror of
https://github.com/golang/go
synced 2024-11-22 12:34:48 -07:00
unsafe.Sizeof and unsafe.Offsetof
R=r OCL=24639 CL=24639
This commit is contained in:
parent
bcf48076e5
commit
8a70545b57
@ -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;
|
||||
}
|
||||
|
@ -763,6 +763,7 @@ void constiter(Node*, Type*, Node*);
|
||||
|
||||
void funclit0(Type*);
|
||||
Node* funclit1(Type*, Node*);
|
||||
Node* unsafenmagic(Node*, Node*);
|
||||
|
||||
/*
|
||||
* export.c
|
||||
|
@ -804,7 +804,9 @@ pexpr:
|
||||
}
|
||||
| pexpr '(' oexpr_list ')'
|
||||
{
|
||||
$$ = nod(OCALL, $1, $3);
|
||||
$$ = unsafenmagic($1, $3);
|
||||
if($$ == N)
|
||||
$$ = nod(OCALL, $1, $3);
|
||||
}
|
||||
| LLEN '(' expr ')'
|
||||
{
|
||||
|
@ -6,3 +6,5 @@
|
||||
package PACKAGE
|
||||
|
||||
type Pointer *any;
|
||||
func Offsetof(any) int;
|
||||
func Sizeof(any) int;
|
||||
|
Loading…
Reference in New Issue
Block a user