|  | // Copyright 2014 The Go Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style | 
|  | // license that can be found in the LICENSE file. | 
|  |  | 
|  | // +build ignore | 
|  |  | 
|  | // Generate Windows callback assembly file. | 
|  |  | 
|  | package main | 
|  |  | 
|  | import ( | 
|  | "bytes" | 
|  | "fmt" | 
|  | "io/ioutil" | 
|  | "os" | 
|  | ) | 
|  |  | 
|  | const maxCallback = 2000 | 
|  |  | 
|  | func genasm() { | 
|  | var buf bytes.Buffer | 
|  |  | 
|  | buf.WriteString(`// generated by wincallback.go; run go generate | 
|  |  | 
|  | // runtime·callbackasm is called by external code to | 
|  | // execute Go implemented callback function. It is not | 
|  | // called from the start, instead runtime·compilecallback | 
|  | // always returns address into runtime·callbackasm offset | 
|  | // appropriately so different callbacks start with different | 
|  | // CALL instruction in runtime·callbackasm. This determines | 
|  | // which Go callback function is executed later on. | 
|  | TEXT runtime·callbackasm(SB),7,$0 | 
|  | `) | 
|  | for i := 0; i < maxCallback; i++ { | 
|  | buf.WriteString("\tCALL\truntime·callbackasm1(SB)\n") | 
|  | } | 
|  |  | 
|  | err := ioutil.WriteFile("zcallback_windows.s", buf.Bytes(), 0666) | 
|  | if err != nil { | 
|  | fmt.Fprintf(os.Stderr, "wincallback: %s\n", err) | 
|  | os.Exit(2) | 
|  | } | 
|  | } | 
|  |  | 
|  | func gengo() { | 
|  | var buf bytes.Buffer | 
|  |  | 
|  | buf.WriteString(fmt.Sprintf(`// generated by wincallback.go; run go generate | 
|  |  | 
|  | package runtime | 
|  |  | 
|  | const cb_max = %d // maximum number of windows callbacks allowed | 
|  | `, maxCallback)) | 
|  | err := ioutil.WriteFile("zcallback_windows.go", buf.Bytes(), 0666) | 
|  | if err != nil { | 
|  | fmt.Fprintf(os.Stderr, "wincallback: %s\n", err) | 
|  | os.Exit(2) | 
|  | } | 
|  | } | 
|  |  | 
|  | func main() { | 
|  | genasm() | 
|  | gengo() | 
|  | } |