Skip to content

Commit 587573c

Browse files
committed
Check that helper object is not empty
1 parent 98a84c6 commit 587573c

File tree

6 files changed

+45
-17
lines changed

6 files changed

+45
-17
lines changed

ir/Enum.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,11 @@ std::string Enumerator::getName() {
1111
Enum::Enum(std::string name, std::vector<Enumerator> enumerators)
1212
: name(std::move(name)), enumerators(std::move(enumerators)) {}
1313

14-
bool Enum::isAnonymous() {
14+
bool Enum::isAnonymous() const {
1515
return name.empty();
1616
}
1717

18-
TypeDef Enum::generateTypeDef() {
18+
TypeDef Enum::generateTypeDef() const {
1919
assert (!name.empty()); // called after isAnonymous()
2020
return TypeDef("enum_" + name, "native.CInt");
2121
}

ir/Enum.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@ class Enum {
2323
public:
2424
Enum(std::string name, std::vector<Enumerator> enumerators);
2525

26-
bool isAnonymous();
26+
bool isAnonymous() const;
2727

28-
TypeDef generateTypeDef();
28+
TypeDef generateTypeDef() const;
2929

3030
friend std::ostream &operator<<(std::ostream &s, const Enum &e);
3131

ir/IR.cpp

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ std::string IR::generate() {
7777
s << "}\n\n";
7878
}
7979

80-
if (!unions.empty() || !structs.empty()) {
80+
if (hasHelperMethods()) {
8181
s << "object " << libName << "Helpers {\n";
8282

8383
for (const auto &st : structs) {
@@ -97,15 +97,15 @@ std::string IR::generate() {
9797
}
9898

9999
void IR::generateTypeDefs() {
100-
for (auto e : enums) {
100+
for (const auto &e : enums) {
101101
if (!e.isAnonymous()) { // enum might be anon
102102
typeDefs.push_back(e.generateTypeDef());
103103
}
104104
}
105-
for (auto s : structs) {
105+
for (const auto &s : structs) {
106106
typeDefs.push_back(s.generateTypeDef());
107107
}
108-
for (auto u : unions) {
108+
for (const auto &u : unions) {
109109
typeDefs.push_back(u.generateTypeDef());
110110
}
111111
}
@@ -116,3 +116,17 @@ void IR::generateDecl() {
116116
generated = true;
117117
}
118118
}
119+
120+
bool IR::hasHelperMethods() const {
121+
if (!unions.empty()) {
122+
/* all unions have helper methods */
123+
return true;
124+
}
125+
126+
for (const auto &s : structs) {
127+
if (s.hasHelperMethods()) {
128+
return true;
129+
}
130+
}
131+
return false;
132+
}

ir/IR.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,11 @@ class IR {
4343

4444
void generateDecl();
4545

46+
/**
47+
* @return true if helper methods will be generated for this library
48+
*/
49+
bool hasHelperMethods() const;
50+
4651
std::string libName;
4752
std::vector<Function> functions;
4853
std::vector<TypeDef> typeDefs;

ir/Struct.cpp

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ StructOrUnion::StructOrUnion(std::string name, std::vector<Field> fields)
1212
Struct::Struct(std::string name, std::vector<Field> fields, uint64_t typeSize)
1313
: StructOrUnion(std::move(name), std::move(fields)), typeSize(typeSize) {}
1414

15-
TypeDef Struct::generateTypeDef() {
15+
TypeDef Struct::generateTypeDef() const {
1616
if (fields.size() < SCALA_NATIVE_MAX_STRUCT_FIELDS) {
1717
return TypeDef("struct_" + name,
1818
"native.CStruct" + std::to_string(fields.size()) + "[" + getFieldsTypes() + "]");
@@ -23,7 +23,7 @@ TypeDef Struct::generateTypeDef() {
2323
}
2424
}
2525

26-
std::string Struct::getFieldsTypes() {
26+
std::string Struct::getFieldsTypes() const {
2727
std::stringstream s;
2828
auto fieldsCount = static_cast<int>(fields.size());
2929
for (int i = 0; i < fieldsCount; i++) {
@@ -36,8 +36,8 @@ std::string Struct::getFieldsTypes() {
3636
}
3737

3838
std::string Struct::generateHelperClass() const {
39-
if (fields.empty() || fields.size() >= SCALA_NATIVE_MAX_STRUCT_FIELDS) {
40-
/* struct is represented as an array */
39+
if (!hasHelperMethods()) {
40+
/* struct is empty or represented as an array */
4141
return "";
4242
}
4343
std::stringstream s;
@@ -62,11 +62,15 @@ std::string Struct::generateHelperClass() const {
6262
return s.str();
6363
}
6464

65+
bool Struct::hasHelperMethods() const {
66+
return !fields.empty() && fields.size() < SCALA_NATIVE_MAX_STRUCT_FIELDS;
67+
}
68+
6569
Union::Union(std::string name,
6670
std::vector<Field> members, uint64_t maxSize)
6771
: StructOrUnion(std::move(name), std::move(members)), maxSize(maxSize) {}
6872

69-
TypeDef Union::generateTypeDef() {
73+
TypeDef Union::generateTypeDef() const {
7074
return TypeDef("union_" + name, "native.CArray[Byte, " + uint64ToScalaNat(maxSize) + "]");
7175
}
7276

ir/Struct.h

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ class StructOrUnion {
1717
public:
1818
StructOrUnion(std::string name, std::vector<Field> fields);
1919

20-
virtual TypeDef generateTypeDef() = 0;
20+
virtual TypeDef generateTypeDef() const = 0;
2121

2222
virtual std::string generateHelperClass() const = 0;
2323

@@ -30,12 +30,17 @@ class Struct : StructOrUnion {
3030
public:
3131
Struct(std::string name, std::vector<Field> fields, uint64_t typeSize);
3232

33-
TypeDef generateTypeDef() override;
33+
TypeDef generateTypeDef() const override;
3434

3535
std::string generateHelperClass() const override;
3636

37+
/**
38+
* @return true if helper methods will be generated for this struct
39+
*/
40+
bool hasHelperMethods() const;
41+
3742
private:
38-
std::string getFieldsTypes();
43+
std::string getFieldsTypes() const;
3944

4045
/* type size is needed if number of fields is bigger than 22 */
4146
uint64_t typeSize;
@@ -45,7 +50,7 @@ class Union : StructOrUnion {
4550
public:
4651
Union(std::string name, std::vector<Field> members, uint64_t maxSize);
4752

48-
TypeDef generateTypeDef() override;
53+
TypeDef generateTypeDef() const override;
4954

5055
std::string generateHelperClass() const override;
5156

0 commit comments

Comments
 (0)