aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Pike <r@golang.org>2011-06-29 13:44:13 +1000
committerRob Pike <r@golang.org>2011-06-29 13:44:13 +1000
commita733f0bcd11e33e9dde58034dd8bcc0461f68d56 (patch)
tree09a28d254664284ba0acff95794487898f4647ef
parent22484e226290c45bb4ff3d85ac5ac9f9818ae5b3 (diff)
downloadgo-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/Makefile1
-rw-r--r--src/pkg/exp/template/exec.go16
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)