
* proc: support nested function calls Changes the code in fncall.go to support nested function calls. This changes delays argument evaluation until after we have used the call injection protocol to allocate an argument frame. When evaluating the parse tree of an expression we'll initiate each function call we find on the way down and then complete the function call on the way up. For example. in: f(g(x)) we will: 1. initiate the call injection protocol for f(...) 2. progress it until the point where we have space for the arguments of 'f' (i.e. when we receive the debugCallAXCompleteCall message from the target runtime) 3. inititate the call injection protocol for g(...) 4. progress it until the point where we have space for the arguments of 'g' 5. copy the value of x into the argument frame of 'g' 6. finish the call to g(...) 7. copy the return value of g(x) into the argument frame of 'f' 8. finish the call to f(...) Updates #119 * proc: bugfix: closure addr was wrong for non-closure functions
144 lines
2.7 KiB
Go
144 lines
2.7 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"runtime"
|
|
"strings"
|
|
)
|
|
|
|
func callstacktrace() (stacktrace string) {
|
|
for skip := 0; ; skip++ {
|
|
pc, file, line, ok := runtime.Caller(skip)
|
|
if !ok {
|
|
break
|
|
}
|
|
fn := runtime.FuncForPC(pc)
|
|
stacktrace += fmt.Sprintf("in %s at %s:%d\n", fn.Name(), file, line)
|
|
}
|
|
return stacktrace
|
|
}
|
|
|
|
func call1(a, b int) int {
|
|
fmt.Printf("first: %d second: %d\n", a, b)
|
|
return a + b
|
|
}
|
|
|
|
func callpanic() {
|
|
fmt.Printf("about to panic\n")
|
|
panic("callpanic panicked")
|
|
}
|
|
|
|
func stringsJoin(v []string, sep string) string {
|
|
// This is needed because strings.Join is in an optimized package and
|
|
// because of a bug in the compiler arguments of optimized functions don't
|
|
// have a location.
|
|
return strings.Join(v, sep)
|
|
}
|
|
|
|
type astruct struct {
|
|
X int
|
|
}
|
|
|
|
type a2struct struct {
|
|
Y int
|
|
}
|
|
|
|
func (a astruct) VRcvr(x int) string {
|
|
return fmt.Sprintf("%d + %d = %d", x, a.X, x+a.X)
|
|
}
|
|
|
|
func (pa *astruct) PRcvr(x int) string {
|
|
return fmt.Sprintf("%d - %d = %d", x, pa.X, x-pa.X)
|
|
}
|
|
|
|
type PRcvrable interface {
|
|
PRcvr(int) string
|
|
}
|
|
|
|
type VRcvrable interface {
|
|
VRcvr(int) string
|
|
}
|
|
|
|
var zero = 0
|
|
|
|
func makeclos(pa *astruct) func(int) string {
|
|
i := 0
|
|
return func(x int) string {
|
|
i++
|
|
return fmt.Sprintf("%d + %d + %d = %d", i, pa.X, x, i+pa.X+x)
|
|
}
|
|
}
|
|
|
|
var ga astruct
|
|
var globalPA2 *a2struct
|
|
|
|
func escapeArg(pa2 *a2struct) {
|
|
globalPA2 = pa2
|
|
}
|
|
|
|
func square(x int) int {
|
|
return x * x
|
|
}
|
|
|
|
func intcallpanic(a int) int {
|
|
if a == 0 {
|
|
panic("panic requested")
|
|
}
|
|
return a
|
|
}
|
|
|
|
func onetwothree(n int) []int {
|
|
return []int{n + 1, n + 2, n + 3}
|
|
}
|
|
|
|
func curriedAdd(n int) func(int) int {
|
|
return func(m int) int {
|
|
return n + m
|
|
}
|
|
}
|
|
|
|
func getAStruct(n int) astruct {
|
|
return astruct{X: n}
|
|
}
|
|
|
|
func getAStructPtr(n int) *astruct {
|
|
return &astruct{X: n}
|
|
}
|
|
|
|
func getVRcvrableFromAStruct(n int) VRcvrable {
|
|
return astruct{X: n}
|
|
}
|
|
|
|
func getPRcvrableFromAStructPtr(n int) PRcvrable {
|
|
return &astruct{X: n}
|
|
}
|
|
|
|
func getVRcvrableFromAStructPtr(n int) VRcvrable {
|
|
return &astruct{X: n}
|
|
}
|
|
|
|
func main() {
|
|
one, two := 1, 2
|
|
intslice := []int{1, 2, 3}
|
|
stringslice := []string{"one", "two", "three"}
|
|
comma := ","
|
|
a := astruct{X: 3}
|
|
pa := &astruct{X: 6}
|
|
a2 := a2struct{Y: 7}
|
|
|
|
var vable_a VRcvrable = a
|
|
var vable_pa VRcvrable = pa
|
|
var pable_pa PRcvrable = pa
|
|
|
|
fn2clos := makeclos(pa)
|
|
fn2glob := call1
|
|
fn2valmeth := pa.VRcvr
|
|
fn2ptrmeth := pa.PRcvr
|
|
var fn2nil func()
|
|
|
|
runtime.Breakpoint()
|
|
call1(one, two)
|
|
fn2clos(2)
|
|
fmt.Println(one, two, zero, callpanic, callstacktrace, stringsJoin, intslice, stringslice, comma, a.VRcvr, a.PRcvr, pa, vable_a, vable_pa, pable_pa, fn2clos, fn2glob, fn2valmeth, fn2ptrmeth, fn2nil, ga, escapeArg, a2, square, intcallpanic, onetwothree, curriedAdd, getAStruct, getAStructPtr, getVRcvrableFromAStruct, getPRcvrableFromAStructPtr, getVRcvrableFromAStructPtr)
|
|
}
|