From 2e314998c97b9f5abd05e2b624399d742397728b Mon Sep 17 00:00:00 2001 From: payonel Date: Tue, 4 Jun 2019 01:01:56 -0700 Subject: [PATCH] allow signals of tables of simple key value types closes #3074 --- .../li/cil/oc/server/machine/Machine.scala | 40 ++++++++++++++----- 1 file changed, 29 insertions(+), 11 deletions(-) diff --git a/src/main/scala/li/cil/oc/server/machine/Machine.scala b/src/main/scala/li/cil/oc/server/machine/Machine.scala index a19d02d16..691490e19 100644 --- a/src/main/scala/li/cil/oc/server/machine/Machine.scala +++ b/src/main/scala/li/cil/oc/server/machine/Machine.scala @@ -309,6 +309,21 @@ class Machine(val host: MachineHost) extends AbstractManagedEnvironment with mac } } + def convertArg(param: Any): AnyRef = { + param match { + case arg: java.lang.Boolean => arg + case arg: java.lang.Character => Double.box(arg.toDouble) + case arg: java.lang.Long => arg + case arg: java.lang.Number => Double.box(arg.doubleValue) + case arg: java.lang.String => arg + case arg: Array[Byte] => arg + case arg: NBTTagCompound => arg + case arg => + OpenComputers.log.warn("Trying to push signal with an unsupported argument of type " + arg.getClass.getName) + null + } + } + override def signal(name: String, args: AnyRef*): Boolean = { state.synchronized(state.top match { case Machine.State.Stopped | Machine.State.Stopping => return false @@ -320,19 +335,22 @@ class Machine(val host: MachineHost) extends AbstractManagedEnvironment with mac else { signals.enqueue(new Machine.Signal(name, args.map { case null | Unit | None => null - case arg: java.lang.Boolean => arg - case arg: java.lang.Character => Double.box(arg.toDouble) - case arg: java.lang.Long => arg - case arg: java.lang.Number => Double.box(arg.doubleValue) - case arg: java.lang.String => arg - case arg: Array[Byte] => arg case arg: Map[_, _] if arg.isEmpty || arg.head._1.isInstanceOf[String] && arg.head._2.isInstanceOf[String] => arg case arg: mutable.Map[_, _] if arg.isEmpty || arg.head._1.isInstanceOf[String] && arg.head._2.isInstanceOf[String] => arg.toMap - case arg: java.util.Map[_, _] if arg.isEmpty || arg.head._1.isInstanceOf[String] && arg.head._2.isInstanceOf[String] => arg.toMap - case arg: NBTTagCompound => arg - case arg => - OpenComputers.log.warn("Trying to push signal with an unsupported argument of type " + arg.getClass.getName) - null + case arg: java.util.Map[_, _] => { + val convertedMap = new mutable.HashMap[AnyRef, AnyRef] + for ((key, value) <- arg) { + val convertedKey = convertArg(key) + if (convertedKey != null) { + val convertedValue = convertArg(value) + if (convertedValue != null) { + convertedMap += convertedKey -> convertedValue + } + } + } + convertedMap + } + case arg => convertArg(arg) }.toArray[AnyRef])) } }