Skip to content

Commit f6841e5

Browse files
authored
Remove unnecessary thread state from field helper signatures and emissions (#4492)
* Remove unnecessary thread state in field helpers * Update native helpers for field signature changes
1 parent 320dc58 commit f6841e5

File tree

4 files changed

+56
-31
lines changed

4 files changed

+56
-31
lines changed

vm/ByteCodeTranslator/src/cn1_globals.m

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1100,7 +1100,7 @@ JAVA_OBJECT codenameOneGcMalloc(CODENAME_ONE_THREAD_STATE, int size, struct claz
11001100
threadStateData->nativeAllocationMode = JAVA_FALSE;
11011101
threadStateData->threadActive = JAVA_FALSE;
11021102
while(threadStateData->threadBlockedByGC || threadStateData->heapAllocationSize > 0) {
1103-
if (get_static_java_lang_System_gcThreadInstance(threadStateData) == JAVA_NULL) {
1103+
if (get_static_java_lang_System_gcThreadInstance() == JAVA_NULL) {
11041104
// For some reason the gcThread is dead
11051105
threadStateData->nativeAllocationMode = JAVA_TRUE;
11061106
java_lang_System_gc__(threadStateData);

vm/ByteCodeTranslator/src/com/codename1/tools/translator/ByteCodeClass.java

Lines changed: 41 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -779,23 +779,31 @@ public String generateCCode(List<ByteCodeClass> allClasses) {
779779
b.append(";\n}\n\n");
780780
}
781781

782-
// static setter
782+
// Static object fields may interact with heap bookkeeping, so they keep thread context.
783783
b.append("void set_static_");
784784
b.append(clsName);
785785
b.append("_");
786786
b.append(bf.getFieldName().replace('$', '_'));
787-
b.append("(CODENAME_ONE_THREAD_STATE, ");
787+
b.append("(");
788+
if (bf.isObjectType()) {
789+
b.append("CODENAME_ONE_THREAD_STATE, ");
790+
}
788791
b.append(bf.getCDefinition());
789792
b.append(" __cn1StaticVal) {\n __STATIC_INITIALIZER_");
790793
b.append(bf.getClsName());
794+
if (bf.isObjectType()) {
795+
b.append("(threadStateData);\n ");
796+
} else {
797+
b.append("(getThreadLocalData());\n ");
798+
}
791799
if (bf.isVolatile()) {
792-
b.append("(threadStateData);\n atomic_store_explicit(&STATIC_FIELD_");
800+
b.append("atomic_store_explicit(&STATIC_FIELD_");
793801
b.append(bf.getClsName());
794802
b.append("_");
795803
b.append(bf.getFieldName());
796804
b.append(", __cn1StaticVal, memory_order_release);");
797805
} else {
798-
b.append("(threadStateData);\n STATIC_FIELD_");
806+
b.append("STATIC_FIELD_");
799807
b.append(bf.getClsName());
800808
b.append("_");
801809
b.append(bf.getFieldName());
@@ -852,11 +860,12 @@ public String generateCCode(List<ByteCodeClass> allClasses) {
852860
b.append(";\n}\n\n");
853861
}
854862

863+
// Instance field setters don't use thread context directly.
855864
b.append("void set_field_");
856865
b.append(clsName);
857866
b.append("_");
858867
b.append(fld.getFieldName());
859-
b.append("(CODENAME_ONE_THREAD_STATE, ");
868+
b.append("(");
860869
b.append(fld.getCDefinition());
861870
if(fld.isObjectType()) {
862871
b.append(" __cn1Val, JAVA_OBJECT __cn1T) {\n ").append(nullCheck).append(" ");
@@ -1089,7 +1098,7 @@ public String generateCCode(List<ByteCodeClass> allClasses) {
10891098

10901099
b.append("JAVA_OBJECT __VALUE_OF_").append(clsName).append("(CODENAME_ONE_THREAD_STATE, JAVA_OBJECT value) {\n ");
10911100
if (enumValuesField != null) {
1092-
b.append(" JAVA_ARRAY values = (JAVA_ARRAY)get_static_").append(clsName).append("_").append(enumValuesField.replace('$', '_')).append("(threadStateData);\n");
1101+
b.append(" JAVA_ARRAY values = (JAVA_ARRAY)get_static_").append(clsName).append("_").append(enumValuesField.replace('$', '_')).append("();\n");
10931102
b.append(" JAVA_ARRAY_OBJECT* data = (JAVA_ARRAY_OBJECT*)values->data;\n");
10941103
b.append(" int len = values->length;\n");
10951104
b.append(" for (int i=0; i<len; i++) {\n");
@@ -1541,21 +1550,24 @@ public String generateCHeader() {
15411550
b.append(bf.getFieldName());
15421551
b.append(";\n");
15431552

1544-
b.append("extern void");
1545-
b.append(" set_static_");
1546-
b.append(clsName);
1547-
b.append("_");
1548-
b.append(bf.getFieldName());
1549-
b.append("(CODENAME_ONE_THREAD_STATE, ");
1550-
b.append(bf.getCDefinition());
1551-
b.append(" v);\n");
1553+
b.append("extern void");
1554+
b.append(" set_static_");
1555+
b.append(clsName);
1556+
b.append("_");
1557+
b.append(bf.getFieldName());
1558+
b.append("(");
1559+
if (bf.isObjectType()) {
1560+
b.append("CODENAME_ONE_THREAD_STATE, ");
1561+
}
1562+
b.append(bf.getCDefinition());
1563+
b.append(" v);\n");
15521564
}
15531565
} else {
15541566
b.append("#define get_static_");
15551567
b.append(clsName);
15561568
b.append("_");
15571569
b.append(bf.getFieldName());
1558-
b.append("(threadStateArgument) get_static_");
1570+
b.append("() get_static_");
15591571
b.append(bf.getClsName());
15601572
b.append("_");
15611573
b.append(bf.getFieldName());
@@ -1565,11 +1577,19 @@ public String generateCHeader() {
15651577
b.append(clsName);
15661578
b.append("_");
15671579
b.append(bf.getFieldName());
1568-
b.append("(threadStateArgument, valueArgument) set_static_");
1569-
b.append(bf.getClsName());
1570-
b.append("_");
1571-
b.append(bf.getFieldName());
1572-
b.append("(threadStateArgument, valueArgument)\n");
1580+
if (bf.isObjectType()) {
1581+
b.append("(threadStateArgument, valueArgument) set_static_");
1582+
b.append(bf.getClsName());
1583+
b.append("_");
1584+
b.append(bf.getFieldName());
1585+
b.append("(threadStateArgument, valueArgument)\n");
1586+
} else {
1587+
b.append("(valueArgument) set_static_");
1588+
b.append(bf.getClsName());
1589+
b.append("_");
1590+
b.append(bf.getFieldName());
1591+
b.append("(valueArgument)\n");
1592+
}
15731593
}
15741594
}
15751595
}
@@ -1586,7 +1606,7 @@ public String generateCHeader() {
15861606
b.append(clsName);
15871607
b.append("_");
15881608
b.append(fld.getFieldName());
1589-
b.append("(CODENAME_ONE_THREAD_STATE, ");
1609+
b.append("(");
15901610
b.append(fld.getCDefinition());
15911611
b.append(" __cn1Val, JAVA_OBJECT __cn1T);\n");
15921612
}

vm/ByteCodeTranslator/src/com/codename1/tools/translator/bytecodes/Field.java

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -73,17 +73,18 @@ public String getFieldFromThis() {
7373
}
7474

7575
public String setFieldFromThis(int arg) {
76+
// Instance field setters only need value/target operands.
7677
// special case for this
7778
if(arg == 0) {
7879
return " set_field_" + owner.replace('/', '_').replace('$', '_') +
79-
"_" + name + "(threadStateData, __cn1ThisObject, __cn1ThisObject);\n";
80+
"_" + name + "(__cn1ThisObject, __cn1ThisObject);\n";
8081
}
8182
if(isObject()) {
8283
return " set_field_" + owner.replace('/', '_').replace('$', '_') +
83-
"_" + name + "(threadStateData, __cn1Arg" + arg + ", __cn1ThisObject);\n";
84+
"_" + name + "(__cn1Arg" + arg + ", __cn1ThisObject);\n";
8485
}
8586
return " set_field_" + owner.replace('/', '_').replace('$', '_') +
86-
"_" + name + "(threadStateData, __cn1Arg" + arg + ", __cn1ThisObject);\n";
87+
"_" + name + "(__cn1Arg" + arg + ", __cn1ThisObject);\n";
8788
}
8889

8990

@@ -133,7 +134,7 @@ public boolean assignTo(String varName, StringBuilder sb) {
133134
b.append(owner.replace('/', '_').replace('$', '_'));
134135
b.append("_");
135136
b.append(name.replace('/', '_').replace('$', '_'));
136-
b.append("(threadStateData)");
137+
b.append("()");
137138
} else {
138139

139140
b.append("get_field_");
@@ -214,15 +215,19 @@ public void appendInstruction(StringBuilder sbOut) {
214215
b.append(owner.replace('/', '_').replace('$', '_'));
215216
b.append("_");
216217
b.append(name.replace('/', '_').replace('$', '_'));
217-
b.append("(threadStateData));\n");
218+
b.append("());\n");
218219
break;
219220
case Opcodes.PUTSTATIC: {
220221
//b.append("SAFE_RETAIN(1);\n ");
221222
b.append("set_static_");
222223
b.append(owner.replace('/', '_').replace('$', '_'));
223224
b.append("_");
224225
b.append(name.replace('/', '_').replace('$', '_'));
225-
b.append("(threadStateData, ");
226+
if (isObject()) {
227+
b.append("(threadStateData, ");
228+
} else {
229+
b.append("(");
230+
}
226231
StringBuilder sb2 = new StringBuilder();
227232
StringBuilder sb3 = new StringBuilder();
228233
if (valueOp != null && valueOp instanceof AssignableExpression && ((AssignableExpression)valueOp).assignTo(null, sb2)) {
@@ -303,7 +308,7 @@ public void appendInstruction(StringBuilder sbOut) {
303308
b.append(owner.replace('/', '_').replace('$', '_'));
304309
b.append("_");
305310
b.append(name);
306-
b.append("(threadStateData, ");
311+
b.append("(");
307312

308313

309314

vm/ByteCodeTranslator/src/nativeMethods.m

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -503,7 +503,7 @@ JAVA_OBJECT java_lang_String_charsToBytes___char_1ARRAY_char_1ARRAY_R_byte_1ARRA
503503

504504
JAVA_VOID java_lang_Throwable_fillInStack__(CODENAME_ONE_THREAD_STATE, JAVA_OBJECT __cn1ThisObject) {
505505
if (get_field_java_lang_Throwable_stack(__cn1ThisObject) == JAVA_NULL) {
506-
set_field_java_lang_Throwable_stack(threadStateData, java_lang_Throwable_getStack___R_java_lang_String(threadStateData, __cn1ThisObject), __cn1ThisObject);
506+
set_field_java_lang_Throwable_stack(java_lang_Throwable_getStack___R_java_lang_String(threadStateData, __cn1ThisObject), __cn1ThisObject);
507507
}
508508

509509
}
@@ -1781,7 +1781,7 @@ JAVA_OBJECT java_lang_StringBuilder_append___char_R_java_lang_StringBuilder(CODE
17811781
}
17821782
JAVA_ARRAY_CHAR* d = (JAVA_ARRAY_CHAR*)((JAVA_ARRAY)value)->data;
17831783
d[len] = __cn1Arg1;
1784-
set_field_java_lang_StringBuilder_count(threadStateData, len+1, __cn1ThisObject);
1784+
set_field_java_lang_StringBuilder_count(len+1, __cn1ThisObject);
17851785
finishedNativeAllocations();
17861786
return __cn1ThisObject;
17871787
}

0 commit comments

Comments
 (0)