@@ -108,7 +108,9 @@ func ImportModuleLevelObject(ctx Context, name string, globals, locals StringDic
108108 }
109109
110110 if fromFile , ok := globals ["__file__" ]; ok {
111- opts .CurDir = filepath .Dir (string (fromFile .(String )))
111+ if fromFileStr , ok := fromFile .(String ); ok {
112+ opts .CurDir = filepath .Dir (string (fromFileStr ))
113+ }
112114 }
113115
114116 module , err := RunFile (ctx , srcPathname , opts , name )
@@ -344,14 +346,42 @@ func BuiltinImport(ctx Context, self Object, args Tuple, kwargs StringDict, curr
344346 var globals Object = currentGlobal
345347 var locals Object = NewStringDict ()
346348 var fromlist Object = Tuple {}
349+ var fromlistTuple Tuple
347350 var level Object = Int (0 )
348351
349352 err := ParseTupleAndKeywords (args , kwargs , "U|OOOi:__import__" , kwlist , & name , & globals , & locals , & fromlist , & level )
350353 if err != nil {
351354 return nil , err
352355 }
353- if fromlist == None {
354- fromlist = Tuple {}
356+ levelObj , ok := level .(Int )
357+ if ! ok {
358+ return nil , ExceptionNewf (TypeError , "__import__() argument 5 must be int, not %s" , level .Type ().Name )
359+ }
360+ levelInt , err := levelObj .GoInt ()
361+ if err != nil {
362+ return nil , err
363+ }
364+
365+ globalsDict , ok := globals .(StringDict )
366+ if ! ok {
367+ if levelInt > 0 {
368+ return nil , ExceptionNewf (TypeError , "globals must be a dict" )
369+ }
370+ globalsDict = StringDict {}
355371 }
356- return ImportModuleLevelObject (ctx , string (name .(String )), globals .(StringDict ), locals .(StringDict ), fromlist .(Tuple ), int (level .(Int )))
372+
373+ localsDict , ok := locals .(StringDict )
374+ if ! ok {
375+ localsDict = StringDict {}
376+ }
377+
378+ fromlistTuple = Tuple {}
379+ if fromlist != None {
380+ fromlistTuple , err = SequenceTuple (fromlist )
381+ if err != nil {
382+ return nil , err
383+ }
384+ }
385+
386+ return ImportModuleLevelObject (ctx , string (name .(String )), globalsDict , localsDict , fromlistTuple , levelInt )
357387}
0 commit comments