PICODEINFO::accessOffsetFunction

add offset generation in pip_cmg for retrieve bytes offset of struct member
add pip_cmg -V doc
This commit is contained in:
2025-09-18 17:12:35 +03:00
parent 7083b2c32b
commit 5f3baa5580
7 changed files with 78 additions and 12 deletions

View File

@@ -63,8 +63,26 @@ void writeGetterValueMembers(Runtime & rt, const PICodeParser::Entity * e, PIStr
}
void writeGetterOffsetMembers(Runtime & rt, const PICodeParser::Entity * e, PIString entity_name, 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.isBitfield() || (m.visibility != PICodeParser::Public)) continue;
auto type = findEntity(rt, m.type);
if (type) {
if (type->is_anonymous) {
writeGetterOffsetMembers(rt, type, entity_name, var_prefix + m.name);
continue;
}
}
rt.ts << "\tif (strcmp(name, \"" << var_prefix << m.name << "\") == 0) ";
rt.ts << "return PICODEINFO_OFFSET(" << entity_name << ", " << var_prefix << m.name << ");\n";
}
}
void makeGetterType(Runtime & rt, const PICodeParser::Entity * e) {
if (!needClassStream(e)) return;
if (!needClassGetter(e)) return;
rt.ts << "\nconst char * getterType" << toCName(e->name) << "(const char * name) {\n";
rt.ts << "\tif (!name) return \"\";\n";
writeGetterTypeMembers(rt, e);
@@ -73,7 +91,7 @@ void makeGetterType(Runtime & rt, const PICodeParser::Entity * e) {
void makeGetterValue(Runtime & rt, const PICodeParser::Entity * e) {
if (!needClassStream(e)) return;
if (!needClassGetter(e)) return;
rt.ts << "\nPIByteArray getterValue" << toCName(e->name) << "(const void * p, const char * name) {\n";
rt.ts << "\tPIByteArray ret;\n";
rt.ts << "\tif (!p || !name) return ret;\n";
@@ -81,3 +99,23 @@ void makeGetterValue(Runtime & rt, const PICodeParser::Entity * e) {
writeGetterValueMembers(rt, e);
rt.ts << "\treturn ret;\n}\n";
}
void makeGetterOffset(Runtime & rt, const PICodeParser::Entity * e) {
if (!needClassGetter(e)) return;
rt.ts << "\nint getterOffset" << toCName(e->name) << "(const char * name) {\n";
rt.ts << "\tif (!name) return 0;\n";
writeGetterOffsetMembers(rt, e, e->name);
rt.ts << "\treturn 0;\n}\n";
}
bool needClassGetter(const PICodeParser::Entity * e) {
if (e->meta.contains("no-getter")) return false;
for (const PICodeParser::Member & m: e->members) {
if (m.is_type_ptr || !m.dims.isEmpty() || (m.visibility != PICodeParser::Public)) continue;
if (m.attributes[PICodeParser::Static]) continue;
return true;
}
return false;
}