Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
G
golang
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
go
golang
Commits
8877d27b
Commit
8877d27b
authored
Oct 03, 2008
by
Ken Thompson
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
interfaces of all types
R=r OCL=16462 CL=16462
parent
bbb908fe
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
80 additions
and
80 deletions
+80
-80
align.c
src/cmd/6g/align.c
+1
-1
gg.h
src/cmd/6g/gg.h
+0
-2
obj.c
src/cmd/6g/obj.c
+47
-37
go.h
src/cmd/gc/go.h
+1
-1
subr.c
src/cmd/gc/subr.c
+14
-26
iface.c
src/runtime/iface.c
+17
-13
No files found.
src/cmd/6g/align.c
View file @
8877d27b
...
...
@@ -170,7 +170,7 @@ dowidth(Type *t)
case
TFUNC
:
// function is 3 cated structures
w
=
widstruct
(
*
getthis
(
t
),
0
,
0
);
w
=
widstruct
(
*
getthis
(
t
),
0
,
1
);
w
=
widstruct
(
*
getinarg
(
t
),
w
,
0
);
w
=
widstruct
(
*
getoutarg
(
t
),
w
,
1
);
t
->
argwid
=
w
;
...
...
src/cmd/6g/gg.h
View file @
8877d27b
...
...
@@ -60,8 +60,6 @@ struct Sig
uint32
hash
;
int32
perm
;
int32
offset
;
int32
width
;
int32
elemalg
;
Sig
*
link
;
};
...
...
src/cmd/6g/obj.c
View file @
8877d27b
...
...
@@ -485,6 +485,7 @@ dumpsignatures(void)
x
->
dtype
=
d
->
dtype
;
x
->
forw
=
signatlist
;
signatlist
=
x
;
//print("SIG = %lS %lS %lT\n", d->dsym, s, t);
}
/*
...
...
@@ -585,8 +586,6 @@ dumpsignatures(void)
at
.
sym
->
name
+
5
,
f
->
sym
->
name
);
a
->
sym
=
lookup
(
namebuf
);
a
->
offset
=
0
;
a
->
elemalg
=
0
;
a
->
width
=
0
;
o
++
;
}
...
...
@@ -594,25 +593,38 @@ dumpsignatures(void)
a
=
lsort
(
a
,
sigcmp
);
ot
=
0
;
// first field of an interface signature
// contains the count and is not a real entry
// sigi[0].name = ""
ot
=
rnd
(
ot
,
maxround
);
// array of structures
p
=
pc
;
gins
(
ADATA
,
N
,
N
);
p
->
from
=
at
;
p
->
from
.
offset
=
ot
;
p
->
from
.
scale
=
widthptr
;
p
->
to
=
ao
;
p
->
to
.
offset
=
stringo
;
ot
+=
widthptr
;
datastring
(
""
,
1
);
if
(
et
==
TINTER
)
{
// first field of an interface signature
// contains the count and is not a real entry
o
=
0
;
for
(
b
=
a
;
b
!=
nil
;
b
=
b
->
link
)
o
++
;
// sigi[0].
name = ""
ot
=
rnd
(
ot
,
maxround
);
// array of structures
// sigi[0].
hash = 0
ot
=
rnd
(
ot
,
wi
);
p
=
pc
;
gins
(
ADATA
,
N
,
N
);
p
->
from
=
at
;
p
->
from
.
offset
=
ot
;
p
->
from
.
scale
=
wi
dthptr
;
p
->
to
=
a
o
;
p
->
to
.
offset
=
stringo
;
ot
+=
wi
dthptr
;
p
->
from
.
scale
=
wi
;
p
->
to
=
a
c
;
p
->
to
.
offset
=
0
;
ot
+=
wi
;
// sigi[0].
hash = 0
// sigi[0].
offset = count
ot
=
rnd
(
ot
,
wi
);
p
=
pc
;
gins
(
ADATA
,
N
,
N
);
...
...
@@ -620,10 +632,18 @@ dumpsignatures(void)
p
->
from
.
offset
=
ot
;
p
->
from
.
scale
=
wi
;
p
->
to
=
ac
;
p
->
to
.
offset
=
0
;
p
->
to
.
offset
=
o
;
ot
+=
wi
;
// sigi[0].offset = count
}
else
{
// first field of an type signature contains
// the element parameters and is not a real entry
t
=
d
->
dtype
;
if
(
t
->
methptr
&
2
)
t
=
types
[
tptr
];
// sigi[0].hash = elemalg
ot
=
rnd
(
ot
,
wi
);
p
=
pc
;
gins
(
ADATA
,
N
,
N
);
...
...
@@ -631,11 +651,23 @@ dumpsignatures(void)
p
->
from
.
offset
=
ot
;
p
->
from
.
scale
=
wi
;
p
->
to
=
ac
;
p
->
to
.
offset
=
o
;
p
->
to
.
offset
=
algtype
(
t
)
;
ot
+=
wi
;
datastring
(
""
,
1
);
// sigi[0].offset = width
ot
=
rnd
(
ot
,
wi
);
p
=
pc
;
gins
(
ADATA
,
N
,
N
);
p
->
from
=
at
;
p
->
from
.
offset
=
ot
;
p
->
from
.
scale
=
wi
;
p
->
to
=
ac
;
p
->
to
.
offset
=
t
->
width
;
ot
+=
wi
;
// skip the function
ot
=
rnd
(
ot
,
widthptr
);
ot
+=
widthptr
;
}
for
(
b
=
a
;
b
!=
nil
;
b
=
b
->
link
)
{
...
...
@@ -685,28 +717,6 @@ dumpsignatures(void)
p
->
to
.
offset
=
b
->
offset
;
ot
+=
wi
;
// sigt[++].width = type size
ot
=
rnd
(
ot
,
wi
);
p
=
pc
;
gins
(
ADATA
,
N
,
N
);
p
->
from
=
at
;
p
->
from
.
offset
=
ot
;
p
->
from
.
scale
=
wi
;
p
->
to
=
ac
;
p
->
to
.
offset
=
b
->
width
;
ot
+=
wi
;
// sigt[++].elemalg = type algorithm
ot
=
rnd
(
ot
,
wi
);
p
=
pc
;
gins
(
ADATA
,
N
,
N
);
p
->
from
=
at
;
p
->
from
.
offset
=
ot
;
p
->
from
.
scale
=
wi
;
p
->
to
=
ac
;
p
->
to
.
offset
=
b
->
elemalg
;
ot
+=
wi
;
// sigt[++].fun = &method
ot
=
rnd
(
ot
,
widthptr
);
p
=
pc
;
...
...
src/cmd/gc/go.h
View file @
8877d27b
...
...
@@ -122,7 +122,7 @@ struct Type
uchar
chan
;
uchar
recur
;
// to detect loops
uchar
trecur
;
// to detect loops
uchar
methptr
;
//
all methods are pointers to this type
uchar
methptr
;
//
1=direct 2=pointer
// TFUNCT
uchar
thistuple
;
...
...
src/cmd/gc/subr.c
View file @
8877d27b
...
...
@@ -1418,37 +1418,25 @@ signame(Type *t)
Sym
*
s
,
*
ss
;
char
*
e
;
loop:
if
(
t
==
T
)
{
// print("signame: nil type\n");
if
(
t
==
T
)
goto
bad
;
}
switch
(
t
->
etype
)
{
default:
e
=
"sigs"
;
break
;
case
TPTR32
:
case
TPTR64
:
t
=
t
->
type
;
goto
loop
;
case
TINTER
:
e
=
"sigi"
;
break
;
}
s
=
t
->
sym
;
if
(
s
==
S
)
{
// print("signame: no type name\n");
goto
bad
;
}
if
(
s
->
name
[
0
]
==
'_'
)
{
// print("signame: temp type name %S\n", s);
goto
bad
;
if
(
s
==
S
||
s
->
name
[
0
]
==
'_'
)
{
if
(
isptr
[
t
->
etype
])
{
t
=
t
->
type
;
if
(
t
==
T
)
goto
bad
;
}
s
=
t
->
sym
;
if
(
s
==
S
||
s
->
name
[
0
]
==
'_'
)
goto
bad
;
}
e
=
"sigt"
;
if
(
t
->
etype
==
TINTER
)
e
=
"sigi"
;
snprint
(
namebuf
,
sizeof
(
namebuf
),
"%s_%s"
,
e
,
s
->
name
);
ss
=
pkglookup
(
namebuf
,
s
->
opackage
);
if
(
ss
->
oname
==
N
)
{
...
...
src/runtime/iface.c
View file @
8877d27b
...
...
@@ -15,8 +15,6 @@ struct Sigt
byte
*
name
;
uint32
hash
;
uint32
offset
;
// offset of substruct
uint32
width
;
// width of type
uint32
elemalg
;
// algorithm of type
void
(
*
fun
)(
void
);
};
...
...
@@ -47,13 +45,10 @@ printsigi(Sigi *si)
sys
·
printpointer
(
si
);
prints
(
"{"
);
n
=
si
[
0
].
perm
;
// first entry has size
for
(
i
=
1
;
i
<
n
;
i
++
)
{
for
(
i
=
1
;;
i
++
)
{
name
=
si
[
i
].
name
;
if
(
name
==
nil
)
{
prints
(
"<nil>"
);
if
(
name
==
nil
)
break
;
}
prints
(
"["
);
sys
·
printint
(
i
);
prints
(
"]
\"
"
);
...
...
@@ -74,7 +69,10 @@ printsigt(Sigt *st)
sys
·
printpointer
(
st
);
prints
(
"{"
);
for
(
i
=
0
;;
i
++
)
{
sys
·
printint
(
st
[
0
].
hash
);
// first element has alg
prints
(
","
);
sys
·
printint
(
st
[
0
].
offset
);
// first element has width
for
(
i
=
1
;;
i
++
)
{
name
=
st
[
i
].
name
;
if
(
name
==
nil
)
break
;
...
...
@@ -86,10 +84,6 @@ printsigt(Sigt *st)
sys
·
printint
(
st
[
i
].
hash
%
999
);
prints
(
"/"
);
sys
·
printint
(
st
[
i
].
offset
);
prints
(
","
);
sys
·
printint
(
st
[
i
].
width
);
prints
(
","
);
sys
·
printint
(
st
[
i
].
elemalg
);
prints
(
"/"
);
sys
·
printpointer
(
st
[
i
].
fun
);
}
...
...
@@ -165,6 +159,7 @@ hashmap(Sigi *si, Sigt *st)
void
sys
·
ifaceT2I
(
Sigi
*
si
,
Sigt
*
st
,
void
*
elem
,
Map
*
retim
,
void
*
retit
)
{
// int32 alg, wid;
if
(
debug
)
{
prints
(
"T2I sigi="
);
...
...
@@ -177,7 +172,11 @@ sys·ifaceT2I(Sigi *si, Sigt *st, void *elem, Map *retim, void *retit)
}
retim
=
hashmap
(
si
,
st
);
retit
=
elem
;
// alg = st->hash;
// wid = st->offset;
// algarray[alg].copy(wid, &retit, &elem);
retit
=
elem
;
// for speed could do this
if
(
debug
)
{
prints
(
"T2I ret="
);
...
...
@@ -193,6 +192,7 @@ sys·ifaceT2I(Sigi *si, Sigt *st, void *elem, Map *retim, void *retit)
void
sys
·
ifaceI2T
(
Sigt
*
st
,
Map
*
im
,
void
*
it
,
void
*
ret
)
{
// int32 alg, wid;
if
(
debug
)
{
prints
(
"I2T sigt="
);
...
...
@@ -208,7 +208,11 @@ sys·ifaceI2T(Sigt *st, Map *im, void *it, void *ret)
if
(
im
->
sigt
!=
st
)
throw
(
"ifaceI2T: wrong type"
);
// alg = st->hash;
// wid = st->offset;
// algarray[alg].copy(wid, &ret, &it);
ret
=
it
;
if
(
debug
)
{
prints
(
"I2T ret="
);
sys
·
printpointer
(
ret
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment