yaegi icon indicating copy to clipboard operation
yaegi copied to clipboard

Interface conversion panic when import a package

Open JalinWang opened this issue 2 years ago • 0 comments

The following program sample.go triggers an unexpected result

package main

import (
	"github.com/casbin/casbin/v2"
)

func main() {
	e, err := casbin.NewEnforcer("./examples/rbac_with_pattern_model.conf", "./examples/rbac_with_pattern_policy.csv")
	if err != nil {
		panic(err)
	}
	// e := &Enforcer{logger: &log.DefaultLogger{}}
	println(e)
}

Expected result

$ go run main.go
0xc000024080

Got

$ yaegi.exe run github.com\casbin\main
E:\Programming\GO_PATH\src\github.com\casbin\main\vendor\github.com\casbin\casbin\v2\enforcer.go:75:26: panic
E:\Programming\GO_PATH\src\github.com\casbin\main\main.go:33:12: panic
panic: interface conversion: interface {} is nil, not map[string]map[string]*struct { Key string; Value string; Tokens []string; Policy [][]string; PolicyMap map[string]int; RM interface {}; FieldIndexMap map[string]int; Xlogger interface {} } [recovered]
        panic: interface conversion: interface {} is nil, not map[string]map[string]*struct { Key string; Value string; Tokens []string; Policy [][]string; PolicyMap map[string]int; RM interface {}; FieldIndexMap map[string]int; Xlogger interface {} } [recovered]
        panic: interface conversion: interface {} is nil, not map[string]map[string]*struct { Key string; Value string; Tokens []string; Policy [][]string; PolicyMap map[string]int; RM interface {}; FieldIndexMap map[string]int; Xlogger interface {} }

goroutine 1 [running]:
github.com/traefik/yaegi/interp.runCfg.func1()
        E:/Programming/GO_PATH/pkg/mod/github.com/traefik/[email protected]/interp/run.go:192 +0x145
panic({0x135ee00, 0xc001eb1080})
        D:/Programming/Go/src/runtime/panic.go:838 +0x207
github.com/traefik/yaegi/interp.runCfg.func1()
        E:/Programming/GO_PATH/pkg/mod/github.com/traefik/[email protected]/interp/run.go:192 +0x145
panic({0x135ee00, 0xc001eb1080})
        D:/Programming/Go/src/runtime/panic.go:838 +0x207
github.com/traefik/yaegi/interp.typeAssert.func3(0xc001ea09a0)
        E:/Programming/GO_PATH/pkg/mod/github.com/traefik/[email protected]/interp/run.go:438 +0x639
github.com/traefik/yaegi/interp.runCfg(0xc0000b4a20, 0xc001ea09a0, 0xc001eb3560?, 0x1354640?)
        E:/Programming/GO_PATH/pkg/mod/github.com/traefik/[email protected]/interp/run.go:200 +0x29d
github.com/traefik/yaegi/interp.call.func9(0xc001ea08f0)
        E:/Programming/GO_PATH/pkg/mod/github.com/traefik/[email protected]/interp/run.go:1433 +0x94a
github.com/traefik/yaegi/interp.runCfg(0xc001eb3680, 0xc001ea08f0, 0xc001eb2b40?, 0xc0012eb7f8?)
        E:/Programming/GO_PATH/pkg/mod/github.com/traefik/[email protected]/interp/run.go:200 +0x29d
github.com/traefik/yaegi/interp.(*Interpreter).run(0xc00037a000, 0xc001eb2b40, 0xc00037c000?)
        E:/Programming/GO_PATH/pkg/mod/github.com/traefik/[email protected]/interp/run.go:119 +0x374
github.com/traefik/yaegi/interp.(*Interpreter).importSrc(0xc00037a000, {0x147d580, 0x4}, {0xc00002a2b8, 0x16}, 0x1)
        E:/Programming/GO_PATH/pkg/mod/github.com/traefik/[email protected]/interp/src.go:168 +0xb52
github.com/traefik/yaegi/interp.(*Interpreter).EvalPath(0xc00037a000, {0xc00002a2b8, 0x16})
        E:/Programming/GO_PATH/pkg/mod/github.com/traefik/[email protected]/interp/interp.go:504 +0xdb
main.run({0xc00007e060?, 0x1, 0x2})
        E:/Programming/GO_PATH/pkg/mod/github.com/traefik/[email protected]/cmd/yaegi/run.go:118 +0xc0b
main.main()
        E:/Programming/GO_PATH/pkg/mod/github.com/traefik/[email protected]/cmd/yaegi/yaegi.go:133 +0xd4

Yaegi Version

0.13

Additional Notes

It shows the error counter at this line in the package: image

However, after I copy the related code into my main.go, it works.

image

package main

import (
	"github.com/casbin/casbin/v2/effector"
	"github.com/casbin/casbin/v2/log"
	"github.com/casbin/casbin/v2/model"
	"github.com/casbin/casbin/v2/persist"
	"github.com/casbin/casbin/v2/rbac"
)

type Enforcer struct {
	modelPath string
	model     model.Model
	fm        model.FunctionMap
	eft       effector.Effector

	adapter    persist.Adapter
	watcher    persist.Watcher
	dispatcher persist.Dispatcher
	rmMap      map[string]rbac.RoleManager

	enabled              bool
	autoSave             bool
	autoBuildRoleLinks   bool
	autoNotifyWatcher    bool
	autoNotifyDispatcher bool

	logger log.Logger
}

func main() {
	// e, err := casbin.NewEnforcer("./examples/rbac_with_pattern_model.conf", "./examples/rbac_with_pattern_policy.csv")
	// if err != nil {
	// 	panic(err)
	// }
	e := &Enforcer{logger: &log.DefaultLogger{}}
	println(e)
}

JalinWang avatar Jul 05 '22 13:07 JalinWang