github.com/hirochachacha/plua@v0.0.0-20170217012138-c82f520cc725/runtime/util.go (about)

     1  package runtime
     2  
     3  import "github.com/hirochachacha/plua/object"
     4  
     5  // for debug
     6  func (th *thread) getFuncName(fn object.Value) string {
     7  	loaded := th.Loaded()
     8  
     9  	var key object.Value
    10  	var val object.Value
    11  	for {
    12  		key, val, _ = loaded.Next(key)
    13  		if val == nil {
    14  			break
    15  		}
    16  
    17  		if modname, ok := key.(object.String); ok {
    18  			if module, ok := val.(object.Table); ok {
    19  				var mkey object.Value
    20  				var mval object.Value
    21  				for {
    22  					mkey, mval, _ = module.Next(mkey)
    23  					if mval == nil {
    24  						break
    25  					}
    26  
    27  					if fname, ok := mkey.(object.String); ok {
    28  						if object.Equal(mval, fn) {
    29  							if modname == "_G" {
    30  								return string(fname)
    31  							}
    32  							return string(modname) + "." + string(fname)
    33  						}
    34  					}
    35  				}
    36  			}
    37  		}
    38  	}
    39  
    40  	return "?"
    41  }