Castle: The best Real-Time/Embedded/HighTech language EVER. Attempt 2
修订版 | 8847252156b40ae8b09903f574f7e49ebb899020 (tree) |
---|---|
时间 | 2023-02-09 04:19:39 |
作者 | Albert Mietus < albert AT mietus DOT nl > |
Commiter | Albert Mietus < albert AT mietus DOT nl > |
asis
@@ -1,6 +1,6 @@ | ||
1 | 1 | # (C) Albert Mietus, 2022, 2023. Part of Castle/CCastle project |
2 | 2 | |
3 | -__all__ = ['CC_B_ComponentInterface', 'CC_Port', 'CC_PortDirection'] | |
3 | +__all__ = ['CC_B_ComponentInterface', 'CC_Port', 'CC_PortDirection', 'CC_B_ComponentClass'] | |
4 | 4 | |
5 | 5 | from enum import Enum |
6 | 6 |
@@ -60,10 +60,10 @@ | ||
60 | 60 | count += len(self.ports) |
61 | 61 | return count |
62 | 62 | |
63 | - def render(self, prepend:str="", indent=" ") ->str: | |
63 | + def render(self, prepend:str="", indent:str=" ") ->str: | |
64 | 64 | return self.render_struct(prepend=prepend, indent=indent) |
65 | 65 | |
66 | - def render_struct(self, prepend:str="", indent=" ") ->str: ## struct CC_B_ComponentInterface cc_CI_${name} ... | |
66 | + def render_struct(self, prepend:str="", indent:str=" ") ->str: ## struct CC_B_ComponentInterface cc_CI_${name} ... | |
67 | 67 | name = f'cc_CI_{self.name}' |
68 | 68 | based_on_link = f'&cc_CI_{self.based_on[0].name}' if self.based_on else "NULL" |
69 | 69 |
@@ -85,3 +85,32 @@ | ||
85 | 85 | retval.append(f'{prepend}}} ;') # end of struct |
86 | 86 | |
87 | 87 | return '\n'.join(retval)+"\n" |
88 | + | |
89 | + | |
90 | + | |
91 | +@dataclass | |
92 | +class CC_B_ComponentClass(CC_Base): | |
93 | + """XXX | |
94 | + XXX IS IT USED IN HANDCOMPILED CODE -- as the .methods field is wrongly filled ... | |
95 | + XXX""" | |
96 | + interface: CC_B_ComponentInterface | |
97 | + metaclass="NULL" # //NULL for now, later: meta-class | |
98 | + | |
99 | + def render(self, prepend:str="", indent:str=" ") ->str: | |
100 | + return self.render_struct(prepend=prepend, indent=indent) | |
101 | + | |
102 | + def render_struct(self, prepend:str="", indent:str=" ") ->str: ## struct CC_B_ComponentClass cc_C_<name> {...} | |
103 | + name = self.interface.name | |
104 | + interface_name = f'cc_CI_{name}' | |
105 | + comp_TypeName = f'CC_C_{name}' | |
106 | + methods_name = f'cc_B_{name}_methods' | |
107 | + | |
108 | + retval = [] | |
109 | + retval.append(f'{prepend}struct CC_B_ComponentClass cc_C_{self.interface.name} = {{') | |
110 | + retval.append(f'{prepend}{indent}.isa = {self.metaclass},') | |
111 | + retval.append(f'{prepend}{indent}.interface = &{interface_name},') | |
112 | + retval.append(f'{prepend}{indent}.instance_size = sizeof({comp_TypeName}),') | |
113 | + retval.append(f'{prepend}{indent}.methods = {methods_name},') | |
114 | + retval.append(f'{prepend}}};') | |
115 | + | |
116 | + return '\n'.join(retval)+"\n" |
@@ -6,6 +6,20 @@ | ||
6 | 6 | |
7 | 7 | from castle.writers.CC2Cpy.Component import * # CC_B_ComponentClass |
8 | 8 | |
9 | +from .test_3b_CompInterface import emptyComp | |
10 | + | |
11 | +ref_emptyClass="""\ | |
12 | +struct CC_B_ComponentClass cc_C_empty = { | |
13 | + .isa = NULL, | |
14 | + .interface = &cc_CI_empty, | |
15 | + .instance_size = sizeof(CC_C_empty), | |
16 | + .methods = cc_B_empty_methods, | |
17 | +}; | |
18 | +""" | |
19 | + | |
20 | +def test_0(emptyComp): | |
21 | + emptyClass = CC_B_ComponentClass(emptyComp) | |
22 | + assert CCompare(ref_emptyClass, emptyClass.render()) | |
9 | 23 | |
10 | 24 | |
11 | 25 |