Skip to content

Commit 1fcd3df

Browse files
authored
Merge pull request #187 from ZenCodeLang/feature/refactor-enhancements/same-class-lambdas
Same-Class Lambdas
2 parents 9d30236 + 82f2117 commit 1fcd3df

30 files changed

+2150
-456
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@ out/
88

99
*.xslt
1010
*.xml
11+
!.run/*.run.xml

.run/tests_gradle.run.xml

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<component name="ProjectRunConfigurationManager">
2+
<configuration default="false" name="ZenCode Tests - Gradle" type="GradleRunConfiguration" factoryName="Gradle">
3+
<ExternalSystemSettings>
4+
<option name="executionName" />
5+
<option name="externalProjectPath" value="$PROJECT_DIR$" />
6+
<option name="externalSystemIdString" value="GRADLE" />
7+
<option name="scriptParameters" value="" />
8+
<option name="taskDescriptions">
9+
<list />
10+
</option>
11+
<option name="taskNames">
12+
<list>
13+
<option value=":ScriptingExample:test" />
14+
</list>
15+
</option>
16+
<option name="vmOptions" />
17+
</ExternalSystemSettings>
18+
<ExternalSystemDebugServerProcess>false</ExternalSystemDebugServerProcess>
19+
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
20+
<DebugAllEnabled>false</DebugAllEnabled>
21+
<RunAsTest>true</RunAsTest>
22+
<method v="2" />
23+
</configuration>
24+
</component>

.run/tests_intellij.run.xml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<component name="ProjectRunConfigurationManager">
2+
<configuration default="false" name="ZenCode Tests - IntelliJ" type="JUnit" factoryName="JUnit">
3+
<module name="ZenCode.ScriptingExample" />
4+
<option name="PACKAGE_NAME" value="" />
5+
<option name="MAIN_CLASS_NAME" value="" />
6+
<option name="METHOD_NAME" value="" />
7+
<option name="TEST_OBJECT" value="package" />
8+
<option name="WORKING_DIRECTORY" value="$MODULE_DIR$" />
9+
<method v="2">
10+
<option name="Make" enabled="true" />
11+
</method>
12+
</configuration>
13+
</component>

JavaBytecodeCompiler/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,5 @@ dependencies {
88
api libs.asm.commons
99
api project(':CodeModel')
1010
api project(':JavaShared')
11+
implementation project(':JavaRuntime')
1112
}

JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaMangler.java

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public String mangleScriptName(final SourceFile sourceFile) {
5353
}
5454

5555
public String mangleScriptBodyMethod(final int methodsAmount) {
56-
return "script-body" + (methodsAmount == 0? "" : ('-' + Integer.toString(methodsAmount)));
56+
return "$body" + (methodsAmount == 0? "" : ('$' + Integer.toString(methodsAmount)));
5757
}
5858

5959
public String mangleSourceFileName(final HighLevelDefinition definition) {
@@ -116,40 +116,41 @@ public int hashCode() {
116116
return builder.toString();
117117
}
118118

119-
public String mangleGeneratedLambdaName(final String interfaceName) {
119+
public String mangleLambdaMethod(final String parentMethodName, final String interfaceName) {
120120
final class LambdaId {
121-
final String target;
121+
final String interfaceName;
122+
final String method;
122123

123-
LambdaId(final String target) {
124-
this.target = target;
124+
LambdaId(final String interfaceName, final String method) {
125+
this.interfaceName = interfaceName;
126+
this.method = method;
125127
}
126128

127129
@Override
128130
public boolean equals(final Object o) {
129-
return this == o || o instanceof LambdaId && this.target.equals(((LambdaId) o).target);
131+
return this == o || o instanceof LambdaId && this.interfaceName.equals(((LambdaId) o).interfaceName) && this.method.equals(((LambdaId) o).method);
130132
}
131133

132134
@Override
133135
public int hashCode() {
134-
return 17 * this.target.hashCode();
136+
return 17 * (this.interfaceName.hashCode() + 31 * this.method.hashCode());
135137
}
136138
}
137139

138-
final String interfaceTarget = interfaceName.replace('/', '_').replace('.', '_');
139-
// TODO("Rework package structure")
140-
return "zsynthetic/$Lambda$" + interfaceTarget + '$' + this.mangleCounters.get(new LambdaId(interfaceTarget));
141-
}
142-
143-
public String mangleGeneratedLambdaName(final FunctionHeader header) {
144-
return this.mangleGeneratedLambdaName("$Generated" + EXP_TAR_MANGLE_FUNCTION_ID + this.encodeLengthNameFormat(this.mangleFunctionHeader(header)));
145-
}
146-
147-
public String mangleCapturedParameter(final int parameterId, final boolean isThis) {
148-
if (isThis) {
149-
return "$this";
140+
final String sanitizedMethodName;
141+
if (parentMethodName == null) {
142+
sanitizedMethodName = "$null";
143+
} else if ("<init>".equals(parentMethodName) || "<clinit>".equals(parentMethodName)) {
144+
sanitizedMethodName = "$_" + parentMethodName.substring(1, parentMethodName.length() - 1) + '_';
150145
} else {
151-
return "$" + parameterId;
146+
sanitizedMethodName = parentMethodName;
152147
}
148+
final String interfaceTarget = interfaceName.replace('/', '.');
149+
final int lastDot = interfaceTarget.lastIndexOf('.');
150+
final String canonicalInterfaceTarget = lastDot == -1 ? interfaceTarget : interfaceTarget.substring(lastDot + 1);
151+
final LambdaId id = new LambdaId(canonicalInterfaceTarget, sanitizedMethodName);
152+
153+
return "$lambda$" + sanitizedMethodName + '$' + canonicalInterfaceTarget + '$' + this.mangleCounters.get(id);
153154
}
154155

155156
private String mangleScriptName(final String rawName) {

0 commit comments

Comments
 (0)