Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
K
k3s
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
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Jacklull
k3s
Commits
61cde636
Commit
61cde636
authored
Jul 08, 2016
by
Dr. Stefan Schimanski
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Switch to typeless generated deepcopy functions for less reflection
parent
6049623a
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
29 additions
and
16 deletions
+29
-16
deepcopy.go
cmd/libs/go2idl/deepcopy-gen/generators/deepcopy.go
+11
-3
cloner.go
pkg/conversion/cloner.go
+15
-10
scheme.go
pkg/runtime/scheme.go
+3
-3
No files found.
cmd/libs/go2idl/deepcopy-gen/generators/deepcopy.go
View file @
61cde636
...
@@ -204,6 +204,7 @@ func Packages(context *generator.Context, arguments *args.GeneratorArgs) generat
...
@@ -204,6 +204,7 @@ func Packages(context *generator.Context, arguments *args.GeneratorArgs) generat
const
(
const
(
apiPackagePath
=
"k8s.io/kubernetes/pkg/api"
apiPackagePath
=
"k8s.io/kubernetes/pkg/api"
conversionPackagePath
=
"k8s.io/kubernetes/pkg/conversion"
conversionPackagePath
=
"k8s.io/kubernetes/pkg/conversion"
runtimePackagePath
=
"k8s.io/kubernetes/pkg/runtime"
)
)
// genDeepCopy produces a file with autogenerated deep-copy functions.
// genDeepCopy produces a file with autogenerated deep-copy functions.
...
@@ -384,8 +385,10 @@ func (g *genDeepCopy) Init(c *generator.Context, w io.Writer) error {
...
@@ -384,8 +385,10 @@ func (g *genDeepCopy) Init(c *generator.Context, w io.Writer) error {
sw
.
Do
(
"if err := $.scheme|raw$.AddGeneratedDeepCopyFuncs(
\n
"
,
map
[
string
]
interface
{}{
sw
.
Do
(
"if err := $.scheme|raw$.AddGeneratedDeepCopyFuncs(
\n
"
,
map
[
string
]
interface
{}{
"scheme"
:
scheme
,
"scheme"
:
scheme
,
})
})
reflect
:=
c
.
Universe
.
Type
(
types
.
Name
{
Package
:
"reflect"
,
Name
:
"TypeOf"
})
for
_
,
t
:=
range
g
.
typesForInit
{
for
_
,
t
:=
range
g
.
typesForInit
{
sw
.
Do
(
fmt
.
Sprintf
(
"%s,
\n
"
,
g
.
funcNameTmpl
(
t
)),
argsFromType
(
t
))
g
.
imports
.
AddType
(
reflect
)
sw
.
Do
(
fmt
.
Sprintf
(
"conversion.GeneratedDeepCopyFunc{Fn: %s, InType: reflect.TypeOf(func() *$.type|raw$ {var x *$.type|raw$; return x}())},
\n
"
,
g
.
funcNameTmpl
(
t
)),
argsFromType
(
t
))
}
}
sw
.
Do
(
"); err != nil {
\n
"
,
nil
)
sw
.
Do
(
"); err != nil {
\n
"
,
nil
)
sw
.
Do
(
"// if one of the deep copy functions is malformed, detect it immediately.
\n
"
,
nil
)
sw
.
Do
(
"// if one of the deep copy functions is malformed, detect it immediately.
\n
"
,
nil
)
...
@@ -425,10 +428,11 @@ func (g *genDeepCopy) GenerateType(c *generator.Context, t *types.Type, w io.Wri
...
@@ -425,10 +428,11 @@ func (g *genDeepCopy) GenerateType(c *generator.Context, t *types.Type, w io.Wri
sw
:=
generator
.
NewSnippetWriter
(
w
,
c
,
"$"
,
"$"
)
sw
:=
generator
.
NewSnippetWriter
(
w
,
c
,
"$"
,
"$"
)
funcName
:=
g
.
funcNameTmpl
(
t
)
funcName
:=
g
.
funcNameTmpl
(
t
)
sw
.
Do
(
fmt
.
Sprintf
(
"func %s(in *$.type|raw$, out *$.type|raw$, c *$.Cloner|raw$) error {
\n
"
,
funcName
),
g
.
withGlobals
(
argsFromType
(
t
)))
sw
.
Do
(
fmt
.
Sprintf
(
"func %s(in interface{}, out interface{}, c *$.Cloner|raw$) error {{
\n
"
,
funcName
),
g
.
withGlobals
(
argsFromType
(
t
)))
sw
.
Do
(
"in := in.(*$.type|raw$)
\n
out := out.(*$.type|raw$)
\n
"
,
g
.
withGlobals
(
argsFromType
(
t
)))
g
.
generateFor
(
t
,
sw
)
g
.
generateFor
(
t
,
sw
)
sw
.
Do
(
"return nil
\n
"
,
nil
)
sw
.
Do
(
"return nil
\n
"
,
nil
)
sw
.
Do
(
"}
\n\n
"
,
nil
)
sw
.
Do
(
"}
}
\n\n
"
,
nil
)
return
sw
.
Error
()
return
sw
.
Error
()
}
}
...
@@ -531,6 +535,10 @@ func (g *genDeepCopy) doSlice(t *types.Type, sw *generator.SnippetWriter) {
...
@@ -531,6 +535,10 @@ func (g *genDeepCopy) doSlice(t *types.Type, sw *generator.SnippetWriter) {
}
}
func
(
g
*
genDeepCopy
)
doStruct
(
t
*
types
.
Type
,
sw
*
generator
.
SnippetWriter
)
{
func
(
g
*
genDeepCopy
)
doStruct
(
t
*
types
.
Type
,
sw
*
generator
.
SnippetWriter
)
{
if
len
(
t
.
Members
)
==
0
{
// at least do something with in/out to avoid "declared and not used" errors
sw
.
Do
(
"_ = in
\n
_ = out
\n
"
,
nil
)
}
for
_
,
m
:=
range
t
.
Members
{
for
_
,
m
:=
range
t
.
Members
{
t
:=
m
.
Type
t
:=
m
.
Type
if
t
.
Kind
==
types
.
Alias
{
if
t
.
Kind
==
types
.
Alias
{
...
...
pkg/conversion/cloner.go
View file @
61cde636
...
@@ -25,14 +25,14 @@ import (
...
@@ -25,14 +25,14 @@ import (
type
Cloner
struct
{
type
Cloner
struct
{
// Map from the type to a function which can do the deep copy.
// Map from the type to a function which can do the deep copy.
deepCopyFuncs
map
[
reflect
.
Type
]
reflect
.
Value
deepCopyFuncs
map
[
reflect
.
Type
]
reflect
.
Value
generatedDeepCopyFuncs
map
[
reflect
.
Type
]
reflect
.
Value
generatedDeepCopyFuncs
map
[
reflect
.
Type
]
func
(
in
interface
{},
out
interface
{},
c
*
Cloner
)
error
}
}
// NewCloner creates a new Cloner object.
// NewCloner creates a new Cloner object.
func
NewCloner
()
*
Cloner
{
func
NewCloner
()
*
Cloner
{
c
:=
&
Cloner
{
c
:=
&
Cloner
{
deepCopyFuncs
:
map
[
reflect
.
Type
]
reflect
.
Value
{},
deepCopyFuncs
:
map
[
reflect
.
Type
]
reflect
.
Value
{},
generatedDeepCopyFuncs
:
map
[
reflect
.
Type
]
reflect
.
Value
{},
generatedDeepCopyFuncs
:
map
[
reflect
.
Type
]
func
(
in
interface
{},
out
interface
{},
c
*
Cloner
)
error
{},
}
}
if
err
:=
c
.
RegisterDeepCopyFunc
(
byteSliceDeepCopy
);
err
!=
nil
{
if
err
:=
c
.
RegisterDeepCopyFunc
(
byteSliceDeepCopy
);
err
!=
nil
{
// If one of the deep-copy functions is malformed, detect it immediately.
// If one of the deep-copy functions is malformed, detect it immediately.
...
@@ -103,15 +103,17 @@ func (c *Cloner) RegisterDeepCopyFunc(deepCopyFunc interface{}) error {
...
@@ -103,15 +103,17 @@ func (c *Cloner) RegisterDeepCopyFunc(deepCopyFunc interface{}) error {
return
nil
return
nil
}
}
// GeneratedDeepCopyFunc bundles an untyped generated deep-copy function of a type
// with a reflection type object used as a key to lookup the deep-copy function.
type
GeneratedDeepCopyFunc
struct
{
Fn
func
(
in
interface
{},
out
interface
{},
c
*
Cloner
)
error
InType
reflect
.
Type
}
// Similar to RegisterDeepCopyFunc, but registers deep copy function that were
// Similar to RegisterDeepCopyFunc, but registers deep copy function that were
// automatically generated.
// automatically generated.
func
(
c
*
Cloner
)
RegisterGeneratedDeepCopyFunc
(
deepCopyFunc
interface
{})
error
{
func
(
c
*
Cloner
)
RegisterGeneratedDeepCopyFunc
(
fn
GeneratedDeepCopyFunc
)
error
{
fv
:=
reflect
.
ValueOf
(
deepCopyFunc
)
c
.
generatedDeepCopyFuncs
[
fn
.
InType
]
=
fn
.
Fn
ft
:=
fv
.
Type
()
if
err
:=
verifyDeepCopyFunctionSignature
(
ft
);
err
!=
nil
{
return
err
}
c
.
generatedDeepCopyFuncs
[
ft
.
In
(
0
)]
=
fv
return
nil
return
nil
}
}
...
@@ -146,7 +148,10 @@ func (c *Cloner) deepCopy(src reflect.Value) (reflect.Value, error) {
...
@@ -146,7 +148,10 @@ func (c *Cloner) deepCopy(src reflect.Value) (reflect.Value, error) {
return
c
.
customDeepCopy
(
src
,
fv
)
return
c
.
customDeepCopy
(
src
,
fv
)
}
}
if
fv
,
ok
:=
c
.
generatedDeepCopyFuncs
[
inType
];
ok
{
if
fv
,
ok
:=
c
.
generatedDeepCopyFuncs
[
inType
];
ok
{
return
c
.
customDeepCopy
(
src
,
fv
)
var
outValue
reflect
.
Value
outValue
=
reflect
.
New
(
inType
.
Elem
())
err
:=
fv
(
src
.
Interface
(),
outValue
.
Interface
(),
c
)
return
outValue
,
err
}
}
return
c
.
defaultDeepCopy
(
src
)
return
c
.
defaultDeepCopy
(
src
)
}
}
...
...
pkg/runtime/scheme.go
View file @
61cde636
...
@@ -357,9 +357,9 @@ func (s *Scheme) AddDeepCopyFuncs(deepCopyFuncs ...interface{}) error {
...
@@ -357,9 +357,9 @@ func (s *Scheme) AddDeepCopyFuncs(deepCopyFuncs ...interface{}) error {
// Similar to AddDeepCopyFuncs, but registers deep-copy functions that were
// Similar to AddDeepCopyFuncs, but registers deep-copy functions that were
// automatically generated.
// automatically generated.
func
(
s
*
Scheme
)
AddGeneratedDeepCopyFuncs
(
deepCopyFuncs
...
interface
{}
)
error
{
func
(
s
*
Scheme
)
AddGeneratedDeepCopyFuncs
(
deepCopyFuncs
...
conversion
.
GeneratedDeepCopyFunc
)
error
{
for
_
,
f
:=
range
deepCopyFuncs
{
for
_
,
f
n
:=
range
deepCopyFuncs
{
if
err
:=
s
.
cloner
.
RegisterGeneratedDeepCopyFunc
(
f
);
err
!=
nil
{
if
err
:=
s
.
cloner
.
RegisterGeneratedDeepCopyFunc
(
f
n
);
err
!=
nil
{
return
err
return
err
}
}
}
}
...
...
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