Browse Source

Implement two-step initialization for QuickJS.

pull/1581/head
Joao Matos 4 years ago committed by João Matos
parent
commit
720304ce0a
  1. 37
      src/Generator/Generators/QuickJS/QuickJSModule.cs

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

@ -1,4 +1,5 @@
using System.IO; using System.IO;
using System.Linq;
using CppSharp.AST; using CppSharp.AST;
using CppSharp.Generators.C; using CppSharp.Generators.C;
@ -30,30 +31,24 @@ namespace CppSharp.Generators.Cpp
WriteInclude("CppSharp_QuickJS.h", CInclude.IncludeKind.Angled); WriteInclude("CppSharp_QuickJS.h", CInclude.IncludeKind.Angled);
foreach (var unit in TranslationUnits) foreach (var unit in TranslationUnits)
{ WriteInclude(GetIncludeFileName(Context, unit), CInclude.IncludeKind.Quoted);
WriteInclude(new CInclude()
{
File = GetIncludeFileName(Context, unit),
Kind = CInclude.IncludeKind.Quoted
});
}
NewLine(); NewLine();
} }
PopBlock(); PopBlock();
NewLine();
WriteLine("extern \"C\" {"); WriteLine("extern \"C\" {");
NewLine(); NewLine();
PushBlock(); PushBlock();
{ {
foreach (var unit in TranslationUnits) foreach (var unit in TranslationUnits.Where(unit => unit.IsGenerated))
{ {
var name = NAPISources.GetTranslationUnitName(unit); var name = NAPISources.GetTranslationUnitName(unit);
WriteLine($"extern void register_{name}(JSContext *ctx, JSModuleDef *m, bool set);"); WriteLine($"extern void register_{name}(JSContext *ctx, JSModuleDef *m, bool set, int phase);");
} }
} }
PopBlock(NewLineKind.BeforeNextBlock); PopBlock();
NewLine(); NewLine();
WriteLine("#define countof(x) (sizeof(x) / sizeof((x)[0]))"); WriteLine("#define countof(x) (sizeof(x) / sizeof((x)[0]))");
@ -65,11 +60,19 @@ namespace CppSharp.Generators.Cpp
WriteLine($"static int js_{moduleName}_init(JSContext* ctx, JSModuleDef* m)"); WriteLine($"static int js_{moduleName}_init(JSContext* ctx, JSModuleDef* m)");
WriteOpenBraceAndIndent(); WriteOpenBraceAndIndent();
foreach (var unit in TranslationUnits) WriteLine("for (int phase = 0; phase < 2; phase++)");
WriteOpenBraceAndIndent();
{
WriteLine("register_CppSharp_QuickJS(ctx, m, /*set=*/true, phase);");
NewLine();
foreach (var unit in TranslationUnits.Where(unit => unit.IsGenerated))
{ {
var name = NAPISources.GetTranslationUnitName(unit); var name = NAPISources.GetTranslationUnitName(unit);
WriteLine($"register_{name}(ctx, m, /*set=*/true);"); WriteLine($"register_{name}(ctx, m, /*set=*/true, phase);");
} }
}
UnindentAndWriteCloseBrace();
NewLine(); NewLine();
WriteLine("return 0;"); WriteLine("return 0;");
@ -94,10 +97,13 @@ namespace CppSharp.Generators.Cpp
WriteLineIndent("return nullptr;"); WriteLineIndent("return nullptr;");
NewLine(); NewLine();
WriteLine("register_CppSharp_QuickJS(ctx, m, /*set=*/false, 0);");
NewLine();
foreach (var unit in TranslationUnits) foreach (var unit in TranslationUnits)
{ {
var name = NAPISources.GetTranslationUnitName(unit); var name = NAPISources.GetTranslationUnitName(unit);
WriteLine($"register_{name}(ctx, m, /*set=*/false);"); WriteLine($"register_{name}(ctx, m, /*set=*/false, 0);");
} }
NewLine(); NewLine();
@ -109,8 +115,7 @@ namespace CppSharp.Generators.Cpp
WriteLine("}"); WriteLine("}");
} }
public static string GetIncludeFileName(BindingContext context, public static string GetIncludeFileName(BindingContext context, TranslationUnit unit)
TranslationUnit unit)
{ {
// TODO: Replace with GetIncludePath // TODO: Replace with GetIncludePath
string file; string file;

Loading…
Cancel
Save