Statistics
| Branch: | Tag: | Revision:

root / src / Ganeti / Hs2Py / GenOpCodes.hs @ 9131274c

History | View | Annotate | Download (2.6 kB)

1 f3e38e89 Jose A. Lopes
{-| GenOpCodes handles Python opcode generation.
2 f3e38e89 Jose A. Lopes
3 f3e38e89 Jose A. Lopes
GenOpCodes contains the helper functions that generate the Python
4 f3e38e89 Jose A. Lopes
opcodes as strings from the Haskell opcode description.
5 f3e38e89 Jose A. Lopes
6 f3e38e89 Jose A. Lopes
-}
7 f3e38e89 Jose A. Lopes
8 f3e38e89 Jose A. Lopes
{-
9 f3e38e89 Jose A. Lopes
10 f3e38e89 Jose A. Lopes
Copyright (C) 2011, 2012, 2013 Google Inc.
11 f3e38e89 Jose A. Lopes
12 f3e38e89 Jose A. Lopes
This program is free software; you can redistribute it and/or modify
13 f3e38e89 Jose A. Lopes
it under the terms of the GNU General Public License as published by
14 f3e38e89 Jose A. Lopes
the Free Software Foundation; either version 2 of the License, or
15 f3e38e89 Jose A. Lopes
(at your option) any later version.
16 f3e38e89 Jose A. Lopes
17 f3e38e89 Jose A. Lopes
This program is distributed in the hope that it will be useful, but
18 f3e38e89 Jose A. Lopes
WITHOUT ANY WARRANTY; without even the implied warranty of
19 f3e38e89 Jose A. Lopes
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20 f3e38e89 Jose A. Lopes
General Public License for more details.
21 f3e38e89 Jose A. Lopes
22 f3e38e89 Jose A. Lopes
You should have received a copy of the GNU General Public License
23 f3e38e89 Jose A. Lopes
along with this program; if not, write to the Free Software
24 f3e38e89 Jose A. Lopes
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
25 f3e38e89 Jose A. Lopes
02110-1301, USA.
26 f3e38e89 Jose A. Lopes
27 f3e38e89 Jose A. Lopes
-}
28 f3e38e89 Jose A. Lopes
29 f3e38e89 Jose A. Lopes
module Ganeti.Hs2Py.GenOpCodes (showPyClasses) where
30 f3e38e89 Jose A. Lopes
31 0d78accc Petr Pudlak
import Data.List (intercalate)
32 f3e38e89 Jose A. Lopes
33 f3e38e89 Jose A. Lopes
import Ganeti.OpCodes
34 f3e38e89 Jose A. Lopes
import Ganeti.THH
35 f3e38e89 Jose A. Lopes
36 f3e38e89 Jose A. Lopes
-- | Generates the Python class docstring.
37 f3e38e89 Jose A. Lopes
pyClassDoc :: String -> String
38 f3e38e89 Jose A. Lopes
pyClassDoc doc
39 f3e38e89 Jose A. Lopes
  | length (lines doc) > 1 =
40 f3e38e89 Jose A. Lopes
    "  \"\"\"" ++ doc ++ "\n\n" ++ "  \"\"\"" ++ "\n"
41 f3e38e89 Jose A. Lopes
  | otherwise =
42 f3e38e89 Jose A. Lopes
    "  \"\"\"" ++ doc ++ "\"\"\"" ++ "\n"
43 f3e38e89 Jose A. Lopes
44 f3e38e89 Jose A. Lopes
-- | Generates an opcode parameter in Python.
45 0d78accc Petr Pudlak
pyClassField :: OpCodeField -> String
46 0d78accc Petr Pudlak
pyClassField (OpCodeField name typ Nothing doc) =
47 6897a51e Petr Pudlak
  "(" ++ intercalate ", " [show name, "None", showValue typ, show doc] ++ ")"
48 0d78accc Petr Pudlak
pyClassField (OpCodeField name typ (Just def) doc) =
49 6897a51e Petr Pudlak
  "(" ++ intercalate ", "
50 6897a51e Petr Pudlak
           [show name, showValue def, showValue typ, show doc] ++ ")"
51 0d78accc Petr Pudlak
52 f3e38e89 Jose A. Lopes
-- | Comma intercalates and indents opcode parameters in Python.
53 f3e38e89 Jose A. Lopes
intercalateIndent :: [String] -> String
54 f3e38e89 Jose A. Lopes
intercalateIndent xs = intercalate "," (map ("\n    " ++) xs)
55 f3e38e89 Jose A. Lopes
56 f3e38e89 Jose A. Lopes
-- | Generates an opcode as a Python class.
57 f3e38e89 Jose A. Lopes
showPyClass :: OpCodeDescriptor -> String
58 0d78accc Petr Pudlak
showPyClass (OpCodeDescriptor name typ doc fields dsc) =
59 f3e38e89 Jose A. Lopes
  let
60 f3e38e89 Jose A. Lopes
    baseclass
61 f3e38e89 Jose A. Lopes
      | name == "OpInstanceMultiAlloc" = "OpInstanceMultiAllocBase"
62 f3e38e89 Jose A. Lopes
      | otherwise = "OpCode"
63 f3e38e89 Jose A. Lopes
    opDscField
64 f3e38e89 Jose A. Lopes
      | null dsc = ""
65 f3e38e89 Jose A. Lopes
      | otherwise = "  OP_DSC_FIELD = " ++ show dsc ++ "\n"
66 f3e38e89 Jose A. Lopes
    withLU
67 f3e38e89 Jose A. Lopes
      | name == "OpTestDummy" = "\n  WITH_LU = False"
68 f3e38e89 Jose A. Lopes
      | otherwise = ""
69 f3e38e89 Jose A. Lopes
  in
70 f3e38e89 Jose A. Lopes
   "class " ++ name ++ "(" ++ baseclass ++ "):" ++ "\n" ++
71 f3e38e89 Jose A. Lopes
   pyClassDoc doc ++
72 f3e38e89 Jose A. Lopes
   opDscField ++
73 f3e38e89 Jose A. Lopes
   "  OP_PARAMS = [" ++
74 0d78accc Petr Pudlak
   intercalateIndent (map pyClassField fields) ++
75 f3e38e89 Jose A. Lopes
   "\n    ]" ++ "\n" ++
76 6897a51e Petr Pudlak
   "  OP_RESULT = " ++ showValue typ ++
77 f3e38e89 Jose A. Lopes
   withLU ++ "\n\n"
78 f3e38e89 Jose A. Lopes
79 f3e38e89 Jose A. Lopes
-- | Generates all opcodes as Python classes.
80 f3e38e89 Jose A. Lopes
showPyClasses :: String
81 f3e38e89 Jose A. Lopes
showPyClasses = concatMap showPyClass pyClasses