Web assembly #6

Merged
Mergul merged 38 commits from WebAssembly into master 2020-04-14 17:44:27 +02:00
6 changed files with 163 additions and 109 deletions
Showing only changes of commit 14839b3765 - Show all commits

View file

@ -351,8 +351,10 @@ export struct EntityManager
void registerSystem(Sys)(int priority, const(char)[] pass_name)
{
ushort pass = passes_map.get(pass_name, ushort.max);
version(D_BetterC)assert(pass != ushort.max, "Update pass doesn't exist.");
else assert(pass != ushort.max, "Update pass (Name " ~ pass_name ~ ") doesn't exist.");
version (D_BetterC)
assert(pass != ushort.max, "Update pass doesn't exist.");
else
assert(pass != ushort.max, "Update pass (Name " ~ pass_name ~ ") doesn't exist.");
registerSystem!(Sys)(priority, pass);
}
@ -371,8 +373,10 @@ export struct EntityManager
assert(register_state,
"registerSystem must be called between beginRegister() and endRegister().");
version(D_BetterC)assert(pass < passes.length, "Update pass doesn't exist.");
else assert(pass < passes.length, "Update pass (ID " ~ pass.to!string ~ ") doesn't exist.");
version (D_BetterC)
assert(pass < passes.length, "Update pass doesn't exist.");
else
assert(pass < passes.length, "Update pass (ID " ~ pass.to!string ~ ") doesn't exist.");
System system;
system.m_pass = pass;
@ -599,7 +603,8 @@ export struct EntityManager
string entites_array;
}
static void allocateSystemComponents(ComponentsIndices!component_counts components_info)(ref System system)
static void allocateSystemComponents(ComponentsIndices!component_counts components_info)(
ref System system)
{
size_t req = components_info.req.length;
size_t opt = components_info.optional.length;
@ -744,7 +749,8 @@ export struct EntityManager
ushort comp = components_map.get(cast(char[]) comp_info.type, ushort.max);
version (D_BetterC)
assert(comp != ushort.max,
"Can't register system due to non existing component.");
"Can't register system \"" ~ Sys.stringof
~ "\" due to non existing component.");
else
assert(comp != ushort.max, "Can't register system \"" ~ Sys.stringof
~ "\" due to non existing component \"" ~ comp_info.type ~ "\".");
@ -753,29 +759,49 @@ export struct EntityManager
foreach (iii, comp_info; components_info.excluded)
{
ushort comp = components_map.get(cast(char[]) comp_info.type, ushort.max);
version (D_BetterC)assert(comp != ushort.max, "Can't register system due to non existing component.");
else assert(comp != ushort.max, "Can't register system \""~Sys.stringof~"\" due to non existing component \""~comp_info.type~"\".");
version (D_BetterC)
assert(comp != ushort.max,
"Can't register system \"" ~ Sys.stringof
~ "\" due to non existing component.");
else
assert(comp != ushort.max, "Can't register system \"" ~ Sys.stringof
~ "\" due to non existing component \"" ~ comp_info.type ~ "\".");
system.m_excluded_components[iii] = comp;
}
foreach (iii, comp_info; components_info.optional)
{
ushort comp = components_map.get(cast(char[]) comp_info.type, ushort.max);
version (D_BetterC)assert(comp != ushort.max, "Can't register system due to non existing component.");
else assert(comp != ushort.max, "Can't register system \""~Sys.stringof~"\" due to non existing component \""~comp_info.type~"\".");
version (D_BetterC)
assert(comp != ushort.max,
"Can't register system \"" ~ Sys.stringof
~ "\" due to non existing component.");
else
assert(comp != ushort.max, "Can't register system \"" ~ Sys.stringof
~ "\" due to non existing component \"" ~ comp_info.type ~ "\".");
system.m_optional_components[iii] = comp;
}
foreach (iii, comp_info; components_info.readonly)
{
ushort comp = components_map.get(cast(char[]) comp_info.type, ushort.max);
version (D_BetterC)assert(comp != ushort.max, "Can't register system due to non existing component.");
else assert(comp != ushort.max, "Can't register system \""~Sys.stringof~"\" due to non existing component \""~comp_info.type~"\".");
version (D_BetterC)
assert(comp != ushort.max,
"Can't register system \"" ~ Sys.stringof
~ "\" due to non existing component.");
else
assert(comp != ushort.max, "Can't register system \"" ~ Sys.stringof
~ "\" due to non existing component \"" ~ comp_info.type ~ "\".");
system.m_read_only_components[iii] = comp;
}
foreach (iii, comp_info; components_info.mutable)
{
ushort comp = components_map.get(cast(char[]) comp_info.type, ushort.max);
version (D_BetterC)assert(comp != ushort.max, "Can't register system due to non existing component.");
else assert(comp != ushort.max, "Can't register system \""~Sys.stringof~"\" due to non existing component \""~comp_info.type~"\".");
version (D_BetterC)
assert(comp != ushort.max,
"Can't register system \"" ~ Sys.stringof
~ "\" due to non existing component.");
else
assert(comp != ushort.max, "Can't register system \"" ~ Sys.stringof
~ "\" due to non existing component \"" ~ comp_info.type ~ "\".");
system.m_modified_components[iii] = comp;
}
@ -1531,16 +1557,19 @@ export struct EntityManager
*Params:
*components_ids = array of components allocated with template
*/
export EntityTemplate* allocateTemplate(EntityTemplate* base_tmpl, ushort[] components_ids, ushort[] remove_components_ids = null)
export EntityTemplate* allocateTemplate(EntityTemplate* base_tmpl,
ushort[] components_ids, ushort[] remove_components_ids = null)
{
size_t len = base_tmpl.info.components.length + components_ids.length;
ushort[] ids = (cast(ushort*) alloca(ushort.sizeof * len))[0
.. len];
memcpy(ids.ptr, base_tmpl.info.components.ptr, ushort.sizeof * base_tmpl.info.components.length);
memcpy(ids.ptr + base_tmpl.info.components.length, components_ids.ptr, ushort.sizeof * components_ids.length);
ushort[] ids = (cast(ushort*) alloca(ushort.sizeof * len))[0 .. len];
memcpy(ids.ptr, base_tmpl.info.components.ptr,
ushort.sizeof * base_tmpl.info.components.length);
memcpy(ids.ptr + base_tmpl.info.components.length, components_ids.ptr,
ushort.sizeof * components_ids.length);
qsort(ids.ptr, ids.length, ushort.sizeof, &compareUShorts);
qsort(remove_components_ids.ptr, remove_components_ids.length, ushort.sizeof, &compareUShorts);
qsort(remove_components_ids.ptr, remove_components_ids.length,
ushort.sizeof, &compareUShorts);
{
uint k = 0;
uint j = 1;
@ -1555,7 +1584,8 @@ export struct EntityManager
}
if (k < remove_components_ids.length)
{
if(remove_components_ids[k] == ids[i])continue;
if (remove_components_ids[k] == ids[i])
continue;
}
}
if (ids[i] != ids[j - 1])
@ -1581,7 +1611,8 @@ export struct EntityManager
if (comp < base_tmpl.info.deltas.length && base_tmpl.info.deltas[comp] != ushort.max) //copy data from base component
{
memcpy(temp.entity_data.ptr + info.tmpl_deltas[comp],
base_tmpl.entity_data.ptr + base_tmpl.info.tmpl_deltas[comp], components[comp].size);
base_tmpl.entity_data.ptr + base_tmpl.info.tmpl_deltas[comp],
components[comp].size);
}
else //fill with default data
{

View file

@ -15,7 +15,9 @@ enum string OUT_FILE = "test_report.xml";
static jmp_buf gEnvBuffer;
static AssertInfo gAssertInfo;
version(D_BetterC){}
version (D_BetterC)
{
}
else version = notBetterC;
struct AssertInfo
@ -158,11 +160,13 @@ struct TestRunner(Args...)
Test test;
static if (attributes.length == 0)test.name = "None";
else test.name = attributes[0];
static if (attributes.length == 0)
test.name = "None";
else
test.name = attributes[0];
static if(__traits(hasMember, module_, "beforeEveryTest"))module_.beforeEveryTest();
static if (__traits(hasMember, module_, "beforeEveryTest"))
module_.beforeEveryTest();
// Save calling environment for longjmp
int jmp_ret = setjmp(gEnvBuffer);
@ -181,10 +185,13 @@ struct TestRunner(Args...)
test.passed = true;
}
if(test.passed)suite.passed++;
else suite.failed++;
if (test.passed)
suite.passed++;
else
suite.failed++;
suite.tests ~= test;
static if(__traits(hasMember, module_, "afterEveryTest"))module_.afterEveryTest();
static if (__traits(hasMember, module_, "afterEveryTest"))
module_.afterEveryTest();
}
passed += suite.passed;
failed += suite.failed;
@ -194,7 +201,8 @@ struct TestRunner(Args...)
void writeFile()
{
if(junit.length == 0)generateJUnit();
if (junit.length == 0)
generateJUnit();
auto file = fopen(OUT_FILE, "w");
fwrite(junit.data.ptr, junit.length, 1, file);
fclose(file);
@ -204,12 +212,14 @@ struct TestRunner(Args...)
{
foreach (ref TestSuite suite; suites)
{
printf("Suite: \"%s\" Passed: %u/%u Skipped: %u\n", suite.name.ptr, suite.passed, suite.passed + suite.failed, suite.skipped);
printf("Suite: \"%s\" Passed: %u/%u Skipped: %u\n", suite.name.ptr,
suite.passed, suite.passed + suite.failed, suite.skipped);
foreach (ref Test test; suite.tests)
{
if (!test.passed)
{
printf("\tTest: \"%s\" Failed! Line: %u Message: %s\n",test.name.ptr, test.file_line, test.msg.ptr);
printf("\tTest: \"%s\" Failed! Line: %u Message: %s\n",
test.name.ptr, test.file_line, test.msg.ptr);
}
}
}
@ -221,16 +231,21 @@ struct TestRunner(Args...)
uint i = 0;
foreach (char c; b)
{
if(i > a.length)return false;
if(a[i] == c)i++;
if (i > a.length)
return false;
if (a[i] == c)
i++;
else
{
if (a[i] == '*')
{
if(i+1 >= a.length)return true;
else if(a[i + 1] == c)i += 2;
if (i + 1 >= a.length)
return true;
else if (a[i + 1] == c)
i += 2;
}
else return false;
else
return false;
}
}
return i == a.length;
@ -292,28 +307,33 @@ extern(C) int main(int argc, char** args)
version (notBetterC)
{
rt_init();
version(D_Coverage) dmd_coverDestPath("reports");
version (D_Coverage)
dmd_coverDestPath("reports");
}
for (int i = 1; i < argc; i++)
{
string arg = cast(string) args[i][0 .. strlen(args[i])];
if(arg.length < 2)continue;
if (arg.length < 2)
continue;
else if (arg == "-i")
{
if(i + 1 >= argc)break;
if (i + 1 >= argc)
break;
i++;
arg = cast(string) args[i][0 .. strlen(args[i])];
extractStrings(include, arg);
}
else if (arg == "-e")
{
if(i + 1 >= argc)break;
if (i + 1 >= argc)
break;
i++;
arg = cast(string) args[i][0 .. strlen(args[i])];
extractStrings(exclude, arg);
}
else if(arg.length < 10)continue;
else if (arg.length < 10)
continue;
else if (arg[0 .. 10] == "--include=")
{
extractStrings(include, arg[10 .. $]);
@ -332,8 +352,11 @@ extern(C) int main(int argc, char** args)
runner.writeOutput();
version(notBetterC)rt_term();
version (notBetterC)
rt_term();
if(!runner.failed)return 0;
else return 1;
if (!runner.failed)
return 0;
else
return 1;
}