Commit d31193c3 authored by Jose A. Lopes's avatar Jose A. Lopes
Browse files

Eliminate Haskell constant for opcode names



Modify 'autotools/convert-constants' not to generate the Haskell
constant that holds all opcode names.  By having Haskell generate the
Python opcopdes, it becomes impossible to generate this constant due
to a cyclic dependency.  However, this constant is used only in tests,
therefore, it can be generated from Template Haskell. This patch also
updates the test to execute a Python program to fetch the generated
opcode names instead of relying on the beforementioned constant.
Signed-off-by: default avatarJose A. Lopes <jabolopes@google.com>
Reviewed-by: default avatarGuido Trotter <ultrotter@google.com>
parent 6c2c542e
...@@ -30,7 +30,6 @@ from ganeti import compat ...@@ -30,7 +30,6 @@ from ganeti import compat
from ganeti import constants from ganeti import constants
from ganeti import errors from ganeti import errors
from ganeti import luxi from ganeti import luxi
from ganeti import opcodes
from ganeti import qlang from ganeti import qlang
from ganeti import jstore from ganeti import jstore
...@@ -300,16 +299,6 @@ def Convert(module, prefix): ...@@ -300,16 +299,6 @@ def Convert(module, prefix):
return "\n".join(lines) return "\n".join(lines)
def ConvertMisc():
"""Convert some extra computed-values to Haskell.
"""
lines = [""]
lines.extend(ConvertVariable("opcodes", "OP_IDS",
opcodes.OP_MAPPING.keys(), {}))
return "\n".join(lines)
def main(): def main():
print Convert(constants, "") print Convert(constants, "")
print Convert(luxi, "luxi") print Convert(luxi, "luxi")
...@@ -317,7 +306,6 @@ def main(): ...@@ -317,7 +306,6 @@ def main():
print Convert(_autoconf, "autoconf") print Convert(_autoconf, "autoconf")
print Convert(errors, "errors") print Convert(errors, "errors")
print Convert(jstore, "jstore") print Convert(jstore, "jstore")
print ConvertMisc()
if __name__ == "__main__": if __name__ == "__main__":
......
...@@ -441,8 +441,20 @@ prop_serialization = testSerialisation ...@@ -441,8 +441,20 @@ prop_serialization = testSerialisation
-- | Check that Python and Haskell defined the same opcode list. -- | Check that Python and Haskell defined the same opcode list.
case_AllDefined :: HUnit.Assertion case_AllDefined :: HUnit.Assertion
case_AllDefined = do case_AllDefined = do
let py_ops = sort C.opcodesOpIds py_stdout <-
hs_ops = sort OpCodes.allOpIDs runPython "from ganeti import opcodes\n\
\from ganeti import serializer\n\
\import sys\n\
\print serializer.Dump([opid for opid in opcodes.OP_MAPPING])\n" ""
>>= checkPythonResult
py_ops <- case J.decode py_stdout::J.Result [String] of
J.Ok ops -> return ops
J.Error msg ->
HUnit.assertFailure ("Unable to decode opcode names: " ++ msg)
-- this already raised an expection, but we need it
-- for proper types
>> fail "Unable to decode opcode names"
let hs_ops = sort OpCodes.allOpIDs
extra_py = py_ops \\ hs_ops extra_py = py_ops \\ hs_ops
extra_hs = hs_ops \\ py_ops extra_hs = hs_ops \\ py_ops
HUnit.assertBool ("Missing OpCodes from the Haskell code:\n" ++ HUnit.assertBool ("Missing OpCodes from the Haskell code:\n" ++
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment