Skip to content

Commit fa7e76f

Browse files
committed
Refactor QuickJS generator structure to follow NAPI patterns.
1 parent 7969925 commit fa7e76f

File tree

2 files changed

+233
-29
lines changed

2 files changed

+233
-29
lines changed

src/Generator/Generators/C/QuickJS/QuickJSModule.cs

Lines changed: 51 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,24 +25,39 @@ public override void Process()
2525
GenerateFilePreamble(CommentKind.BCPL);
2626

2727
PushBlock(BlockKind.Includes);
28-
29-
WriteInclude(new CInclude()
30-
{
31-
File = "quickjs.h",
32-
Kind = CInclude.IncludeKind.Angled
33-
});
34-
35-
foreach (var unit in TranslationUnits)
3628
{
3729
WriteInclude(new CInclude()
3830
{
39-
File = GetIncludeFileName(Context, unit),
40-
Kind = CInclude.IncludeKind.Quoted
31+
File = "quickjs.h",
32+
Kind = CInclude.IncludeKind.Angled
4133
});
34+
35+
foreach (var unit in TranslationUnits)
36+
{
37+
WriteInclude(new CInclude()
38+
{
39+
File = GetIncludeFileName(Context, unit),
40+
Kind = CInclude.IncludeKind.Quoted
41+
});
42+
}
43+
44+
NewLine();
4245
}
46+
PopBlock();
4347

48+
WriteLine("extern \"C\" {");
49+
NewLine();
50+
51+
PushBlock();
52+
{
53+
foreach (var unit in TranslationUnits)
54+
{
55+
var name = NAPISources.GetTranslationUnitName(unit);
56+
WriteLine($"extern void register_{name}(JSContext *ctx, JSModuleDef *m, bool set);");
57+
}
58+
}
59+
PopBlock(NewLineKind.BeforeNextBlock);
4460
NewLine();
45-
PopBlock();
4661

4762
WriteLine("#define countof(x) (sizeof(x) / sizeof((x)[0]))");
4863
NewLine();
@@ -70,9 +85,19 @@ public override void Process()
7085
// Generate init function.
7186
WriteLine($"static int js_{moduleName}_init(JSContext* ctx, JSModuleDef* m)");
7287
WriteOpenBraceAndIndent();
73-
88+
/*
7489
WriteLine($"return JS_SetModuleExportList(ctx, m, js_{moduleName}_funcs," +
7590
$" countof(js_{moduleName}_funcs));");
91+
*/
92+
93+
foreach (var unit in TranslationUnits)
94+
{
95+
var name = NAPISources.GetTranslationUnitName(unit);
96+
WriteLine($"register_{name}(ctx, m, /*set=*/true);");
97+
}
98+
NewLine();
99+
100+
WriteLine("return 0;");
76101
UnindentAndWriteCloseBrace();
77102
NewLine();
78103

@@ -94,11 +119,23 @@ public override void Process()
94119
WriteLineIndent("return nullptr;");
95120
NewLine();
96121

122+
foreach (var unit in TranslationUnits)
123+
{
124+
var name = NAPISources.GetTranslationUnitName(unit);
125+
WriteLine($"register_{name}(ctx, m, /*set=*/false);");
126+
}
127+
NewLine();
128+
/*
97129
WriteLine($"JS_AddModuleExportList(ctx, m, js_{moduleName}_funcs," +
98130
$" countof(js_{moduleName}_funcs));");
131+
*/
132+
99133
WriteLine("return m;");
100134

101135
UnindentAndWriteCloseBrace();
136+
137+
NewLine();
138+
WriteLine("}");
102139
}
103140

104141
public static string GetIncludeFileName(BindingContext context,
@@ -135,8 +172,10 @@ public override bool VisitFunctionDecl(Function function)
135172
if (!function.IsGenerated)
136173
return true;
137174

175+
/*
138176
WriteLine($"JS_CFUNC_DEF(\"{function.Name}\"," +
139177
$" {function.Parameters.Count}, js_{function.Name}),");
178+
*/
140179

141180
return true;
142181
}

src/Generator/Generators/C/QuickJS/QuickJSSources.cs

Lines changed: 182 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,15 @@
55
using CppSharp.AST;
66
using CppSharp.AST.Extensions;
77
using CppSharp.Generators.C;
8+
using static CppSharp.Generators.Cpp.NAPISources;
89

910
namespace CppSharp.Generators.Cpp
1011
{
1112
/// <summary>
1213
/// Generates QuickJS C/C++ source files.
1314
/// QuickJS documentation: https://bellard.org/quickjs/
1415
/// </summary>
15-
public class QuickJSSources : NAPICallbacks
16+
public class QuickJSSources : NAPISources
1617
{
1718
public QuickJSSources(BindingContext context, IEnumerable<TranslationUnit> units)
1819
: base(context, units)
@@ -24,32 +25,193 @@ public override void Process()
2425
GenerateFilePreamble(CommentKind.BCPL);
2526

2627
PushBlock(BlockKind.Includes);
27-
28-
WriteInclude(new CInclude()
2928
{
30-
File = "quickjs.h",
31-
Kind = CInclude.IncludeKind.Angled
32-
});
29+
WriteInclude("quickjs.h", CInclude.IncludeKind.Angled);
30+
WriteInclude("assert.h", CInclude.IncludeKind.Angled);
3331

34-
foreach (var unit in TranslationUnits)
35-
{
36-
WriteInclude(new CInclude()
32+
foreach (var unit in TranslationUnits)
3733
{
38-
File = unit.IncludePath,
39-
Kind = CInclude.IncludeKind.Angled
40-
});
34+
WriteInclude(unit.IncludePath, CInclude.IncludeKind.Angled);
35+
}
36+
37+
NewLine();
4138
}
39+
PopBlock();
4240

41+
WriteLine("extern \"C\" {");
4342
NewLine();
44-
PopBlock();
4543

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("}");
4761
}
4862

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,
50212
Function function = null)
51213
{
52-
var paramMarshal = new NAPICallbacks.ParamMarshal { Name = param.Name, Param = param };
214+
var paramMarshal = new ParamMarshal { Name = param.Name, Param = param };
53215

54216
var argName = Generator.GeneratedIdentifier(param.Name);
55217

@@ -112,9 +274,12 @@ public override void GenerateFunctionCallback(List<Function> @group)
112274
{
113275
var function = @group.First();
114276

277+
var type = function is Method ? "method" : "function";
278+
var callbackId = $"callback_{type}_{GetCIdentifier(Context, function)}";
279+
115280
PushBlock();
116281
Write("extern \"C\" ");
117-
WriteLine($"JSValue js_{function.Name}(JSContext* ctx, JSValueConst this_val,");
282+
WriteLine($"JSValue {callbackId}(JSContext* ctx, JSValueConst this_val,");
118283
WriteLineIndent("int argc, JSValueConst* argv)");
119284
WriteOpenBraceAndIndent();
120285

0 commit comments

Comments
 (0)