5
5
using CppSharp . AST ;
6
6
using CppSharp . AST . Extensions ;
7
7
using CppSharp . Generators . C ;
8
+ using static CppSharp . Generators . Cpp . NAPISources ;
8
9
9
10
namespace CppSharp . Generators . Cpp
10
11
{
11
12
/// <summary>
12
13
/// Generates QuickJS C/C++ source files.
13
14
/// QuickJS documentation: https://bellard.org/quickjs/
14
15
/// </summary>
15
- public class QuickJSSources : NAPICallbacks
16
+ public class QuickJSSources : NAPISources
16
17
{
17
18
public QuickJSSources ( BindingContext context , IEnumerable < TranslationUnit > units )
18
19
: base ( context , units )
@@ -24,32 +25,193 @@ public override void Process()
24
25
GenerateFilePreamble ( CommentKind . BCPL ) ;
25
26
26
27
PushBlock ( BlockKind . Includes ) ;
27
-
28
- WriteInclude ( new CInclude ( )
29
28
{
30
- File = "quickjs.h" ,
31
- Kind = CInclude . IncludeKind . Angled
32
- } ) ;
29
+ WriteInclude ( "quickjs.h" , CInclude . IncludeKind . Angled ) ;
30
+ WriteInclude ( "assert.h" , CInclude . IncludeKind . Angled ) ;
33
31
34
- foreach ( var unit in TranslationUnits )
35
- {
36
- WriteInclude ( new CInclude ( )
32
+ foreach ( var unit in TranslationUnits )
37
33
{
38
- File = unit . IncludePath ,
39
- Kind = CInclude . IncludeKind . Angled
40
- } ) ;
34
+ WriteInclude ( unit . IncludePath , CInclude . IncludeKind . Angled ) ;
35
+ }
36
+
37
+ NewLine ( ) ;
41
38
}
39
+ PopBlock ( ) ;
42
40
41
+ WriteLine ( "extern \" C\" {" ) ;
43
42
NewLine ( ) ;
44
- PopBlock ( ) ;
45
43
46
- VisitNamespace ( TranslationUnit ) ;
44
+ var registerGen = new QuickJSRegister ( Context , TranslationUnits ) ;
45
+ registerGen . Process ( ) ;
46
+ WriteLine ( registerGen . Generate ( ) ) ;
47
+
48
+ PushBlock ( ) ;
49
+ {
50
+ var name = GetTranslationUnitName ( TranslationUnit ) ;
51
+ WriteLine ( $ "void register_{ name } (JSContext *ctx, JSModuleDef *m, bool set)") ;
52
+ WriteOpenBraceAndIndent ( ) ;
53
+
54
+ TranslationUnit . Visit ( this ) ;
55
+
56
+ UnindentAndWriteCloseBrace ( ) ;
57
+ }
58
+ PopBlock ( NewLineKind . BeforeNextBlock ) ;
59
+
60
+ WriteLine ( "}" ) ;
47
61
}
48
62
49
- public override NAPICallbacks . ParamMarshal GenerateFunctionParamMarshal ( Parameter param , int paramIndex ,
63
+ public override bool VisitClassDecl ( Class @class )
64
+ {
65
+ if ( @class . IsIncomplete )
66
+ return true ;
67
+
68
+ PushBlock ( ) ;
69
+ WriteLine ( $ "register_class_{ GetCIdentifier ( Context , @class ) } (ctx, m, set);") ;
70
+ PopBlock ( NewLineKind . BeforeNextBlock ) ;
71
+ return true ;
72
+ }
73
+
74
+ public override bool VisitFunctionDecl ( Function function )
75
+ {
76
+ if ( function . IsOperator )
77
+ return true ;
78
+
79
+ PushBlock ( ) ;
80
+ WriteLine ( $ "register_function_{ GetCIdentifier ( Context , function ) } (ctx, m, set);") ;
81
+ PopBlock ( NewLineKind . BeforeNextBlock ) ;
82
+ return true ;
83
+ }
84
+
85
+ public override bool VisitEnumDecl ( Enumeration @enum )
86
+ {
87
+ if ( @enum . IsIncomplete )
88
+ return false ;
89
+
90
+ PushBlock ( ) ;
91
+ WriteLine ( $ "register_enum_{ GetCIdentifier ( Context , @enum ) } (ctx, m, set);") ;
92
+ PopBlock ( NewLineKind . BeforeNextBlock ) ;
93
+ return true ;
94
+ }
95
+ }
96
+
97
+ public class QuickJSRegister : NAPIRegister
98
+ {
99
+ public QuickJSRegister ( BindingContext context , IEnumerable < TranslationUnit > units )
100
+ : base ( context , units )
101
+ {
102
+ }
103
+
104
+ public override bool VisitClassDecl ( Class @class )
105
+ {
106
+ if ( @class . IsIncomplete )
107
+ return true ;
108
+
109
+ /*
110
+ PushBlock(BlockKind.InternalsClass, @class);
111
+ {
112
+ var callbacks = new QuickJSInvokes(Context);
113
+ @class.Visit(callbacks);
114
+ Write(callbacks.Generate());
115
+ }
116
+ PopBlock(NewLineKind.BeforeNextBlock);
117
+ */
118
+
119
+ PushBlock ( BlockKind . Class , @class ) ;
120
+ {
121
+ Write ( $ "static void register_class_{ GetCIdentifier ( Context , @class ) } ") ;
122
+ WriteLine ( "(JSContext *ctx, JSModuleDef *m, bool set)" ) ;
123
+ WriteOpenBraceAndIndent ( ) ;
124
+
125
+ /*
126
+ var sources = new NAPIRegisterImpl(Context);
127
+ sources.Indent(CurrentIndentation);
128
+ @class.Visit(sources);
129
+ Write(sources.Generate());
130
+ */
131
+
132
+ UnindentAndWriteCloseBrace ( ) ;
133
+ }
134
+ PopBlock ( NewLineKind . BeforeNextBlock ) ;
135
+
136
+ return false ;
137
+ }
138
+
139
+ public override void GenerateFunctionGroup ( List < Function > group )
140
+ {
141
+ var function = group . First ( ) ;
142
+ if ( function . IsOperator )
143
+ return ;
144
+
145
+ PushBlock ( BlockKind . Function ) ;
146
+ {
147
+ var callbacks = new QuickJSInvokes ( Context ) ;
148
+ callbacks . GenerateFunctionGroup ( group ) ;
149
+ Write ( callbacks . Generate ( ) ) ;
150
+ }
151
+ PopBlock ( NewLineKind . BeforeNextBlock ) ;
152
+
153
+ PushBlock ( BlockKind . Function ) ;
154
+ {
155
+ Write ( $ "static void register_function_{ GetCIdentifier ( Context , function ) } ") ;
156
+ WriteLine ( "(JSContext *ctx, JSModuleDef *m, bool set)" ) ;
157
+ WriteOpenBraceAndIndent ( ) ;
158
+
159
+ WriteLine ( "if (!set)" ) ;
160
+ WriteOpenBraceAndIndent ( ) ;
161
+ WriteLine ( $ "int status = JS_AddModuleExport(ctx, m, \" { function . Name } \" );") ;
162
+ WriteLine ( "assert(status != -1);" ) ;
163
+ WriteLine ( "return;" ) ;
164
+ UnindentAndWriteCloseBrace ( ) ;
165
+ NewLine ( ) ;
166
+
167
+ var callbackId = $ "callback_function_{ GetCIdentifier ( Context , function ) } ";
168
+ var maxParams = @group . Max ( f => f . Parameters . Count ) ;
169
+
170
+ WriteLine ( $ "JSValue val = JS_NewCFunction(ctx, { callbackId } , \" { function . Name } \" ," +
171
+ $ " { maxParams } );") ;
172
+ WriteLine ( $ "int status = JS_SetModuleExport(ctx, m, \" { function . Name } \" , val);") ;
173
+ WriteLine ( "assert(status != -1);" ) ;
174
+
175
+ UnindentAndWriteCloseBrace ( ) ;
176
+ }
177
+ PopBlock ( NewLineKind . BeforeNextBlock ) ;
178
+ }
179
+
180
+ public override bool VisitEnumDecl ( Enumeration @enum )
181
+ {
182
+ if ( @enum . IsIncomplete )
183
+ return false ;
184
+
185
+ PushBlock ( BlockKind . Enum ) ;
186
+ {
187
+ Write ( $ "static void register_enum_{ GetCIdentifier ( Context , @enum ) } ") ;
188
+ WriteLine ( "(JSContext *ctx, JSModuleDef *m)" ) ;
189
+ WriteOpenBraceAndIndent ( ) ;
190
+
191
+ UnindentAndWriteCloseBrace ( ) ;
192
+ }
193
+ PopBlock ( NewLineKind . BeforeNextBlock ) ;
194
+
195
+ return true ;
196
+ }
197
+ }
198
+
199
+ public class QuickJSInvokes : NAPIInvokes
200
+ {
201
+ public QuickJSInvokes ( BindingContext context )
202
+ : base ( context , null )
203
+ {
204
+ }
205
+
206
+ public QuickJSInvokes ( BindingContext context , IEnumerable < TranslationUnit > units )
207
+ : base ( context , units )
208
+ {
209
+ }
210
+
211
+ public override ParamMarshal GenerateFunctionParamMarshal ( Parameter param , int paramIndex ,
50
212
Function function = null )
51
213
{
52
- var paramMarshal = new NAPICallbacks . ParamMarshal { Name = param . Name , Param = param } ;
214
+ var paramMarshal = new ParamMarshal { Name = param . Name , Param = param } ;
53
215
54
216
var argName = Generator . GeneratedIdentifier ( param . Name ) ;
55
217
@@ -112,9 +274,12 @@ public override void GenerateFunctionCallback(List<Function> @group)
112
274
{
113
275
var function = @group . First ( ) ;
114
276
277
+ var type = function is Method ? "method" : "function" ;
278
+ var callbackId = $ "callback_{ type } _{ GetCIdentifier ( Context , function ) } ";
279
+
115
280
PushBlock ( ) ;
116
281
Write ( "extern \" C\" " ) ;
117
- WriteLine ( $ "JSValue js_ { function . Name } (JSContext* ctx, JSValueConst this_val,") ;
282
+ WriteLine ( $ "JSValue { callbackId } (JSContext* ctx, JSValueConst this_val,") ;
118
283
WriteLineIndent ( "int argc, JSValueConst* argv)" ) ;
119
284
WriteOpenBraceAndIndent ( ) ;
120
285
0 commit comments