finish codeparser improvements

pip_cmg now works with new nested entities approach
Getters now can access to bitfields
This commit is contained in:
2025-09-18 05:54:31 +03:00
parent af02684dc5
commit 7083b2c32b
15 changed files with 244 additions and 157 deletions

View File

@@ -22,14 +22,52 @@
#include "stream.h"
void writeGetterTypeMembers(Runtime & rt, const PICodeParser::Entity * e, PIString var_prefix) {
if (var_prefix.isNotEmpty() && !var_prefix.endsWith('.')) var_prefix += ".";
PISet<int> used_id;
for (const PICodeParser::Member & m: e->members) {
if (m.is_type_ptr || !m.dims.isEmpty() || (m.visibility != PICodeParser::Public)) continue;
auto type = findEntity(rt, m.type);
if (type) {
if (type->is_anonymous) {
writeGetterTypeMembers(rt, type, var_prefix + m.name);
continue;
}
}
rt.ts << "\tif (strcmp(name, \"" << var_prefix << m.name << "\") == 0) return \"" << m.type;
// if (m.isBitfield()) rt.ts << ":" << m.bits;
rt.ts << "\";\n";
}
}
void writeGetterValueMembers(Runtime & rt, const PICodeParser::Entity * e, PIString var_prefix) {
if (var_prefix.isNotEmpty() && !var_prefix.endsWith('.')) var_prefix += ".";
PISet<int> used_id;
for (const PICodeParser::Member & m: e->members) {
if (m.is_type_ptr || !m.dims.isEmpty() || (m.visibility != PICodeParser::Public)) continue;
auto type = findEntity(rt, m.type);
if (type) {
if (type->is_anonymous) {
writeGetterValueMembers(rt, type, var_prefix + m.name);
continue;
}
}
rt.ts << "\tif (strcmp(name, \"" << var_prefix << m.name << "\") == 0) {";
if (m.isBitfield()) {
rt.ts << "ret = piSerialize(static_cast<" << m.type << ">(o->" << var_prefix << m.name << "));";
} else
rt.ts << "serialize(ret, o->" << var_prefix << m.name << ");";
rt.ts << " return ret;}\n";
}
}
void makeGetterType(Runtime & rt, const PICodeParser::Entity * e) {
if (!needClassStream(e)) return;
rt.ts << "\nconst char * getterType" << toCName(e->name) << "(const char * name) {\n";
rt.ts << "\tif (!name) return \"\";\n";
for (const PICodeParser::Member & m: e->members) {
if (m.is_type_ptr || m.isBitfield() || !m.dims.isEmpty() || (m.visibility != PICodeParser::Public)) continue;
rt.ts << "\tif (strcmp(name, \"" << m.name << "\") == 0) return \"" << m.type << "\";\n";
}
writeGetterTypeMembers(rt, e);
rt.ts << "\treturn \"\";\n}\n";
}
@@ -40,9 +78,6 @@ void makeGetterValue(Runtime & rt, const PICodeParser::Entity * e) {
rt.ts << "\tPIByteArray ret;\n";
rt.ts << "\tif (!p || !name) return ret;\n";
rt.ts << "\t" << e->name << " * o = (" << e->name << "*)p;\n";
for (const PICodeParser::Member & m: e->members) {
if (m.is_type_ptr || m.isBitfield() || !m.dims.isEmpty() || (m.visibility != PICodeParser::Public)) continue;
rt.ts << "\tif (strcmp(name, \"" << m.name << "\") == 0) {serialize(ret, o->" << m.name << "); return ret;}\n";
}
writeGetterValueMembers(rt, e);
rt.ts << "\treturn ret;\n}\n";
}