]> Cypherpunks repositories - gostls13.git/commitdiff
exp/template: use MethodByName, add to build.
authorRob Pike <r@golang.org>
Wed, 29 Jun 2011 03:44:13 +0000 (13:44 +1000)
committerRob Pike <r@golang.org>
Wed, 29 Jun 2011 03:44:13 +0000 (13:44 +1000)
R=rsc, adg, r
CC=golang-dev
https://golang.org/cl/4641081

src/pkg/Makefile
src/pkg/exp/template/exec.go

index f18dc1f9b380377076fe449f6a61f3cb9ebe354a..ca6dcea9bcc6b8a36c1ed93d0678ce2eeda0b020 100644 (file)
@@ -82,6 +82,7 @@ DIRS=\
        exp/gui\
        exp/gui/x11\
        exp/regexp/syntax\
+       exp/template\
        expvar\
        flag\
        fmt\
index 2fbe3050775717d1952ab003f226ef3d7a2f4545..c097c20a87907456abda8be8ed9ee3a67fbb16e9 100644 (file)
@@ -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)