Skip to content

Commit

Permalink
Added detection for the name of the generated VALUES static field in …
Browse files Browse the repository at this point in the history
…enums that seems to vary for different java compilers. Previously assumed that the field is named _VALUES but it seems that some compilers emit ENUM_VALUES.
  • Loading branch information
shannah committed Sep 10, 2018
1 parent 8927c64 commit 3ce65a4
Showing 1 changed file with 19 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -336,6 +336,7 @@ public String generateCCode(List<ByteCodeClass> allClasses) {
StringBuilder b = new StringBuilder();
b.append("#include \"");
b.append(clsName);

b.append(".h\"\n");

for(String s : dependsClassesInterfaces) {
Expand Down Expand Up @@ -480,10 +481,13 @@ public String generateCCode(List<ByteCodeClass> allClasses) {

staticFieldList = new ArrayList<ByteCodeField>();
buildStaticFieldList(staticFieldList);

String enumValuesField = null;
// static fields for the class
for(ByteCodeField bf : staticFieldList) {
if(bf.isStaticField() && bf.getClsName().equals(clsName)) {
if (isEnum && ("_VALUES".equals(bf.getFieldName().replace('$','_')) || "ENUM_VALUES".equals(bf.getFieldName().replace('$','_')))) {
enumValuesField = bf.getFieldName();
}
if(bf.isFinal() && bf.getValue() != null && !writableFields.contains(bf.getFieldName())) {
// static getter
b.append(bf.getCDefinition());
Expand Down Expand Up @@ -830,15 +834,21 @@ public String generateCCode(List<ByteCodeClass> allClasses) {
}

if (isEnum) {

b.append("JAVA_OBJECT __VALUE_OF_").append(clsName).append("(CODENAME_ONE_THREAD_STATE, JAVA_OBJECT value) {\n ");
b.append(" JAVA_ARRAY values = (JAVA_ARRAY)get_static_").append(clsName).append("__VALUES(threadStateData);\n");
b.append(" JAVA_ARRAY_OBJECT* data = (JAVA_ARRAY_OBJECT*)values->data;\n");
b.append(" int len = values->length;\n");
b.append(" for (int i=0; i<len; i++) {\n");
b.append(" JAVA_OBJECT name = get_field_").append(clsName).append("_name(data[i]);\n");
b.append(" if (name != JAVA_NULL && java_lang_String_equals___java_lang_Object_R_boolean(threadStateData, name, value)) { return data[i];}\n");
b.append(" }\n");
b.append(" return JAVA_NULL;\n");
if (enumValuesField != null) {
b.append(" JAVA_ARRAY values = (JAVA_ARRAY)get_static_").append(clsName).append("_").append(enumValuesField.replace('$', '_')).append("(threadStateData);\n");
b.append(" JAVA_ARRAY_OBJECT* data = (JAVA_ARRAY_OBJECT*)values->data;\n");
b.append(" int len = values->length;\n");
b.append(" for (int i=0; i<len; i++) {\n");
b.append(" JAVA_OBJECT name = get_field_").append(clsName).append("_name(data[i]);\n");
b.append(" if (name != JAVA_NULL && java_lang_String_equals___java_lang_Object_R_boolean(threadStateData, name, value)) { return data[i];}\n");
b.append(" }\n");
b.append(" return JAVA_NULL;\n");
} else {
System.err.println("Unable to find enum VALUES static ield for "+clsName+", this may cause unexpected results when using the "+clsName+" enum.");
b.append(" return JAVA_NULL;\n");
}
b.append("}\n\n");
}

Expand Down

0 comments on commit 3ce65a4

Please sign in to comment.