Source file src/cmd/cgo/internal/testplugin/testdata/issue18676/main.go

     1  // Copyright 2017 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  // The bug happened like this:
     6  //  1. The main binary adds an itab for *json.UnsupportedValueError / error
     7  //     (concrete type / interface type).  This itab goes in hash bucket 0x111.
     8  //  2. The plugin adds that same itab again.  That makes a cycle in the itab
     9  //     chain rooted at hash bucket 0x111.
    10  //  3. The main binary then asks for the itab for *dynamodbstreamsevt.Event /
    11  //     json.Unmarshaler.  This itab happens to also live in bucket 0x111.
    12  //     The lookup code goes into an infinite loop searching for this itab.
    13  //
    14  // The code is carefully crafted so that the two itabs are both from the
    15  // same bucket, and so that the second itab doesn't exist in
    16  // the itab hashmap yet (so the entire linked list must be searched).
    17  package main
    18  
    19  import (
    20  	"encoding/json"
    21  	"plugin"
    22  	"testplugin/issue18676/dynamodbstreamsevt"
    23  )
    24  
    25  func main() {
    26  	plugin.Open("plugin.so")
    27  
    28  	var x interface{} = (*dynamodbstreamsevt.Event)(nil)
    29  	if _, ok := x.(json.Unmarshaler); !ok {
    30  		println("something")
    31  	}
    32  }
    33  

View as plain text