diff options
author | Rob Pike <r@golang.org> | 2011-06-29 13:44:13 +1000 |
---|---|---|
committer | Rob Pike <r@golang.org> | 2011-06-29 13:44:13 +1000 |
commit | a733f0bcd11e33e9dde58034dd8bcc0461f68d56 (patch) | |
tree | 09a28d254664284ba0acff95794487898f4647ef | |
parent | 22484e226290c45bb4ff3d85ac5ac9f9818ae5b3 (diff) | |
download | go-a733f0bcd11e33e9dde58034dd8bcc0461f68d56.tar.gz go-a733f0bcd11e33e9dde58034dd8bcc0461f68d56.zip |
exp/template: use MethodByName, add to build.
R=rsc, adg, r
CC=golang-dev
https://golang.org/cl/4641081
-rw-r--r-- | src/pkg/Makefile | 1 | ||||
-rw-r--r-- | src/pkg/exp/template/exec.go | 16 |
2 files changed, 5 insertions, 12 deletions
diff --git a/src/pkg/Makefile b/src/pkg/Makefile index f18dc1f9b3..ca6dcea9bc 100644 --- a/src/pkg/Makefile +++ b/src/pkg/Makefile @@ -82,6 +82,7 @@ DIRS=\ exp/gui\ exp/gui/x11\ exp/regexp/syntax\ + exp/template\ expvar\ flag\ fmt\ diff --git a/src/pkg/exp/template/exec.go b/src/pkg/exp/template/exec.go index 2fbe305077..c097c20a87 100644 --- a/src/pkg/exp/template/exec.go +++ b/src/pkg/exp/template/exec.go @@ -134,10 +134,7 @@ func (s *state) evalFieldNode(data reflect.Value, field *fieldNode, args []node, } func (s *state) evalField(data reflect.Value, fieldName string) reflect.Value { - for { - if data.Kind() != reflect.Ptr { - break - } + for data.Kind() == reflect.Ptr { data = reflect.Indirect(data) } switch data.Kind() { @@ -162,12 +159,8 @@ func (s *state) evalMethodOrField(data reflect.Value, fieldName string, args []n ptr, data = data, reflect.Indirect(data) } // Is it a method? We use the pointer because it has value methods too. - // TODO: reflect.Type could use a MethodByName. - for i := 0; i < ptr.Type().NumMethod(); i++ { - method := ptr.Type().Method(i) - if method.Name == fieldName { - return s.evalMethod(ptr, i, args, final) - } + if method, ok := ptr.Type().MethodByName(fieldName); ok { + return s.evalMethod(ptr, method, args, final) } if len(args) > 1 || final.IsValid() { s.errorf("%s is not a method but has arguments", fieldName) @@ -185,8 +178,7 @@ var ( osErrorType = reflect.TypeOf(new(os.Error)).Elem() ) -func (s *state) evalMethod(v reflect.Value, i int, args []node, final reflect.Value) reflect.Value { - method := v.Type().Method(i) +func (s *state) evalMethod(v reflect.Value, method reflect.Method, args []node, final reflect.Value) reflect.Value { typ := method.Type fun := method.Func numIn := len(args) |