Optimise codegen for Python OpCode classes
authorBrian Foley <bpfoley@google.com>
Wed, 27 Jan 2016 19:23:23 +0000 (19:23 +0000)
committerHelga Velroyen <helgav@google.com>
Thu, 28 Jan 2016 15:15:47 +0000 (16:15 +0100)
This makes hs2py output types like ht.TMaybeBool instead of
ht.TMaybe(ht.TBool). The two have equivalent behaviour, but Python
creates a new callable object at runtime for each instance of the
second, because TMaybe is a higher order function.

This optimisation saves >500kB of heap for "import opcodes" for every
Ganeti Python process.

Signed-off-by: Brian Foley <bpfoley@google.com>
Reviewed-by: Guido Trotter <ultrotter@google.com>

src/Ganeti/THH/PyType.hs

index a3dbe44..5a3941c 100644 (file)
@@ -78,6 +78,13 @@ instance Lift PyType where
   lift PTTupleOf     = [| PTTupleOf |]
 
 instance PyValue PyType where
+  -- Use lib/ht.py type aliases to avoid Python creating redundant
+  -- new match functions for commonly used OpCode param types.
+  showValue (PTMaybe (PTOther "NonEmptyString")) = ht "MaybeString"
+  showValue (PTMaybe (PTOther "Bool")) = ht "MaybeBool"
+  showValue (PTMaybe PTDictOf) = ht "MaybeDict"
+  showValue (PTMaybe PTListOf) = ht "MaybeList"
+
   showValue (PTMaybe x)   = ptApp (ht "Maybe") [x]
   showValue (PTApp tf as) = ptApp (showValue tf) as
   showValue (PTOther i)   = ht i