Skip to content

Commit

Permalink
fix: do not pass twice the receiver in deferred method calls
Browse files Browse the repository at this point in the history
  • Loading branch information
mvertes committed Mar 23, 2020
1 parent 4a22635 commit 0a99eb4
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 0 deletions.
59 changes: 59 additions & 0 deletions _test/cli2.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package main

import (
"fmt"
"io/ioutil"
"log"
"net"
"net/http"
)

type T struct {
ln net.Listener
}

func (t *T) Close() {
t.ln.Close()
}

func client(uri string) {
resp, err := http.Get(uri)
if err != nil {
log.Fatal(err)
}
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Println(string(body))
}

func server(ln net.Listener, ready chan bool) {
http.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) {
var r1 *http.Request = r
fmt.Fprintln(w, "Welcome to my website!", r1.RequestURI)
})

go http.Serve(ln, nil)
ready <- true
}

func main() {
ln, err := net.Listen("tcp", "localhost:0")
t := &T{ln}
if err != nil {
log.Fatal(err)
}
defer t.Close()
// defer ln.Close()

ready := make(chan bool)
go server(ln, ready)
<-ready

client(fmt.Sprintf("http://%s/hello", ln.Addr().String()))
http.DefaultServeMux = &http.ServeMux{}
}

// Output:
// Welcome to my website! /hello
4 changes: 4 additions & 0 deletions interp/run.go
Original file line number Diff line number Diff line change
Expand Up @@ -669,6 +669,10 @@ func call(n *node) {
if n.anc.kind == deferStmt {
// Store function call in frame for deferred execution.
value = genFunctionWrapper(n.child[0])
if method {
// The receiver is already passed in the function wrapper, skip it.
values = values[1:]
}
n.exec = func(f *frame) bltn {
val := make([]reflect.Value, len(values)+1)
val[0] = value(f)
Expand Down

0 comments on commit 0a99eb4

Please sign in to comment.