finish codeparser improvements
pip_cmg now works with new nested entities approach Getters now can access to bitfields
This commit is contained in:
@@ -126,3 +126,8 @@ PIString toCName(const PIString & s) {
|
||||
ret.replaceAll("__", "_");
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
PICodeParser::Entity * findEntity(Runtime & rt, const PIString & type) {
|
||||
return rt.parser.findEntityByName(type);
|
||||
}
|
||||
|
||||
@@ -35,5 +35,6 @@ void usage();
|
||||
void help();
|
||||
|
||||
PIString toCName(const PIString & s);
|
||||
PICodeParser::Entity * findEntity(Runtime & rt, const PIString & type);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -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";
|
||||
}
|
||||
|
||||
@@ -22,6 +22,8 @@
|
||||
|
||||
#include "common.h"
|
||||
|
||||
void writeGetterTypeMembers(Runtime & rt, const PICodeParser::Entity * e, PIString var_prefix = {});
|
||||
void writeGetterValueMembers(Runtime & rt, const PICodeParser::Entity * e, PIString var_prefix = {});
|
||||
void makeGetterType(Runtime & rt, const PICodeParser::Entity * e);
|
||||
void makeGetterValue(Runtime & rt, const PICodeParser::Entity * e);
|
||||
|
||||
|
||||
@@ -22,7 +22,8 @@
|
||||
#include "pitranslator.h"
|
||||
|
||||
|
||||
bool writeClassJSONMembersOut(Runtime & rt, const PICodeParser::Entity * e) {
|
||||
bool writeClassJSONMembersOut(Runtime & rt, const PICodeParser::Entity * e, PIString var_prefix) {
|
||||
if (var_prefix.isNotEmpty() && !var_prefix.endsWith('.')) var_prefix += ".";
|
||||
PIVector<PICodeParser::Member> ml;
|
||||
for (const PICodeParser::Member & m: e->members) {
|
||||
if (m.is_type_ptr || (m.visibility != PICodeParser::Public)) continue;
|
||||
@@ -30,12 +31,19 @@ bool writeClassJSONMembersOut(Runtime & rt, const PICodeParser::Entity * e) {
|
||||
}
|
||||
bool is_union = e->type == "union";
|
||||
for (const PICodeParser::Member & m: ml) {
|
||||
if (is_union && m.isBitfield()) continue;
|
||||
if (m.isBitfield()) continue;
|
||||
if (m.attributes[PICodeParser::Static]) continue;
|
||||
if (m.meta.value("id") == "-") continue;
|
||||
// if (m.meta.contains("id")) cnt = m.meta.value("id").toInt();
|
||||
auto type = findEntity(rt, m.type);
|
||||
if (type) {
|
||||
if (type->is_anonymous) {
|
||||
writeClassJSONMembersOut(rt, type, var_prefix + m.name);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (m.dims.isEmpty()) {
|
||||
rt.ts << "\tret[\"" << m.name << "\"] = piSerializeJSON(v." << m.name << ");\n";
|
||||
rt.ts << "\tret[\"" << var_prefix << m.name << "\"] = piSerializeJSON(v." << var_prefix << m.name << ");\n";
|
||||
} else {
|
||||
PIString ptype = m.type.left(m.type.find('[')).trim();
|
||||
PIString size = m.dims[0];
|
||||
@@ -43,21 +51,22 @@ bool writeClassJSONMembersOut(Runtime & rt, const PICodeParser::Entity * e) {
|
||||
size += " * ";
|
||||
size += m.dims[i];
|
||||
}
|
||||
rt.ts << "\tret[\"" << m.name << "\"] = piSerializeJSON(PIVector<" << ptype << " >((const " << ptype << " *)(v." << m.name
|
||||
<< "), " << size << "));\n";
|
||||
rt.ts << "\tret[\"" << var_prefix << m.name << "\"] = piSerializeJSON(PIVector<" << ptype << " >((const " << ptype << " *)(v."
|
||||
<< var_prefix << m.name << "), " << size << "));\n";
|
||||
}
|
||||
if (is_union) break;
|
||||
}
|
||||
if (is_union) return true;
|
||||
for (const PICodeParser::Entity * ce: e->children) {
|
||||
if (ce->has_name) continue;
|
||||
/*for (const PICodeParser::Entity * ce: e->children) {
|
||||
if (!ce->is_anonymous) continue;
|
||||
if (!writeClassJSONMembersOut(rt, ce)) return false;
|
||||
}
|
||||
}*/
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool writeClassJSONMembersIn(Runtime & rt, const PICodeParser::Entity * e) {
|
||||
bool writeClassJSONMembersIn(Runtime & rt, const PICodeParser::Entity * e, PIString var_prefix) {
|
||||
if (var_prefix.isNotEmpty() && !var_prefix.endsWith('.')) var_prefix += ".";
|
||||
PIVector<PICodeParser::Member> ml;
|
||||
for (const PICodeParser::Member & m: e->members) {
|
||||
if (m.is_type_ptr || (m.visibility != PICodeParser::Public)) continue;
|
||||
@@ -66,12 +75,19 @@ bool writeClassJSONMembersIn(Runtime & rt, const PICodeParser::Entity * e) {
|
||||
bool is_union = e->type == "union";
|
||||
PISet<int> used_id;
|
||||
for (const PICodeParser::Member & m: ml) {
|
||||
if (is_union && m.isBitfield()) continue;
|
||||
if (m.isBitfield()) continue;
|
||||
if (m.attributes[PICodeParser::Static]) continue;
|
||||
if (m.meta.value("id") == "-") continue;
|
||||
auto type = findEntity(rt, m.type);
|
||||
if (type) {
|
||||
if (type->is_anonymous) {
|
||||
writeClassJSONMembersIn(rt, type, var_prefix + m.name);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
// if (m.meta.contains("id")) cnt = m.meta.value("id").toInt();
|
||||
if (m.dims.isEmpty()) {
|
||||
rt.ts << "\tpiDeserializeJSON(v." << m.name << ", js[\"" << m.name << "\"]);\n";
|
||||
rt.ts << "\tpiDeserializeJSON(v." << var_prefix << m.name << ", js[\"" << var_prefix << m.name << "\"]);\n";
|
||||
} else {
|
||||
PIString ptype = m.type.left(m.type.find('[')).trim();
|
||||
PIString size = m.dims[0];
|
||||
@@ -80,19 +96,19 @@ bool writeClassJSONMembersIn(Runtime & rt, const PICodeParser::Entity * e) {
|
||||
size += m.dims[i];
|
||||
}
|
||||
rt.ts << "\t{\n\t\tPIVector<" << ptype << " > d;\n";
|
||||
rt.ts << "\t\tpiDeserializeJSON(d, js[\"" << m.name << "\"]);\n";
|
||||
rt.ts << "\t\tpiDeserializeJSON(d, js[\"" << var_prefix << m.name << "\"]);\n";
|
||||
rt.ts << "\t\tint cnt = piMini(d.size_s(), " << size << ");\n";
|
||||
rt.ts << "\t\tfor (int i = 0; i < cnt; ++i)\n";
|
||||
rt.ts << "\t\t\t((" << ptype << " *)(v." << m.name << "))[i] = d[i];\n";
|
||||
rt.ts << "\t\t\t((" << ptype << " *)(v." << var_prefix << m.name << "))[i] = d[i];\n";
|
||||
rt.ts << "\t}\n";
|
||||
}
|
||||
if (is_union) break;
|
||||
}
|
||||
if (is_union) return true;
|
||||
for (const PICodeParser::Entity * ce: e->children) {
|
||||
if (ce->has_name) continue;
|
||||
/*for (const PICodeParser::Entity * ce: e->children) {
|
||||
if (!ce->is_anonymous) continue;
|
||||
if (!writeClassJSONMembersIn(rt, ce)) return false;
|
||||
}
|
||||
}*/
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -22,8 +22,8 @@
|
||||
|
||||
#include "common.h"
|
||||
|
||||
bool writeClassJSONMembersOut(Runtime & rt, const PICodeParser::Entity * e);
|
||||
bool writeClassJSONMembersIn(Runtime & rt, const PICodeParser::Entity * e);
|
||||
bool writeClassJSONMembersOut(Runtime & rt, const PICodeParser::Entity * e, PIString var_prefix = {});
|
||||
bool writeClassJSONMembersIn(Runtime & rt, const PICodeParser::Entity * e, PIString var_prefix = {});
|
||||
bool needClassJSON(const PICodeParser::Entity * e);
|
||||
bool makeClassJSON(Runtime & rt, const PICodeParser::Entity * e);
|
||||
|
||||
|
||||
@@ -67,7 +67,7 @@ bool writeModel(PICodeParser & parser,
|
||||
if (getters) {
|
||||
ts << "\n\n// Getter funtions\n";
|
||||
for (const PICodeParser::Entity * e: parser.entities) {
|
||||
if (!e->has_name || e->name.startsWith("_PI")) continue;
|
||||
if (e->is_anonymous || e->name.startsWith("_PI")) continue;
|
||||
makeGetterType(rt, e);
|
||||
makeGetterValue(rt, e);
|
||||
}
|
||||
@@ -95,7 +95,7 @@ bool writeModel(PICodeParser & parser,
|
||||
if (meta) {
|
||||
ts << "\n\n// Classes\n";
|
||||
for (const PICodeParser::Entity * e: parser.entities) {
|
||||
if (e->name.startsWith("_PI")) continue;
|
||||
if (e->name.startsWith("_PI") || e->is_anonymous) continue;
|
||||
makeClassInfo(rt, e);
|
||||
}
|
||||
}
|
||||
@@ -108,7 +108,7 @@ bool writeModel(PICodeParser & parser,
|
||||
ts << "\n// Getters\n";
|
||||
for (const PICodeParser::Entity * e: parser.entities) {
|
||||
if (!needClassStream(e)) continue;
|
||||
if (!e->has_name || e->name.startsWith("_PI")) continue;
|
||||
if (e->is_anonymous || e->name.startsWith("_PI")) continue;
|
||||
ts << "\tci_avf[\"" << e->name << "\"] = getterValue" << toCName(e->name) << ";\n";
|
||||
ts << "\tci_atf[\"" << e->name << "\"] = getterType" << toCName(e->name) << ";\n";
|
||||
}
|
||||
@@ -125,7 +125,7 @@ bool writeModel(PICodeParser & parser,
|
||||
if (meta) {
|
||||
ts << "\n// Classes clean\n";
|
||||
for (const PICodeParser::Entity * e: parser.entities) {
|
||||
if (e->name.startsWith("_PI")) continue;
|
||||
if (e->name.startsWith("_PI") || e->is_anonymous) continue;
|
||||
ts << "\tpiDeleteSafety(ci_ci[\"" << e->name << "\"]);\n";
|
||||
ts << "\tci_ins->classesInfo->remove(\"" << e->name << "\");\n";
|
||||
}
|
||||
@@ -143,7 +143,7 @@ bool writeModel(PICodeParser & parser,
|
||||
ts << "\n// Getters clean\n";
|
||||
for (const PICodeParser::Entity * e: parser.entities) {
|
||||
if (!needClassStream(e)) continue;
|
||||
if (!e->has_name || e->name.startsWith("_PI")) continue;
|
||||
if (e->is_anonymous || e->name.startsWith("_PI")) continue;
|
||||
ts << "\tci_avf.remove(\"" << e->name << "\");\n";
|
||||
ts << "\tci_atf.remove(\"" << e->name << "\");\n";
|
||||
}
|
||||
@@ -173,7 +173,7 @@ bool writeModel(PICodeParser & parser,
|
||||
if (streams) {
|
||||
ts << "\n\n// Stream operators\n";
|
||||
for (const PICodeParser::Entity * e: parser.entities) {
|
||||
if (!e->has_name || e->name.startsWith("_PI") ||
|
||||
if (e->is_anonymous || e->name.startsWith("_PI") ||
|
||||
!(e->visibility == PICodeParser::Global || e->visibility == PICodeParser::Public))
|
||||
continue;
|
||||
if (!makeClassStream(rt, e)) return false;
|
||||
@@ -182,7 +182,7 @@ bool writeModel(PICodeParser & parser,
|
||||
if (json) {
|
||||
ts << "\n\n// JSON serialization\n";
|
||||
for (const PICodeParser::Entity * e: parser.entities) {
|
||||
if (!e->has_name || e->name.startsWith("_PI") ||
|
||||
if (e->is_anonymous || e->name.startsWith("_PI") ||
|
||||
!(e->visibility == PICodeParser::Global || e->visibility == PICodeParser::Public))
|
||||
continue;
|
||||
if (!makeClassJSON(rt, e)) return false;
|
||||
|
||||
@@ -20,27 +20,17 @@
|
||||
#include "metainfo.h"
|
||||
|
||||
|
||||
void makeClassInfo(Runtime & rt, const PICodeParser::Entity * e) {
|
||||
rt.ts << "\n\t{\n\tClassInfo * ci = new ClassInfo();\n";
|
||||
rt.ts << "\tci->type = \"" << e->type << "\";\n";
|
||||
rt.ts << "\tci->name = \"" << e->name << "\";\n";
|
||||
rt.ts << "\tci->has_name = " << (e->has_name ? "true" : "false") << ";\n";
|
||||
if (!e->meta.isEmpty()) {
|
||||
auto i = e->meta.makeIterator();
|
||||
while (i.next())
|
||||
rt.ts << "\tci->meta[\"" << i.key() << "\"] = PIString::fromUTF8(\"" << i.value() << "\");\n";
|
||||
}
|
||||
rt.ts << "\tci_ci[ci->name] = ci;\n";
|
||||
if (e->parent_scope) {
|
||||
rt.ts << "\tpci = "
|
||||
<< "ci_ci.value(\"" << e->parent_scope->name << "\", 0);\n";
|
||||
rt.ts << "\tif (pci) pci->children_info << ci;\n";
|
||||
}
|
||||
for (const PICodeParser::Entity * p: e->parents)
|
||||
rt.ts << "\tci->parents << \"" << p->name << "\";\n";
|
||||
if (!e->members.isEmpty()) rt.ts << "\n\tTypeInfo ti;\n";
|
||||
void writeClassInfoMembers(Runtime & rt, const PICodeParser::Entity * e, PIString var_prefix) {
|
||||
if (var_prefix.isNotEmpty() && !var_prefix.endsWith('.')) var_prefix += ".";
|
||||
for (const PICodeParser::Member & m: e->members) {
|
||||
rt.ts << "\tti = TypeInfo(\"" << m.name << "\", \"" << m.type << "\"";
|
||||
auto type = findEntity(rt, m.type);
|
||||
if (type) {
|
||||
if (type->is_anonymous) {
|
||||
writeClassInfoMembers(rt, type, var_prefix + m.name);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
rt.ts << "\tti = TypeInfo(\"" << var_prefix << m.name << "\", \"" << m.type << "\"";
|
||||
if (m.attributes != 0) {
|
||||
bool fir = true;
|
||||
rt.ts << ", ";
|
||||
@@ -97,6 +87,29 @@ void makeClassInfo(Runtime & rt, const PICodeParser::Entity * e) {
|
||||
}
|
||||
rt.ts << "\tci->variables << ti;\n";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void makeClassInfo(Runtime & rt, const PICodeParser::Entity * e) {
|
||||
rt.ts << "\n\t{\n\tClassInfo * ci = new ClassInfo();\n";
|
||||
rt.ts << "\tci->type = \"" << e->type << "\";\n";
|
||||
rt.ts << "\tci->name = \"" << e->name << "\";\n";
|
||||
// rt.ts << "\tci->is_anonymous = " << (e->is_anonymous ? "true" : "false") << ";\n";
|
||||
if (!e->meta.isEmpty()) {
|
||||
auto i = e->meta.makeIterator();
|
||||
while (i.next())
|
||||
rt.ts << "\tci->meta[\"" << i.key() << "\"] = PIString::fromUTF8(\"" << i.value() << "\");\n";
|
||||
}
|
||||
rt.ts << "\tci_ci[ci->name] = ci;\n";
|
||||
if (e->parent_scope) {
|
||||
rt.ts << "\tpci = "
|
||||
<< "ci_ci.value(\"" << e->parent_scope->name << "\", 0);\n";
|
||||
rt.ts << "\tif (pci) pci->children_info << ci;\n";
|
||||
}
|
||||
for (const PICodeParser::Entity * p: e->parents)
|
||||
rt.ts << "\tci->parents << \"" << p->name << "\";\n";
|
||||
if (!e->members.isEmpty()) rt.ts << "\n\tTypeInfo ti;\n";
|
||||
writeClassInfoMembers(rt, e);
|
||||
PIString arg;
|
||||
bool has_fi = false;
|
||||
for (const PICodeParser::Member & m: e->functions) {
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
|
||||
#include "common.h"
|
||||
|
||||
void writeClassInfoMembers(Runtime & rt, const PICodeParser::Entity * e, PIString var_prefix = {});
|
||||
void makeClassInfo(Runtime & rt, const PICodeParser::Entity * e);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -22,7 +22,8 @@
|
||||
#include "pitranslator.h"
|
||||
|
||||
|
||||
bool writeClassStreamMembersOut(Runtime & rt, const PICodeParser::Entity * e, int & cnt, bool simple) {
|
||||
bool writeClassStreamMembersOut(Runtime & rt, const PICodeParser::Entity * e, int & cnt, bool simple, PIString var_prefix) {
|
||||
if (var_prefix.isNotEmpty() && !var_prefix.endsWith('.')) var_prefix += ".";
|
||||
PIVector<PICodeParser::Member> ml;
|
||||
for (const PICodeParser::Member & m: e->members) {
|
||||
if (m.is_type_ptr || (m.visibility != PICodeParser::Public)) continue;
|
||||
@@ -31,9 +32,16 @@ bool writeClassStreamMembersOut(Runtime & rt, const PICodeParser::Entity * e, in
|
||||
bool is_union = e->type == "union";
|
||||
PISet<int> used_id;
|
||||
for (const PICodeParser::Member & m: ml) {
|
||||
if (is_union && m.isBitfield()) continue;
|
||||
if (m.isBitfield()) continue;
|
||||
if (m.attributes[PICodeParser::Static]) continue;
|
||||
if (m.meta.value("id") == "-") continue;
|
||||
auto type = findEntity(rt, m.type);
|
||||
if (type) {
|
||||
if (type->is_anonymous) {
|
||||
if (!writeClassStreamMembersOut(rt, type, cnt, simple, var_prefix + m.name)) return false;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
++cnt;
|
||||
if (m.meta.contains("id")) cnt = m.meta.value("id").toInt();
|
||||
if (used_id[cnt]) {
|
||||
@@ -44,11 +52,11 @@ bool writeClassStreamMembersOut(Runtime & rt, const PICodeParser::Entity * e, in
|
||||
if (simple) {
|
||||
rt.ts << "\ts << ";
|
||||
if (rt.parser.isEnum(m.type)) rt.ts << "(int)";
|
||||
rt.ts << "v." << m.name << ";\n";
|
||||
rt.ts << "v." << var_prefix << m.name << ";\n";
|
||||
} else {
|
||||
rt.ts << "\tcs.add(" << cnt << ", ";
|
||||
if (rt.parser.isEnum(m.type)) rt.ts << "(int)";
|
||||
rt.ts << "v." << m.name << ");\n";
|
||||
rt.ts << "v." << var_prefix << m.name << ");\n";
|
||||
}
|
||||
} else {
|
||||
PIString ptype = m.type.left(m.type.find('[')).trim();
|
||||
@@ -59,24 +67,22 @@ bool writeClassStreamMembersOut(Runtime & rt, const PICodeParser::Entity * e, in
|
||||
}
|
||||
if (simple) {
|
||||
rt.ts << "\tfor (int i = 0; i < " << size << "; ++i)\n";
|
||||
rt.ts << "\t\ts << ((const " << ptype << " *)(v." << m.name << "))[i];\n";
|
||||
rt.ts << "\t\ts << ((const " << ptype << " *)(" << "v." << var_prefix << m.name << "))[i];\n";
|
||||
} else {
|
||||
rt.ts << "\tcs << cs.chunk(" << cnt << ", PIVector<" << ptype << " >((const " << ptype << " *)(v." << m.name << "), ";
|
||||
rt.ts << "\tcs << cs.chunk(" << cnt << ", PIVector<" << ptype << " >((const " << ptype << " *)(" << "v." << var_prefix
|
||||
<< m.name << "), ";
|
||||
rt.ts << size << "));\n";
|
||||
}
|
||||
}
|
||||
if (is_union) break;
|
||||
}
|
||||
if (is_union) return true;
|
||||
for (const PICodeParser::Entity * ce: e->children) {
|
||||
if (ce->has_name) continue;
|
||||
if (!writeClassStreamMembersOut(rt, ce, cnt, simple)) return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool writeClassStreamMembersIn(Runtime & rt, const PICodeParser::Entity * e, int & cnt, bool simple) {
|
||||
bool writeClassStreamMembersIn(Runtime & rt, const PICodeParser::Entity * e, int & cnt, bool simple, PIString var_prefix) {
|
||||
if (var_prefix.isNotEmpty() && !var_prefix.endsWith('.')) var_prefix += ".";
|
||||
PIVector<PICodeParser::Member> ml;
|
||||
for (const PICodeParser::Member & m: e->members) {
|
||||
if (m.is_type_ptr || (m.visibility != PICodeParser::Public)) continue;
|
||||
@@ -85,9 +91,16 @@ bool writeClassStreamMembersIn(Runtime & rt, const PICodeParser::Entity * e, int
|
||||
bool is_union = e->type == "union";
|
||||
PISet<int> used_id;
|
||||
for (const PICodeParser::Member & m: ml) {
|
||||
if (is_union && m.isBitfield()) continue;
|
||||
if (m.isBitfield()) continue;
|
||||
if (m.attributes[PICodeParser::Static]) continue;
|
||||
if (m.meta.value("id") == "-") continue;
|
||||
auto type = findEntity(rt, m.type);
|
||||
if (type) {
|
||||
if (type->is_anonymous) {
|
||||
if (!writeClassStreamMembersIn(rt, type, cnt, simple, var_prefix + m.name)) return false;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
++cnt;
|
||||
if (m.meta.contains("id")) cnt = m.meta.value("id").toInt();
|
||||
if (used_id[cnt]) {
|
||||
@@ -104,8 +117,8 @@ bool writeClassStreamMembersIn(Runtime & rt, const PICodeParser::Entity * e, int
|
||||
if (is_enum)
|
||||
rt.ts << "i;";
|
||||
else
|
||||
rt.ts << "v." << m.name << ";";
|
||||
if (is_enum) rt.ts << " v." << m.name << " = (" << m.type << ")i;}";
|
||||
rt.ts << "v." << var_prefix << m.name << ";";
|
||||
if (is_enum) rt.ts << " v. << var_prefix" << m.name << " = (" << m.type << ")i;}";
|
||||
rt.ts << "\n";
|
||||
} else {
|
||||
rt.ts << "\t\tcase " << cnt << ":";
|
||||
@@ -114,9 +127,9 @@ bool writeClassStreamMembersIn(Runtime & rt, const PICodeParser::Entity * e, int
|
||||
if (is_enum)
|
||||
rt.ts << "i";
|
||||
else
|
||||
rt.ts << "v." << m.name;
|
||||
rt.ts << "v." << var_prefix << m.name;
|
||||
rt.ts << ");";
|
||||
if (is_enum) rt.ts << " v." << m.name << " = (" << m.type << ")i;}";
|
||||
if (is_enum) rt.ts << " v." << var_prefix << m.name << " = (" << m.type << ")i;}";
|
||||
rt.ts << " break;\n";
|
||||
}
|
||||
} else {
|
||||
@@ -128,12 +141,12 @@ bool writeClassStreamMembersIn(Runtime & rt, const PICodeParser::Entity * e, int
|
||||
}
|
||||
if (simple) {
|
||||
rt.ts << "\tfor (int i = 0; i < " << size << "; ++i)\n";
|
||||
rt.ts << "\t\ts >> ((" << ptype << " *)(v." << m.name << "))[i];\n";
|
||||
rt.ts << "\t\ts >> ((" << ptype << " *)(" << "v." << var_prefix << m.name << "))[i];\n";
|
||||
} else {
|
||||
rt.ts << "\t\tcase " << cnt << ": {\n\t\t\tPIVector<" << ptype << " > d; cs.get(d);\n";
|
||||
rt.ts << "\t\t\tint cnt = piMini(d.size_s(), " << size << ");\n";
|
||||
rt.ts << "\t\t\tfor (int i = 0; i < cnt; ++i)\n";
|
||||
rt.ts << "\t\t\t\t((" << ptype << " *)(v." << m.name << "))[i] = d[i];\n";
|
||||
rt.ts << "\t\t\t\t((" << ptype << " *)(" << "v." << var_prefix << m.name << "))[i] = d[i];\n";
|
||||
rt.ts << "\t\t\t}\n";
|
||||
rt.ts << "\t\t\tbreak;\n";
|
||||
}
|
||||
@@ -141,10 +154,6 @@ bool writeClassStreamMembersIn(Runtime & rt, const PICodeParser::Entity * e, int
|
||||
if (is_union) break;
|
||||
}
|
||||
if (is_union) return true;
|
||||
for (const PICodeParser::Entity * ce: e->children) {
|
||||
if (ce->has_name) continue;
|
||||
if (!writeClassStreamMembersIn(rt, ce, cnt, simple)) return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -22,8 +22,8 @@
|
||||
|
||||
#include "common.h"
|
||||
|
||||
bool writeClassStreamMembersOut(Runtime & rt, const PICodeParser::Entity * e, int & cnt, bool simple);
|
||||
bool writeClassStreamMembersIn(Runtime & rt, const PICodeParser::Entity * e, int & cnt, bool simple);
|
||||
bool writeClassStreamMembersOut(Runtime & rt, const PICodeParser::Entity * e, int & cnt, bool simple, PIString var_prefix = {});
|
||||
bool writeClassStreamMembersIn(Runtime & rt, const PICodeParser::Entity * e, int & cnt, bool simple, PIString var_prefix = {});
|
||||
bool needClassStream(const PICodeParser::Entity * e);
|
||||
bool makeClassStream(Runtime & rt, const PICodeParser::Entity * e);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user