Skip to content

Name Mangling fixes and centralization #152

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 7 commits into from
Jun 7, 2024
Merged
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 @@ -31,7 +31,6 @@ public class JavaBytecodeContext extends JavaContext {
private final TypeGenerator typeGenerator;
private final JavaTypeInternalNameVisitor internalNameVisitor;
private final JavaTypeDescriptorVisitor descriptorVisitor;
private int lambdaCounter = 0;
private final Map<LoopStatement.ObjectId, BytecodeLoopLabels> bytecodeLoopLabels = new HashMap<>();

public JavaBytecodeContext(JavaBytecodeModule target, JavaCompileSpace space, ZSPackage modulePackage, String basePackage, IZSLogger logger) {
Expand Down Expand Up @@ -130,10 +129,6 @@ private void createSharedClass() {
// TODO
}

public int getLambdaCounter() {
return ++lambdaCounter;
}

public BytecodeLoopLabels getLoopLabels(LoopStatement loopStatement) {
return bytecodeLoopLabels.get(loopStatement.objectId);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,22 +27,19 @@
import org.openzen.zenscript.javashared.prepare.JavaPrepareDefinitionMemberVisitor;
import org.openzen.zenscript.javashared.prepare.JavaPrepareDefinitionVisitor;

import java.io.File;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
* @author Hoofdgebruiker
*/
public class JavaCompiler {

private final IZSLogger logger;
private int generatedScriptBlockCounter = 0;
private int expansionCounter = 0;
private final JavaMangler mangler;

public JavaCompiler(IZSLogger logger) {
this.logger = logger;
this.mangler = new JavaMangler();
}

public JavaBytecodeModule compile(String packageName, SemanticModule module, JavaCompileSpace space, JavaEnumMapper enumMapper) {
Expand All @@ -51,8 +48,8 @@ public JavaBytecodeModule compile(String packageName, SemanticModule module, Jav
// Scripts with a higher priority load before scripts with a lower priority.
module.scripts.sort(Comparator.<ScriptBlock>comparingInt(a -> a.file.getOrder()).reversed());
module.scripts.forEach(script -> {
final String className = getClassName(script.file == null ? null : script.file.getFilename());
getScriptFile(scriptBlocks, script.pkg.fullName + "/" + className);
final String className = this.mangler.mangleScriptName(script.file);
getScriptFile(scriptBlocks, script.pkg.fullName + '/' + className);
});
Set<JavaScriptFile> scriptFilesThatAreActuallyUsedInScripts = new HashSet<>();

Expand All @@ -66,13 +63,7 @@ public JavaBytecodeModule compile(String packageName, SemanticModule module, Jav
allDefinitions.addAll(module.expansions);

for (HighLevelDefinition definition : allDefinitions) {
final String className = getClassName(getFilename(definition));
final String filename;
if (definition instanceof FunctionDefinition) {
filename = className;
} else {
filename = className + "_" + (definition.name == null ? "generated" : definition.name) + "_" + expansionCounter++;
}
final String filename = this.mangler.mangleDefinitionName(definition);
JavaPrepareDefinitionVisitor definitionPreparer = new JavaPrepareDefinitionVisitor(compiling, filename, null, filename);
definition.accept(definitionPreparer);
}
Expand All @@ -88,8 +79,8 @@ public JavaBytecodeModule compile(String packageName, SemanticModule module, Jav
final String internalName;
final JavaScriptFile scriptFile;
if (definition instanceof FunctionDefinition) {
internalName = getClassName(getFilename(definition));
scriptFile = getScriptFile(scriptBlocks, definition.pkg.fullName.replace('.', '/') + "/" + internalName);
internalName = this.mangler.mangleSourceFileName(definition);
scriptFile = getScriptFile(scriptBlocks, definition.pkg.fullName.replace('.', '/') + '/' + internalName);
scriptFilesThatAreActuallyUsedInScripts.add(scriptFile);
} else {
JavaClass cls = definition instanceof ExpansionDefinition ? context.getJavaExpansionClass(definition) : context
Expand All @@ -98,7 +89,7 @@ public JavaBytecodeModule compile(String packageName, SemanticModule module, Jav
internalName = cls.internalName;
}
scriptFile.classWriter.visitSource(definition.position.getFilename(), null);
target.addClass(internalName, definition.accept(new JavaDefinitionVisitor(context, compiling, scriptFile.classWriter)));
target.addClass(internalName, definition.accept(new JavaDefinitionVisitor(context, compiling, scriptFile.classWriter, mangler)));
}

FunctionHeader scriptHeader = new FunctionHeader(BasicTypeID.VOID, module.parameters);
Expand All @@ -113,14 +104,14 @@ public JavaBytecodeModule compile(String packageName, SemanticModule module, Jav

for (ScriptBlock script : module.scripts) {
final SourceFile sourceFile = script.file;
final String className = getClassName(sourceFile == null ? null : sourceFile.getFilename());
JavaScriptFile scriptFile = getScriptFile(scriptBlocks, script.pkg.fullName + "/" + className);
final String className = this.mangler.mangleScriptName(sourceFile);
JavaScriptFile scriptFile = getScriptFile(scriptBlocks, script.pkg.fullName + '/' + className);
scriptFilesThatAreActuallyUsedInScripts.add(scriptFile);
if (sourceFile != null) {
scriptFile.classWriter.visitSource(sourceFile.getFilename(), null);
}

String methodName = scriptFile.scriptMethods.isEmpty() ? "run" : "run" + scriptFile.scriptMethods.size();
String methodName = this.mangler.mangleScriptBodyMethod(scriptFile.scriptMethods.size());

// convert scripts into methods (add them to a Scripts class?)
// (TODO: can we break very long scripts into smaller methods? for the extreme scripts)
Expand All @@ -130,7 +121,8 @@ public JavaBytecodeModule compile(String packageName, SemanticModule module, Jav
JavaCompilingMethod compilingMethod = new JavaCompilingMethod(scriptsClass, method, scriptDescriptor);
scriptFile.scriptMethods.add(new JavaScriptMethod(method, module.parameters, javaScriptParameters));

final JavaStatementVisitor statementVisitor = new JavaStatementVisitor(context, context.getJavaModule(script.module), new JavaWriter(logger, CodePosition.UNKNOWN, visitor, compilingMethod, null));
final JavaWriter writer = new JavaWriter(logger, CodePosition.UNKNOWN, visitor, compilingMethod, null);
final JavaStatementVisitor statementVisitor = new JavaStatementVisitor(context, context.getJavaModule(script.module), writer, mangler);
statementVisitor.start();
for (Statement statement : script.statements) {
statement.accept(statementVisitor);
Expand All @@ -151,35 +143,6 @@ public JavaBytecodeModule compile(String packageName, SemanticModule module, Jav
return target;
}

private String getFilename(HighLevelDefinition definition) {
SourceFile source = definition.position.file;
if (source != null) {
List<String> parts = source.getFilePath();
return parts.get(parts.size() - 1);
} else {
return definition.name == null ? "Expansion" : definition.name;
}
}

private String getClassName(String filename) {
if (filename == null) {
return "generatedBlock" + (generatedScriptBlockCounter++);
} else {
// TODO: find all special characters
final String specialCharRegex = Stream.of('/', '\\', '.', ';')
.filter(character -> character != File.separatorChar)
.map(String::valueOf)
.collect(Collectors.joining("", "[", "]"));

return filename
.substring(0, filename.lastIndexOf('.')) //remove the .zs part
.replaceAll(specialCharRegex, "_")
.replace('[', '_')
.replace(File.separatorChar, '/')
.concat("$");
}
}

private JavaScriptFile getScriptFile(Map<String, JavaScriptFile> scriptBlocks, String className) {
if (!scriptBlocks.containsKey(className)) {
JavaClassWriter scriptFileWriter = new JavaClassWriter(ClassWriter.COMPUTE_FRAMES);
Expand Down
Loading
Loading