Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,13 @@
// only while the symbol has no definition. A program's definition (weak or
// not) or an app's replaces the default; two strong definitions remain a
// duplicate-symbol error.
#include <cstddef>

extern "C" void gea_win32_default_cycle_collection_defer() {}

extern "C" bool gea_win32_default_embedded_asset_lookup(const char *, const unsigned char **, unsigned long *) { return false; }

extern "C" bool gea_win32_default_embedded_assets_prepare() { return true; }

#pragma comment(linker, "/alternatename:gea_cycle_collection_defer_begin=gea_win32_default_cycle_collection_defer")
#pragma comment(linker, "/alternatename:gea_cycle_collection_defer_end=gea_win32_default_cycle_collection_defer")
#pragma comment(linker, "/alternatename:gea_embedded_asset_lookup=gea_win32_default_embedded_asset_lookup")
#pragma comment(linker, "/alternatename:gea_embedded_assets_prepare=gea_win32_default_embedded_assets_prepare")
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
// A second, different strong definition of the same hook: a genuine duplicate.
extern "C" bool gea_embedded_asset_lookup(const char *, const unsigned char **, unsigned long *length) { *length = 43; return true; }
extern "C" bool gea_embedded_assets_prepare() { return true; }
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
// An app's own definition of a hook.
extern "C" bool gea_embedded_asset_lookup(const char *, const unsigned char **, unsigned long *length) { *length = 42; return true; }
extern "C" bool gea_embedded_assets_prepare() { return true; }
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
// Stands in for the generated assets unit of an app with file-backed assets: a strong prepare hook.
extern "C" bool gea_embedded_assets_prepare() { return true; }
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@
#include <cstdio>
extern "C" void gea_cycle_collection_defer_begin();
extern "C" bool gea_embedded_asset_lookup(const char *path, const unsigned char **data, unsigned long *length);
extern "C" bool gea_embedded_assets_prepare();
int main()
{
gea_cycle_collection_defer_begin();
std::printf("prepare %d\n", gea_embedded_assets_prepare() ? 1 : 0);
const unsigned char *data = nullptr;
unsigned long length = 0;
const bool found = gea_embedded_asset_lookup("a.png", &data, &length);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,4 @@
#include <cstdio>
extern "C" __attribute__((weak)) void gea_cycle_collection_defer_begin() { std::printf("program defer\n"); }
extern "C" __attribute__((weak)) bool gea_embedded_asset_lookup(const char *, const unsigned char **, unsigned long *length) { *length = 7; return true; }
extern "C" __attribute__((weak)) bool gea_embedded_assets_prepare() { return false; }
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ test('linked hook defaults yield to program and app definitions, and duplicates
return file
}
const defaults = object(path.join(targetDir, 'main', 'win32_hook_defaults.cpp'))
const [framework, program, override, duplicate] = ['framework', 'program', 'app_override', 'app_duplicate'].map((name) => object(path.join(fixtures, `${name}.cpp`)))
const [framework, program, bundle, override, duplicate] = ['framework', 'program', 'bundle_prepare', 'app_override', 'app_duplicate'].map((name) => object(path.join(fixtures, `${name}.cpp`)))
const link = (name, objects) => {
const executable = path.join(out, `${name}.exe`)
const result = spawnSync(lldLink, ['/nologo', `/out:${executable}`, '/subsystem:console', ...objects], { encoding: 'utf8' })
Expand All @@ -52,10 +52,14 @@ test('linked hook defaults yield to program and app definitions, and duplicates
assert.equal(run.status, 0, run.stderr)
return { linked: true, lines: run.stdout.split(/\r?\n/).filter(Boolean) }
}
assert.deepEqual(link('defaults', [framework, defaults]).lines, ['lookup 0 0'])
assert.deepEqual(link('program', [framework, defaults, program]).lines, ['program defer', 'lookup 1 7'])
assert.deepEqual(link('override', [framework, defaults, program, override]).lines, ['program defer', 'lookup 1 42'])
assert.deepEqual(link('defaults', [framework, defaults]).lines, ['prepare 1', 'lookup 0 0'])
assert.deepEqual(link('program', [framework, defaults, program]).lines, ['program defer', 'prepare 0', 'lookup 1 7'])
assert.deepEqual(link('bundle', [framework, defaults, program, bundle]).lines, ['program defer', 'prepare 1', 'lookup 1 7'])
assert.deepEqual(link('override', [framework, defaults, program, override]).lines, ['program defer', 'prepare 1', 'lookup 1 42'])
const clash = link('duplicate', [framework, defaults, override, duplicate])
assert.equal(clash.linked, false)
assert.match(clash.output, /duplicate symbol: gea_embedded_asset_lookup/)
const prepareClash = link('prepare-duplicate', [framework, defaults, bundle, duplicate])
assert.equal(prepareClash.linked, false)
assert.match(prepareClash.output, /duplicate symbol: gea_embedded_assets_prepare/)
})
Loading