Skip to content

Commit

Permalink
Merge pull request #42671 from warunalakshitha/file_too_large_master
Browse files Browse the repository at this point in the history
[master] Fix file too large due to many record default functions
  • Loading branch information
warunalakshitha committed Jun 5, 2024
2 parents 14f09a3 + 29ada7f commit fcab497
Show file tree
Hide file tree
Showing 30 changed files with 14,665 additions and 446 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,6 @@
*/
public class ErrorValue extends BError implements RefValue {

private static final long serialVersionUID = 1L;
private static final PrintStream outStream = System.err;

private final Type type;
Expand All @@ -75,8 +74,7 @@ public class ErrorValue extends BError implements RefValue {
private final BError cause;
private final Object details;

private static final String GENERATE_OBJECT_CLASS_PREFIX = "$value$";
private static final String SPLIT_CLASS_SUFFIX_REGEX = "\\$split\\$\\d";
private static final String GENERATED_CLASS_TEXTS_REGEX = "\\$value\\$|\\$split\\$\\d|lambdas.\\$_generated\\d*";
private static final String GENERATE_PKG_INIT = "___init_";
private static final String GENERATE_PKG_START = "___start_";
private static final String GENERATE_PKG_STOP = "___stop_";
Expand Down Expand Up @@ -444,7 +442,7 @@ private Optional<StackTraceElement> filterStackTraceElement(StackTraceElement st
}

private String cleanupClassName(String className) {
return className.replace(GENERATE_OBJECT_CLASS_PREFIX, "").replaceAll(SPLIT_CLASS_SUFFIX_REGEX, "");
return className.replaceAll(GENERATED_CLASS_TEXTS_REGEX, "");
}

private boolean isCompilerAddedName(String name) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,6 @@
public class MapValueImpl<K, V> extends LinkedHashMap<K, V> implements RefValue, CollectionValue, MapValue<K, V>,
BMap<K, V> {

private static final long serialVersionUID = 1L;
private BTypedesc typedesc;
private Type type;
private Type referredType;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@
import org.ballerinalang.model.elements.PackageID;
import org.ballerinalang.model.symbols.SymbolKind;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.FieldVisitor;
import org.objectweb.asm.Handle;
import org.objectweb.asm.Label;
import org.objectweb.asm.MethodVisitor;
Expand Down Expand Up @@ -54,7 +53,6 @@
import org.wso2.ballerinalang.util.Flags;

import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Pattern;

Expand Down Expand Up @@ -101,7 +99,6 @@
import static org.wso2.ballerinalang.compiler.bir.codegen.JvmConstants.OVERFLOW_LINE_NUMBER;
import static org.wso2.ballerinalang.compiler.bir.codegen.JvmConstants.START_OF_HEADING_WITH_SEMICOLON;
import static org.wso2.ballerinalang.compiler.bir.codegen.JvmConstants.STRAND_CLASS;
import static org.wso2.ballerinalang.compiler.bir.codegen.JvmConstants.STRAND_METADATA;
import static org.wso2.ballerinalang.compiler.bir.codegen.JvmConstants.STRAND_METADATA_VAR_PREFIX;
import static org.wso2.ballerinalang.compiler.bir.codegen.JvmConstants.STRING_BUILDER;
import static org.wso2.ballerinalang.compiler.bir.codegen.JvmConstants.STRING_CONCAT_FACTORY;
Expand All @@ -122,7 +119,6 @@
import static org.wso2.ballerinalang.compiler.bir.codegen.JvmSignatures.GET_OBJECT;
import static org.wso2.ballerinalang.compiler.bir.codegen.JvmSignatures.GET_REGEXP;
import static org.wso2.ballerinalang.compiler.bir.codegen.JvmSignatures.GET_RUNTIME;
import static org.wso2.ballerinalang.compiler.bir.codegen.JvmSignatures.GET_STRAND_METADATA;
import static org.wso2.ballerinalang.compiler.bir.codegen.JvmSignatures.GET_STREAM_VALUE;
import static org.wso2.ballerinalang.compiler.bir.codegen.JvmSignatures.GET_TABLE_VALUE;
import static org.wso2.ballerinalang.compiler.bir.codegen.JvmSignatures.GET_TYPEDESC;
Expand All @@ -131,7 +127,6 @@
import static org.wso2.ballerinalang.compiler.bir.codegen.JvmSignatures.INITIAL_METHOD_DESC;
import static org.wso2.ballerinalang.compiler.bir.codegen.JvmSignatures.INIT_CHANNEL_DETAILS;
import static org.wso2.ballerinalang.compiler.bir.codegen.JvmSignatures.INIT_ERROR;
import static org.wso2.ballerinalang.compiler.bir.codegen.JvmSignatures.INIT_STRAND_METADATA;
import static org.wso2.ballerinalang.compiler.bir.codegen.JvmSignatures.INIT_WITH_STRING;
import static org.wso2.ballerinalang.compiler.bir.codegen.JvmSignatures.INT_TO_STRING;
import static org.wso2.ballerinalang.compiler.bir.codegen.JvmSignatures.RETURN_ARRAY_VALUE;
Expand Down Expand Up @@ -281,42 +276,11 @@ public static void generateDefaultConstructor(ClassWriter cw, String ownerClass)
mv.visitEnd();
}

static void generateStrandMetadata(MethodVisitor mv, String moduleClass,
PackageID packageID, AsyncDataCollector asyncDataCollector) {
asyncDataCollector.getStrandMetadata().forEach(
(varName, metaData) -> genStrandMetadataField(mv, moduleClass, packageID, varName, metaData));
}

public static void genStrandMetadataField(MethodVisitor mv, String moduleClass, PackageID packageID,
String varName, ScheduleFunctionInfo metaData) {
mv.visitTypeInsn(Opcodes.NEW, STRAND_METADATA);
mv.visitInsn(Opcodes.DUP);
mv.visitLdcInsn(Utils.decodeIdentifier(packageID.orgName.value));
mv.visitLdcInsn(Utils.decodeIdentifier(packageID.name.value));
mv.visitLdcInsn(getMajorVersion(packageID.version.value));
if (metaData.typeName == null) {
mv.visitInsn(Opcodes.ACONST_NULL);
} else {
mv.visitLdcInsn(metaData.typeName);
}
mv.visitLdcInsn(metaData.parentFunctionName);
mv.visitMethodInsn(Opcodes.INVOKESPECIAL, STRAND_METADATA,
JVM_INIT_METHOD, INIT_STRAND_METADATA, false);
mv.visitFieldInsn(Opcodes.PUTSTATIC, moduleClass, varName, GET_STRAND_METADATA);
}

static void visitStrandMetadataFields(ClassWriter cw, Map<String, ScheduleFunctionInfo> strandMetaDataMap) {
strandMetaDataMap.keySet().forEach(varName -> visitStrandMetadataField(cw, varName));
}

private static void visitStrandMetadataField(ClassWriter cw, String varName) {
FieldVisitor fv = cw.visitField(Opcodes.ACC_STATIC, varName,
GET_STRAND_METADATA, null, null);
fv.visitEnd();
}

public static String getStrandMetadataVarName(String parentFunction) {
return STRAND_METADATA_VAR_PREFIX + parentFunction + "$";
public static String setAndGetStrandMetadataVarName(String parentFunction, AsyncDataCollector asyncDataCollector) {
String metaDataVarName = STRAND_METADATA_VAR_PREFIX + parentFunction + "$";
asyncDataCollector.getStrandMetadata().putIfAbsent(metaDataVarName,
new ScheduleFunctionInfo(parentFunction));
return metaDataVarName;
}

public static boolean isExternFunc(BIRNode.BIRFunction func) {
Expand Down Expand Up @@ -372,6 +336,17 @@ static String getModuleLevelClassName(PackageID packageID, String sourceFileName
return getPackageNameWithSeparator(packageID, separator) + className;
}

public static String getModuleLevelClassName(PackageID packageID, String prefix, String sourceFileName,
String separator) {
String className = cleanupSourceFileName(sourceFileName);
// handle source file path start with '/'.
if (className.startsWith(JAVA_PACKAGE_SEPERATOR)) {
className = className.substring(1);
}
return getPackageNameWithSeparator(packageID, separator) + prefix + className;
}


private static String cleanupSourceFileName(String name) {
return name.replace(".", FILE_NAME_PERIOD_SEPERATOR);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -305,6 +305,7 @@ public class JvmConstants {
public static final String MODULE_STRING_CONSTANT_CLASS_NAME = "constants/$_string_constants";
public static final String MODULE_SURROGATES_CLASS_NAME = "constants/$_surrogate_methods";
public static final String MODULE_CONSTANT_CLASS_NAME = "constants/$_module_constants";
public static final String MODULE_STRAND_METADATA_CLASS_NAME = "constants/$_strand_metadata";
public static final String CONSTANTS_CLASS_NAME = "constants/$_constants";
public static final String MODULE_TYPES_CLASS_NAME = "types/$_types";
public static final String MODULE_RECORD_TYPES_CLASS_NAME = "types/$_record_types";
Expand All @@ -318,6 +319,8 @@ public class JvmConstants {
public static final String MODULE_FUNCTION_CALLS_CLASS_NAME = "creators/$_function_calls";
public static final String MODULE_ERRORS_CREATOR_CLASS_NAME = "creators/$_errors";
public static final String MODULE_ANNOTATIONS_CLASS_NAME = "annotations/$_annotations";
public static final String MODULE_GENERATED_FUNCTIONS_CLASS_NAME = "functions/$_generated";
public static final String MODULE_LAMBDAS_CLASS_NAME = "lambdas/$_generated";
public static final String B_STRING_INIT_METHOD_PREFIX = "$string_init";
public static final String B_UNION_TYPE_INIT_METHOD = "$union_type_init";
public static final String B_ERROR_TYPE_INIT_METHOD = "$error_type_init";
Expand Down Expand Up @@ -475,6 +478,8 @@ public class JvmConstants {
public static final int MAX_STRINGS_PER_METHOD = 5000;
public static final int VISIT_MAX_SAFE_MARGIN = 10;
public static final int OVERFLOW_LINE_NUMBER = 0x80000000;
public static final int MAX_GENERATED_METHODS_PER_CLASS = 100;
public static final int MAX_GENERATED_LAMBDAS_PER_CLASS = 500;

private JvmConstants() {
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import org.objectweb.asm.MethodVisitor;
import org.wso2.ballerinalang.compiler.bir.codegen.internal.AsyncDataCollector;
import org.wso2.ballerinalang.compiler.bir.codegen.internal.BIRVarToJVMIndexMap;
import org.wso2.ballerinalang.compiler.bir.codegen.internal.LambdaFunction;
import org.wso2.ballerinalang.compiler.bir.codegen.interop.JCast;
import org.wso2.ballerinalang.compiler.bir.codegen.interop.JInstruction;
import org.wso2.ballerinalang.compiler.bir.codegen.interop.JLargeArrayInstruction;
Expand Down Expand Up @@ -249,8 +250,8 @@
import static org.wso2.ballerinalang.compiler.bir.codegen.JvmSignatures.LONG_STREAM_RANGE_CLOSED;
import static org.wso2.ballerinalang.compiler.bir.codegen.JvmSignatures.OBJECT_TYPE_DUPLICATE;
import static org.wso2.ballerinalang.compiler.bir.codegen.JvmSignatures.OBJECT_TYPE_IMPL_INIT;
import static org.wso2.ballerinalang.compiler.bir.codegen.JvmSignatures.PASS_B_STRING_RETURN_UNBOXED_BOOLEAN;
import static org.wso2.ballerinalang.compiler.bir.codegen.JvmSignatures.PASS_B_STRING_RETURN_B_STRING;
import static org.wso2.ballerinalang.compiler.bir.codegen.JvmSignatures.PASS_B_STRING_RETURN_UNBOXED_BOOLEAN;
import static org.wso2.ballerinalang.compiler.bir.codegen.JvmSignatures.PASS_B_STRING_RETURN_UNBOXED_DOUBLE;
import static org.wso2.ballerinalang.compiler.bir.codegen.JvmSignatures.PASS_B_STRING_RETURN_UNBOXED_LONG;
import static org.wso2.ballerinalang.compiler.bir.codegen.JvmSignatures.PASS_OBJECT_RETURN_OBJECT;
Expand Down Expand Up @@ -295,7 +296,7 @@ public class JvmInstructionGen {
private final SymbolTable symbolTable;
private final AsyncDataCollector asyncDataCollector;
private final JvmTypeTestGen typeTestGen;
private final Map<String, String> functions;
private final Map<String, LambdaFunction> functions;
private final String moduleInitClass;

public JvmInstructionGen(MethodVisitor mv, BIRVarToJVMIndexMap indexMap, PackageID currentPackage,
Expand Down Expand Up @@ -1829,35 +1830,28 @@ private void reloadObjectCtorAnnots(BType type, int strandIndex) {
}

void generateFPLoadIns(BIRNonTerminator.FPLoad inst) {

this.mv.visitTypeInsn(NEW, FUNCTION_POINTER);
this.mv.visitInsn(DUP);

String name = inst.funcName.value;

String funcKey = inst.pkgId.toString() + ":" + name;
String lambdaName = functions.get(funcKey);
if (lambdaName == null) {
lambdaName = Utils.encodeFunctionIdentifier(inst.funcName.value) + "$lambda" +
asyncDataCollector.getLambdaIndex() + "$";
functions.put(funcKey, lambdaName);
}

asyncDataCollector.incrementLambdaIndex();

BType type = JvmCodeGenUtil.getImpliedType(inst.type);
if (type.tag != TypeTags.INVOKABLE) {
throw new BLangCompilerException("Expected BInvokableType, found " + type);
}

for (BIROperand operand : inst.closureMaps) {
if (operand != null) {
this.loadVar(operand.variableDcl);
}
}

JvmCodeGenUtil.visitInvokeDynamic(mv, asyncDataCollector.getEnclosingClass(), lambdaName,
inst.closureMaps.size());
LambdaFunction lambdaFunction = functions.get(funcKey);
if (lambdaFunction == null) {
lambdaFunction = asyncDataCollector.addAndGetLambda(name, inst, false);
}
JvmCodeGenUtil.visitInvokeDynamic(mv, lambdaFunction.enclosingClass, lambdaFunction.lambdaName,
inst.closureMaps.size());
// Need to remove once we fix #37875
type = inst.lhsOp.variableDcl.type.tag == TypeTags.TYPEREFDESC ? inst.lhsOp.variableDcl.type : type;

Expand Down Expand Up @@ -1891,7 +1885,6 @@ void generateFPLoadIns(BIRNonTerminator.FPLoad inst) {
PROCESS_FP_ANNOTATIONS, false);

this.storeToVar(inst.lhsOp.variableDcl);
asyncDataCollector.add(lambdaName, inst);
}

private void generateRecordDefaultFPLoadIns(BIRNonTerminator.RecordDefaultFPLoad inst) {
Expand Down
Loading

0 comments on commit fcab497

Please sign in to comment.