mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 05:17:35 +00:00
LibIPC+IPCCompiler: Add IPC::Decoder, let classes decode themselves
This shaves ~5 seconds off of a full build, not too bad. Also it just seems nicer to push this logic out to classes. It could be better but it's a start. :^)
This commit is contained in:
parent
dc417ada6d
commit
a4d857e3c5
12 changed files with 272 additions and 61 deletions
|
@ -228,6 +228,7 @@ int main(int argc, char** argv)
|
|||
dbg() << "#include <AK/OwnPtr.h>";
|
||||
dbg() << "#include <LibGfx/Color.h>";
|
||||
dbg() << "#include <LibGfx/Rect.h>";
|
||||
dbg() << "#include <LibIPC/Decoder.h>";
|
||||
dbg() << "#include <LibIPC/Encoder.h>";
|
||||
dbg() << "#include <LibIPC/Endpoint.h>";
|
||||
dbg() << "#include <LibIPC/Message.h>";
|
||||
|
@ -300,8 +301,7 @@ int main(int argc, char** argv)
|
|||
dbg() << " static OwnPtr<" << name << "> decode(BufferStream& stream, size_t& size_in_bytes)";
|
||||
dbg() << " {";
|
||||
|
||||
if (parameters.is_empty())
|
||||
dbg() << " (void)stream;";
|
||||
dbg() << " IPC::Decoder decoder(stream);";
|
||||
|
||||
for (auto& parameter : parameters) {
|
||||
String initial_value = "{}";
|
||||
|
@ -309,70 +309,19 @@ int main(int argc, char** argv)
|
|||
initial_value = "false";
|
||||
dbg() << " " << parameter.type << " " << parameter.name << " = " << initial_value << ";";
|
||||
|
||||
if (parameter.type == "String") {
|
||||
dbg() << " i32 " << parameter.name << "_length = 0;";
|
||||
dbg() << " stream >> " << parameter.name << "_length;";
|
||||
dbg() << " if (" << parameter.name << "_length == 0) {";
|
||||
dbg() << " " << parameter.name << " = String::empty();";
|
||||
dbg() << " } else if (" << parameter.name << "_length < 0) {";
|
||||
dbg() << " " << parameter.name << " = String();";
|
||||
dbg() << " } else {";
|
||||
dbg() << " char* " << parameter.name << "_buffer = nullptr;";
|
||||
dbg() << " auto " << parameter.name << "_impl = StringImpl::create_uninitialized(static_cast<size_t>(" << parameter.name << "_length), " << parameter.name << "_buffer);";
|
||||
dbg() << " for (size_t i = 0; i < static_cast<size_t>(" << parameter.name << "_length); ++i) {";
|
||||
dbg() << " stream >> " << parameter.name << "_buffer[i];";
|
||||
dbg() << " }";
|
||||
dbg() << " " << parameter.name << " = *" << parameter.name << "_impl;";
|
||||
dbg() << " }";
|
||||
} else if (parameter.type == "Gfx::Color") {
|
||||
dbg() << " u32 " << parameter.name << "_rgba = 0;";
|
||||
dbg() << " stream >> " << parameter.name << "_rgba;";
|
||||
dbg() << " " << parameter.name << " = Gfx::Color::from_rgba(" << parameter.name << "_rgba);";
|
||||
} else if (parameter.type == "Gfx::Size") {
|
||||
dbg() << " int " << parameter.name << "_width = 0;";
|
||||
dbg() << " stream >> " << parameter.name << "_width;";
|
||||
dbg() << " int " << parameter.name << "_height = 0;";
|
||||
dbg() << " stream >> " << parameter.name << "_height;";
|
||||
dbg() << " " << parameter.name << " = { " << parameter.name << "_width, " << parameter.name << "_height };";
|
||||
} else if (parameter.type == "Gfx::Point") {
|
||||
dbg() << " int " << parameter.name << "_x = 0;";
|
||||
dbg() << " stream >> " << parameter.name << "_x;";
|
||||
dbg() << " int " << parameter.name << "_y = 0;";
|
||||
dbg() << " stream >> " << parameter.name << "_y;";
|
||||
dbg() << " " << parameter.name << " = { " << parameter.name << "_x, " << parameter.name << "_y };";
|
||||
} else if (parameter.type == "Gfx::Rect") {
|
||||
dbg() << " int " << parameter.name << "_x = 0;";
|
||||
dbg() << " stream >> " << parameter.name << "_x;";
|
||||
dbg() << " int " << parameter.name << "_y = 0;";
|
||||
dbg() << " stream >> " << parameter.name << "_y;";
|
||||
dbg() << " int " << parameter.name << "_width = 0;";
|
||||
dbg() << " stream >> " << parameter.name << "_width;";
|
||||
dbg() << " int " << parameter.name << "_height = 0;";
|
||||
dbg() << " stream >> " << parameter.name << "_height;";
|
||||
dbg() << " " << parameter.name << " = { " << parameter.name << "_x, " << parameter.name << "_y, " << parameter.name << "_width, " << parameter.name << "_height };";
|
||||
} else if (parameter.type == "Vector<Gfx::Rect>") {
|
||||
if (parameter.type == "Vector<Gfx::Rect>") {
|
||||
dbg() << " int " << parameter.name << "_size = 0;";
|
||||
dbg() << " stream >> " << parameter.name << "_size;";
|
||||
dbg() << " for (int i = 0; i < " << parameter.name << "_size; ++i) {";
|
||||
dbg() << " int " << parameter.name << "_x = 0;";
|
||||
dbg() << " stream >> " << parameter.name << "_x;";
|
||||
dbg() << " int " << parameter.name << "_y = 0;";
|
||||
dbg() << " stream >> " << parameter.name << "_y;";
|
||||
dbg() << " int " << parameter.name << "_width = 0;";
|
||||
dbg() << " stream >> " << parameter.name << "_width;";
|
||||
dbg() << " int " << parameter.name << "_height = 0;";
|
||||
dbg() << " stream >> " << parameter.name << "_height;";
|
||||
dbg() << " " << parameter.name << ".empend(" << parameter.name << "_x, " << parameter.name << "_y, " << parameter.name << "_width, " << parameter.name << "_height);";
|
||||
dbg() << " Gfx::Rect rect;";
|
||||
dbg() << " if (!decoder.decode(rect))";
|
||||
dbg() << " return nullptr;";
|
||||
dbg() << " " << parameter.name << ".append(move(rect));";
|
||||
dbg() << " }";
|
||||
} else {
|
||||
dbg() << " stream >> " << parameter.name << ";";
|
||||
dbg() << " if (!decoder.decode(" << parameter.name << "))";
|
||||
dbg() << " return nullptr;";
|
||||
}
|
||||
dbg() << " if (stream.handle_read_failure()) {";
|
||||
#ifdef GENERATE_DEBUG_CODE
|
||||
dbg() << " dbg() << \"Failed to decode " << name << "." << parameter.name << "\";";
|
||||
#endif
|
||||
dbg() << " return nullptr;";
|
||||
dbg() << " }";
|
||||
}
|
||||
|
||||
StringBuilder builder;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue