From ce552ff99de94b84e93da84007c0aad2e36bcbd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Tue, 21 Apr 2015 12:02:02 +0200 Subject: [PATCH] Should avoid unexpected error if trying to `tostring` a method that's now filtered out. Clearing out callback cache when a world is unloaded. --- src/main/scala/li/cil/oc/common/EventHandler.scala | 3 +++ src/main/scala/li/cil/oc/server/machine/Callbacks.scala | 6 ++++++ .../scala/li/cil/oc/server/machine/luac/ComponentAPI.scala | 2 +- .../scala/li/cil/oc/server/machine/luaj/ComponentAPI.scala | 2 +- 4 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/main/scala/li/cil/oc/common/EventHandler.scala b/src/main/scala/li/cil/oc/common/EventHandler.scala index 7d69d7126..28e8a5d8f 100644 --- a/src/main/scala/li/cil/oc/common/EventHandler.scala +++ b/src/main/scala/li/cil/oc/common/EventHandler.scala @@ -25,6 +25,7 @@ import li.cil.oc.common.tileentity.traits.power import li.cil.oc.integration.Mods import li.cil.oc.integration.util import li.cil.oc.server.component.Keyboard +import li.cil.oc.server.machine.Callbacks import li.cil.oc.server.machine.Machine import li.cil.oc.server.{PacketSender => ServerPacketSender} import li.cil.oc.util.ExtendedWorld._ @@ -357,6 +358,8 @@ object EventHandler { e.world.loadedEntityList.collect { case host: MachineHost => host.machine.stop() } + + Callbacks.clear() } } diff --git a/src/main/scala/li/cil/oc/server/machine/Callbacks.scala b/src/main/scala/li/cil/oc/server/machine/Callbacks.scala index c86f58f04..069a3048b 100644 --- a/src/main/scala/li/cil/oc/server/machine/Callbacks.scala +++ b/src/main/scala/li/cil/oc/server/machine/Callbacks.scala @@ -27,6 +27,12 @@ object Callbacks { case _ => cache.getOrElseUpdate(host.getClass, dynamicAnalyze(host)) } + // Clear the cache; used when world is unloaded, mostly to allow reacting to + // stuff (aka configs) that may influence which @Callbacks are enabled. + def clear(): Unit = { + cache.clear() + } + def fromClass(environment: Class[_]) = staticAnalyze(environment) private def dynamicAnalyze(host: Any) = { diff --git a/src/main/scala/li/cil/oc/server/machine/luac/ComponentAPI.scala b/src/main/scala/li/cil/oc/server/machine/luac/ComponentAPI.scala index 5d020153b..8c724ff7a 100644 --- a/src/main/scala/li/cil/oc/server/machine/luac/ComponentAPI.scala +++ b/src/main/scala/li/cil/oc/server/machine/luac/ComponentAPI.scala @@ -83,7 +83,7 @@ class ComponentAPI(owner: NativeLuaArchitecture) extends NativeLuaAPI(owner) { withComponent(lua.checkString(1), component => { val method = lua.checkString(2) val methods = machine.methods(component.host) - owner.documentation(() => methods(method).doc) + owner.documentation(() => Option(methods.get(method)).map(_.doc).orNull) }) }) lua.setField(-2, "doc") diff --git a/src/main/scala/li/cil/oc/server/machine/luaj/ComponentAPI.scala b/src/main/scala/li/cil/oc/server/machine/luaj/ComponentAPI.scala index 34cfbff2c..8dfe93e41 100644 --- a/src/main/scala/li/cil/oc/server/machine/luaj/ComponentAPI.scala +++ b/src/main/scala/li/cil/oc/server/machine/luaj/ComponentAPI.scala @@ -71,7 +71,7 @@ class ComponentAPI(owner: LuaJLuaArchitecture) extends LuaJAPI(owner) { withComponent(args.checkjstring(1), component => { val method = args.checkjstring(2) val methods = machine.methods(component.host) - owner.documentation(() => methods(method).doc) + owner.documentation(() => Option(methods.get(method)).map(_.doc).orNull) }) })