Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,14 @@

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.concurrent.locks.ReentrantLock;

/**
* Parsed class file
Expand Down Expand Up @@ -79,6 +83,7 @@ public void setIsAnnotation(boolean isAnnotation) {


private static Set<String> arrayTypes = new TreeSet<String>();
private static ReadWriteLock arrayTypesLock = new ReentrantReadWriteLock();

private ByteCodeClass baseClassObject;
private List<ByteCodeClass> baseInterfacesObject;
Expand All @@ -89,10 +94,12 @@ public void setIsAnnotation(boolean isAnnotation) {
private int classOffset;

private boolean marked;
private static ByteCodeClass mainClass;
private static volatile ByteCodeClass mainClass;
private static ReentrantLock mainClassLock = new ReentrantLock();
private boolean finalClass;
private boolean isEnum;
private static Set<String> writableFields = new HashSet<String>();
private static ReadWriteLock writableFieldsLock = new ReentrantReadWriteLock();

/**
*
Expand Down Expand Up @@ -151,10 +158,15 @@ static void setSaveUnitTests(boolean save) {

public void addMethod(BytecodeMethod m) {
if(m.isMain()) {
if (mainClass == null) {
mainClass = this;
} else {
throw new RuntimeException("Multiple main classes: "+mainClass.clsName+" and "+this.clsName);
mainClassLock.lock();
try {
if (mainClass == null) {
mainClass = this;
} else {
throw new RuntimeException("Multiple main classes: "+mainClass.clsName+" and "+this.clsName);
}
} finally {
mainClassLock.unlock();
}
}
m.setSourceFile(sourceFile);
Expand All @@ -172,7 +184,12 @@ public String generateCSharpCode() {
}

public void addWritableField(String field) {
writableFields.add(field);
writableFieldsLock.writeLock().lock();
try {
writableFields.add(field);
} finally {
writableFieldsLock.writeLock().unlock();
}
}

/**
Expand Down Expand Up @@ -429,8 +446,21 @@ private boolean hasFinalizer() {

public static void addArrayType(String type, int dimenstions) {
String arr = dimenstions + "_" + type;
if(!arrayTypes.contains(arr)) {
arrayTypes.add(arr);
arrayTypesLock.readLock().lock();
try {
if(arrayTypes.contains(arr)) {
return;
}
} finally {
arrayTypesLock.readLock().unlock();
}
arrayTypesLock.writeLock().lock();
try {
if(!arrayTypes.contains(arr)) {
arrayTypes.add(arr);
}
} finally {
arrayTypesLock.writeLock().unlock();
}
}

Expand Down Expand Up @@ -566,8 +596,17 @@ public String generateCCode(List<ByteCodeClass> allClasses) {

// create class objects for 1 - 3 dimension arrays
for(int iter = 1 ; iter < 4 ; iter++) {
if(!(arrayTypes.contains(iter + "_" + clsName) || arrayTypes.contains((iter + 1) + "_" + clsName) ||
arrayTypes.contains((iter + 2) + "_" + clsName))) {
boolean shouldContinue = false;
arrayTypesLock.readLock().lock();
try {
if(!(arrayTypes.contains(iter + "_" + clsName) || arrayTypes.contains((iter + 1) + "_" + clsName) ||
arrayTypes.contains((iter + 2) + "_" + clsName))) {
shouldContinue = true;
}
} finally {
arrayTypesLock.readLock().unlock();
}
if(shouldContinue) {
continue;
}
b.append("struct clazz class_array");
Expand Down Expand Up @@ -629,7 +668,14 @@ public String generateCCode(List<ByteCodeClass> allClasses) {
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())) {
boolean isWritable = false;
writableFieldsLock.readLock().lock();
try {
isWritable = writableFields.contains(bf.getFieldName());
} finally {
writableFieldsLock.readLock().unlock();
}
if(bf.isFinal() && bf.getValue() != null && !isWritable) {
// static getter
b.append(bf.getCDefinition());
b.append(" get_static_");
Expand Down Expand Up @@ -870,7 +916,14 @@ public String generateCCode(List<ByteCodeClass> allClasses) {
}
}

if(arrayTypes.contains("1_" + clsName) || arrayTypes.contains("2_" + clsName) || arrayTypes.contains("3_" + clsName)) {
boolean containsArrayTypes = false;
arrayTypesLock.readLock().lock();
try {
containsArrayTypes = arrayTypes.contains("1_" + clsName) || arrayTypes.contains("2_" + clsName) || arrayTypes.contains("3_" + clsName);
} finally {
arrayTypesLock.readLock().unlock();
}
if(containsArrayTypes) {
b.append("JAVA_OBJECT __NEW_ARRAY_");
b.append(clsName);
b.append("(CODENAME_ONE_THREAD_STATE, JAVA_INT size) {\n");
Expand Down Expand Up @@ -1011,18 +1064,29 @@ public String generateCCode(List<ByteCodeClass> allClasses) {
b.append(clsName);
b.append(");\n return;\n }\n\n");

if(arrayTypes.contains("1_" + clsName) || arrayTypes.contains("2_" + clsName) || arrayTypes.contains("3_" + clsName)) {
boolean arrayTypeC1 = false;
boolean arrayTypeC2 = false;
boolean arrayTypeC3 = false;
arrayTypesLock.readLock().lock();
try {
arrayTypeC1 = arrayTypes.contains("1_" + clsName) || arrayTypes.contains("2_" + clsName) || arrayTypes.contains("3_" + clsName);
arrayTypeC2 = arrayTypes.contains("2_" + clsName) || arrayTypes.contains("3_" + clsName);
arrayTypeC3 = arrayTypes.contains("3_" + clsName);
} finally {
arrayTypesLock.readLock().unlock();
}
if(arrayTypeC1) {
b.append("class_array1__");
b.append(clsName);
b.append(".vtable = initVtableForInterface();\n ");
}

if( arrayTypes.contains("2_" + clsName) || arrayTypes.contains("3_" + clsName)) {
if(arrayTypeC2) {
b.append("class_array2__");
b.append(clsName);
b.append(".vtable = initVtableForInterface();\n ");
}
if(arrayTypes.contains("3_" + clsName)) {
if(arrayTypeC3) {
b.append("class_array3__");
b.append(clsName);
b.append(".vtable = initVtableForInterface();\n ");
Expand Down Expand Up @@ -1236,19 +1300,30 @@ public String generateCHeader() {
b.append(clsName);
b.append(";\n");

if(arrayTypes.contains("1_" + clsName) || arrayTypes.contains("2_" + clsName) || arrayTypes.contains("3_" + clsName)) {
boolean arrayTypeC1 = false;
boolean arrayTypeC2 = false;
boolean arrayTypeC3 = false;
arrayTypesLock.readLock().lock();
try {
arrayTypeC1 = arrayTypes.contains("1_" + clsName) || arrayTypes.contains("2_" + clsName) || arrayTypes.contains("3_" + clsName);
arrayTypeC2 = arrayTypes.contains("2_" + clsName) || arrayTypes.contains("3_" + clsName);
arrayTypeC3 = arrayTypes.contains("3_" + clsName);
} finally {
arrayTypesLock.readLock().unlock();
}
if(arrayTypeC1) {
b.append("extern struct clazz class_array1__");
b.append(clsName);
b.append(";\n");
}

if(arrayTypes.contains("2_" + clsName) || arrayTypes.contains("3_" + clsName)) {
if(arrayTypeC2) {
b.append("extern struct clazz class_array2__");
b.append(clsName);
b.append(";\n");
}

if(arrayTypes.contains("3_" + clsName)) {
if(arrayTypeC3) {
b.append("extern struct clazz class_array3__");
b.append(clsName);
b.append(";\n");
Expand Down Expand Up @@ -1288,7 +1363,14 @@ public String generateCHeader() {
b.append("extern JAVA_OBJECT __VALUE_OF_").append(clsName).append("(CODENAME_ONE_THREAD_STATE, JAVA_OBJECT value);\n");
}

if(arrayTypes.contains("1_" + clsName)) {
boolean arrayTypeC1_arr = false;
arrayTypesLock.readLock().lock();
try {
arrayTypeC1_arr = arrayTypes.contains("1_" + clsName);
} finally {
arrayTypesLock.readLock().unlock();
}
if(arrayTypeC1_arr) {
b.append("extern JAVA_OBJECT __NEW_ARRAY_");
b.append(clsName);
b.append("(CODENAME_ONE_THREAD_STATE, JAVA_INT size);\n");
Expand Down Expand Up @@ -1333,7 +1415,14 @@ public String generateCHeader() {
b.append("_");
b.append(bf.getFieldName());
b.append("();\n");
if(!(bf.isFinal() && bf.getValue() != null && !writableFields.contains(bf.getFieldName()))) {
boolean isWritable = false;
writableFieldsLock.readLock().lock();
try {
isWritable = writableFields.contains(bf.getFieldName());
} finally {
writableFieldsLock.readLock().unlock();
}
if(!(bf.isFinal() && bf.getValue() != null && !isWritable)) {
b.append("extern ");
b.append(bf.getCDefinition());
b.append(" STATIC_FIELD_");
Expand Down Expand Up @@ -1842,10 +1931,15 @@ void setIsEnum(boolean b) {
}

private String getArrayClazz(int dim) {
if((arrayTypes.contains(dim + "_" + clsName) )) {
return "&class_array"+dim+"__"+clsName;
} else {
return "0";
arrayTypesLock.readLock().lock();
try {
if((arrayTypes.contains(dim + "_" + clsName) )) {
return "&class_array"+dim+"__"+clsName;
} else {
return "0";
}
} finally {
arrayTypesLock.readLock().unlock();
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,10 @@
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

/**
*
Expand Down Expand Up @@ -79,12 +83,26 @@ public String extension() {
* Recursively parses the files in the hierarchy to the output directory
*/
void execute(File[] sourceDirs, File outputDir) throws Exception {
for(File f : sourceDirs) {
execute(f, outputDir);
ExecutorService executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
List<Future<?>> futures = new ArrayList<Future<?>>();
try {
for(File f : sourceDirs) {
execute(f, outputDir, executor, futures);
}
for(Future<?> future : futures) {
try {
future.get();
} catch (ExecutionException e) {
if (e.getCause() instanceof Exception) throw (Exception)e.getCause();
throw e;
}
}
} finally {
executor.shutdown();
}
}

void execute(File sourceDir, File outputDir) throws Exception {
void execute(File sourceDir, final File outputDir, ExecutorService executor, List<Future<?>> futures) throws Exception {
File[] directoryList = sourceDir.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
Expand All @@ -98,19 +116,35 @@ public boolean accept(File pathname) {
}
});
if(fileList != null) {
for(File f : fileList) {
for(final File f : fileList) {
if (f.getName().equals("module-info.class")) {
// Remove module-info.class that might have been added by jdk9 compile
System.out.println("WARNING: Found module-info.class file at "+f+". One or more of your jars must have been built for JDK9 or higher. -target 8 or lower is required.");
System.out.println(" Will ignore this warning and attempt build anyways.");
continue;
}
if(f.getName().endsWith(".class")) {
Parser.parse(f);
futures.add(executor.submit(new Runnable() {
public void run() {
try {
Parser.parse(f);
} catch(Exception e) {
throw new RuntimeException(e);
}
}
}));
} else {
if(!f.isDirectory()) {
// copy the file to the dest dir
copy(new FileInputStream(f), new FileOutputStream(new File(outputDir, f.getName())));
futures.add(executor.submit(new Runnable() {
public void run() {
try {
copy(new FileInputStream(f), new FileOutputStream(new File(outputDir, f.getName())));
} catch(Exception e) {
throw new RuntimeException(e);
}
}
}));
}
}
}
Expand All @@ -121,7 +155,7 @@ public boolean accept(File pathname) {
copyDir(f, outputDir);
continue;
}
execute(f, outputDir);
execute(f, outputDir, executor, futures);
}
}
}
Expand Down
Loading
Loading