func (self *Environment) findCachedClass(klass types.Name) (c *Class, err error) { if class, ok := self.classes[klass.AsPath()]; ok { c = class } else { err = errors.New("cache miss") } return }
// returns a Class object; the object will first be looked up in cache, // and if not found there, resolved via Java and stored in the cache path. // classes returned via /THIS/ channel, need not be unrefed, as they all // hold a global ref. // // TODO: in truth, they should probably ALL be local-refs of the cached one... func (self *Environment) GetClass(klass types.Name) (c *Class, err error) { c, err = self.findCachedClass(klass) if err == nil { return } s := C.CString(klass.AsPath()) defer C.free(unsafe.Pointer(s)) // print("envFindClass ", klass,"\n") kl := C.envFindClass(self.env, s) if kl == nil { //print("GetClass missed ", klass.AsPath(), "\n\n") err = self.ExceptionOccurred() } else { err = nil // clear the cache error //print("found ", klass,"\n") kl = C.jclass(C.envNewGlobalRef(self.env, kl)) c = newClass(kl) self.classes[klass.AsPath()] = c } return }