diff --git a/jre/java/super-wasm/java/lang/Class.java b/jre/java/super-wasm/java/lang/Class.java index a4840726f8..8dd7bfaa68 100644 --- a/jre/java/super-wasm/java/lang/Class.java +++ b/jre/java/super-wasm/java/lang/Class.java @@ -15,6 +15,8 @@ import java.io.Serializable; import java.lang.reflect.Type; +import java.util.HashMap; +import java.util.Map; import javaemul.internal.annotations.HasNoSideEffects; import jsinterop.annotations.JsMethod; @@ -43,6 +45,9 @@ public final class Class implements Type, Serializable { /** * Class objects for arrays of this type, created lazily. */ private Class[] arrayTypes; + /** Cache of boxed JsEnum values, created lazily. */ + private Map jsEnumsCache; + private Class( boolean isEnum, boolean isInterface, @@ -166,6 +171,14 @@ private String getClassName() { @JsMethod(namespace = "j2wasm.StringUtils") private static native String generateClassName(); + @HasNoSideEffects + public Map getJsEnumsCache() { + if (jsEnumsCache == null) { + jsEnumsCache = new HashMap<>(); + } + return jsEnumsCache; + } + private static String repeatString(String str, int count) { String rv = ""; for (int i = 0; i < count; i++) { diff --git a/jre/java/super-wasm/javaemul/internal/Enums.java b/jre/java/super-wasm/javaemul/internal/Enums.java index 7980c12256..e095ce4a82 100644 --- a/jre/java/super-wasm/javaemul/internal/Enums.java +++ b/jre/java/super-wasm/javaemul/internal/Enums.java @@ -16,11 +16,16 @@ package javaemul.internal; import static javaemul.internal.InternalPreconditions.checkCriticalNotNull; +import static javaemul.internal.InternalPreconditions.checkNotNull; +import static javaemul.internal.InternalPreconditions.checkType; +import java.io.Serializable; import java.util.HashMap; import java.util.Map; +import javaemul.internal.annotations.HasNoSideEffects; -class Enums { +/** Provides utilities to perform operations on enums. */ +public final class Enums { /** * @param values An array containing all instances of a particular enum type. @@ -43,4 +48,145 @@ public static V getValueFromNameAndMap(String name, Map map) { return enumValue; } + /** Base class for boxed representation of a JsEnum. */ + private abstract static class BoxedLightEnum implements Serializable { + // TODO(b/295235576): Model JS constructor refs or find an alternative, change + // to allow features like `getClass()`. Use string for now. + final Class clazz; + + BoxedLightEnum(Class clazz) { + this.clazz = clazz; + } + } + + /** Boxes a JsEnum value that does not support comparable. */ + private static BoxedIntegerEnum boxInteger(int value, Class clazz) { + if (isNull(value)) { + return null; + } + return getCachedInteger(clazz, value); + } + + /** Boxed representation of an int JsEnum. */ + private static class BoxedIntegerEnum extends BoxedLightEnum { + final int value; + + public BoxedIntegerEnum(int value, Class clazz) { + super(clazz); + this.value = value; + } + + public String toString() { + return Integer.toString(value); + } + } + + /** Boxes a JsEnum value that supports {@link Enum#compareTo} and {@link Enum#ordinal}. */ + public static BoxedComparableIntegerEnum boxComparableInteger(int value, Class clazz) { + if (isNull(value)) { + return null; + } + return getCachedComparableInteger(clazz, value); + } + + /** Boxed representation of a {@code Comparable<>} int JsEnum. */ + private static class BoxedComparableIntegerEnum extends BoxedIntegerEnum + implements Comparable { + public BoxedComparableIntegerEnum(int value, Class clazz) { + super(value, clazz); + } + + @Override + public int compareTo(BoxedComparableIntegerEnum o) { + checkType(clazz.equals(o.clazz)); + return Integer.compare(value, o.value); + } + } + + public static int unboxInteger(Object boxedEnum, Class clazz) { + if (boxedEnum == null) { + return Integer.MIN_VALUE; + } + checkType(isInstanceOf(boxedEnum, clazz)); + return ((BoxedIntegerEnum) boxedEnum).value; + } + + /** Boxes a JsEnum value that does not support comparable. */ + public static BoxedStringEnum boxString(String value, Class clazz) { + if (value == null) { + return null; + } + return getCachedString(clazz, value); + } + + /** Boxed representation of a String JsEnum. */ + public static class BoxedStringEnum extends BoxedLightEnum { + final String value; + + public BoxedStringEnum(String value, Class clazz) { + super(clazz); + this.value = value; + } + + public String toString() { + return value; + } + } + + public static String unboxString(Object boxedEnum, Class clazz) { + if (boxedEnum == null) { + return null; + } + checkType(isInstanceOf(boxedEnum, clazz)); + return ((BoxedStringEnum) boxedEnum).value; + } + + public static boolean isInstanceOf(Object instance, Class clazz) { + return instance instanceof BoxedLightEnum && ((BoxedLightEnum) instance).clazz.equals(clazz); + } + + public static boolean equalsInteger(int instance, int other) { + checkNotNull(!isNull(instance)); + return instance == other; + } + + public static boolean equalsString(String instance, String other) { + checkNotNull(instance); + return instance == other; + } + + public static int compareToInteger(int instance, int other) { + checkNotNull(!isNull(instance)); + return Integer.compare(instance, other); + } + + /** Returns {@code true} if the specified enum value is equivalent to null. */ + public static boolean isNull(int enumValue) { + return enumValue == Integer.MIN_VALUE; + } + + @HasNoSideEffects + private static BoxedIntegerEnum getCachedInteger(Class enumClass, int value) { + return (BoxedIntegerEnum) + enumClass + .getJsEnumsCache() + .computeIfAbsent(value, key -> new BoxedIntegerEnum(value, enumClass)); + } + + @HasNoSideEffects + private static BoxedComparableIntegerEnum getCachedComparableInteger( + Class enumClass, int value) { + return (BoxedComparableIntegerEnum) + enumClass + .getJsEnumsCache() + .computeIfAbsent(value, key -> new BoxedComparableIntegerEnum(value, enumClass)); + } + + @HasNoSideEffects + private static BoxedStringEnum getCachedString(Class enumClass, String value) { + return (BoxedStringEnum) + enumClass + .getJsEnumsCache() + .computeIfAbsent(value, key -> new BoxedStringEnum(value, enumClass)); + } } diff --git a/transpiler/java/com/google/j2cl/transpiler/ast/AstUtils.java b/transpiler/java/com/google/j2cl/transpiler/ast/AstUtils.java index 33a733fe8e..b63debd8f8 100644 --- a/transpiler/java/com/google/j2cl/transpiler/ast/AstUtils.java +++ b/transpiler/java/com/google/j2cl/transpiler/ast/AstUtils.java @@ -1015,6 +1015,12 @@ public static boolean isJsEnumCustomValueField(MemberDescriptor memberDescriptor && memberDescriptor.getEnclosingTypeDescriptor().isJsEnum(); } + public static boolean isPrimitiveNonNativeJsEnum(TypeDescriptor typeDescriptor) { + return typeDescriptor.isJsEnum() + && getJsEnumValueFieldType(((DeclaredTypeDescriptor) typeDescriptor).getTypeDeclaration()) + .isPrimitive(); + } + public static FieldDescriptor createJsEnumConstantFieldDescriptor( FieldDescriptor fieldDescriptor) { TypeDescriptor enumValueType = @@ -1027,6 +1033,11 @@ public static FieldDescriptor createJsEnumConstantFieldDescriptor( .build(); } + public static TypeDescriptor getJsEnumValueFieldType(TypeDescriptor typeDescriptor) { + checkState(typeDescriptor.isJsEnum()); + return getJsEnumValueFieldType(((DeclaredTypeDescriptor) typeDescriptor).getTypeDeclaration()); + } + /** Returns the value field for a JsEnum. */ public static TypeDescriptor getJsEnumValueFieldType(TypeDeclaration typeDeclaration) { FieldDescriptor valueFieldDescriptor = getJsEnumValueFieldDescriptor(typeDeclaration); @@ -1067,12 +1078,34 @@ public static boolean isNonNativeJsEnum(TypeDescriptor typeDescriptor) { return typeDescriptor.isJsEnum() && !typeDescriptor.isNative(); } + /** + * Returns true if {@code typeDescriptor} is a non native JsEnum, i.e. a JsEnum that requires + * boxing. + */ + public static boolean isNonNativeJsEnum(TypeDeclaration typeDeclaration) { + return typeDeclaration.isJsEnum() && !typeDeclaration.isNative(); + } + /** Returns true if {@code typeDescriptor} is a non native JsEnum array. */ public static boolean isNonNativeJsEnumArray(TypeDescriptor typeDescriptor) { return typeDescriptor.isArray() && isNonNativeJsEnum(((ArrayTypeDescriptor) typeDescriptor).getLeafTypeDescriptor()); } + /** Gets the initial value for a field or variable for the be assigned to a Wasm variable. */ + public static Expression getInitialValue(TypeDescriptor typeDescriptor) { + // JsEnum default values are special case. + // TODO(b/299984505): Is there a better way to do this? + if (isNonNativeJsEnum(typeDescriptor)) { + TypeDescriptor valueTypeDescriptor = getJsEnumValueFieldType(typeDescriptor); + return valueTypeDescriptor.isPrimitive() + ? valueTypeDescriptor.toBoxedType().getFieldDescriptor("MIN_VALUE").getConstantValue() + : valueTypeDescriptor.getDefaultValue(); + } + + return typeDescriptor.getDefaultValue(); + } + /** Returns a list of null values. */ public static List createListOfNullValues(int size) { return Collections.nCopies(size, TypeDescriptors.get().javaLangObject.getNullValue()); diff --git a/transpiler/java/com/google/j2cl/transpiler/ast/BinaryExpression.java b/transpiler/java/com/google/j2cl/transpiler/ast/BinaryExpression.java index 7e027433bd..7b64f9f97b 100644 --- a/transpiler/java/com/google/j2cl/transpiler/ast/BinaryExpression.java +++ b/transpiler/java/com/google/j2cl/transpiler/ast/BinaryExpression.java @@ -112,7 +112,11 @@ public boolean isCompileTimeConstant() { public boolean isReferenceComparison() { return (getOperator() == BinaryOperator.EQUALS || getOperator() == BinaryOperator.NOT_EQUALS) && !getLeftOperand().getTypeDescriptor().isPrimitive() - && !getRightOperand().getTypeDescriptor().isPrimitive(); + && !getRightOperand().getTypeDescriptor().isPrimitive() + // We use the value type in the case of JsEnums with the declaration descriptor to ignore + // specialization of type variables in case any boxing occurs. + && !AstUtils.isPrimitiveNonNativeJsEnum(getLeftOperand().getDeclaredTypeDescriptor()) + && !AstUtils.isPrimitiveNonNativeJsEnum(getRightOperand().getDeclaredTypeDescriptor()); } @Override diff --git a/transpiler/java/com/google/j2cl/transpiler/ast/RuntimeMethods.java b/transpiler/java/com/google/j2cl/transpiler/ast/RuntimeMethods.java index 064c2b0de6..b080efb5c1 100644 --- a/transpiler/java/com/google/j2cl/transpiler/ast/RuntimeMethods.java +++ b/transpiler/java/com/google/j2cl/transpiler/ast/RuntimeMethods.java @@ -226,59 +226,149 @@ public static Expression createEnumsBoxMethodCall(Expression value) { MethodDescriptor boxingMethod = TypeDescriptors.get().javaemulInternalEnums.getMethodDescriptorByName(boxingMethodName); - // boxing operations are parameterized by the JsEnum type, so specialize the method to the - // right type. - TypeVariable type = boxingMethod.getTypeParameterTypeDescriptors().get(0); - - // TODO(b/278167922): Probably the best thing to pass here in WASM is a method reference to - // class object getter, to avoid the eager creation of the class object upon boxing. The class - // object is only needed for cast and instanceof. But method references involve the - // instantiation of a lambda object which is even more costly. Fix once plain wasm function - // references can be modeled. + if (boxingMethod == null) { + // If the method isn't found, use the type-specific "boxInteger", etc, calls. + boxingMethod = + TypeDescriptors.get() + .javaemulInternalEnums + .getMethodDescriptorByName( + boxingMethodName + getEnumsMethodSuffix(valueTypeDescriptor)); + } else { + // Boxing operations are parameterized by the JsEnum type, so specialize the method to the + // right type. + TypeVariable type = boxingMethod.getTypeParameterTypeDescriptors().get(0); + boxingMethod = + boxingMethod.specializeTypeVariables(ImmutableMap.of(type, valueTypeDescriptor)); + } - // Decide how to pass the information about the actual enum class to the generic boxed - // representation by looking at the second parameter of the boxing function. In JS, the JS - // constructor is used as a proxy for the class object. - Expression typeLiteral = - TypeDescriptors.isJavaLangClass(boxingMethod.getParameterTypeDescriptors().get(1)) - ? new TypeLiteral(SourcePosition.NONE, valueTypeDescriptor) - : valueTypeDescriptor.getMetadataConstructorReference(); - return MethodCall.Builder.from( - boxingMethod.specializeTypeVariables(ImmutableMap.of(type, valueTypeDescriptor))) - .setArguments(value, typeLiteral) - .build(); + return createEnumsMethodCall(boxingMethod, value, valueTypeDescriptor); } /** Create a call to Enums.unbox. */ public static Expression createEnumsUnboxMethodCall( Expression expression, TypeDescriptor toTypeDescriptor) { + MethodDescriptor unboxingMethod = + TypeDescriptors.get().javaemulInternalEnums.getMethodDescriptorByName("unbox"); + + if (unboxingMethod == null) { + // If the method isn't found, use the type-specific "unboxInteger", etc, calls. + unboxingMethod = + TypeDescriptors.get() + .javaemulInternalEnums + .getMethodDescriptorByName("unbox" + getEnumsMethodSuffix(toTypeDescriptor)); + } + + return createEnumsMethodCall(unboxingMethod, expression, toTypeDescriptor); + } + + /** Create a call to Enums.isInstanceOf. */ + public static Expression createEnumsInstanceOfMethodCall( + Expression expression, TypeDescriptor testTypeDescriptor) { + MethodDescriptor methodDescriptor = + TypeDescriptors.get().javaemulInternalEnums.getMethodDescriptorByName("isInstanceOf"); return createEnumsMethodCall( - "unbox", expression, toTypeDescriptor.getMetadataConstructorReference()); + methodDescriptor, expression, testTypeDescriptor.toUnparameterizedTypeDescriptor()); } public static Expression createEnumsEqualsMethodCall(Expression instance, Expression other) { checkArgument( instance.getTypeDescriptor().isJsEnum() && instance.getTypeDescriptor().hasSameRawType(other.getTypeDescriptor())); - - return createEnumsMethodCall("equals", instance, other); + return createEnumsMethodCallCastIfNeeded( + "equals", instance.getTypeDescriptor(), instance, other); } public static Expression createEnumsCompareToMethodCall(Expression instance, Expression other) { checkArgument( AstUtils.isNonNativeJsEnum(instance.getTypeDescriptor()) && instance.getTypeDescriptor().hasSameRawType(other.getTypeDescriptor())); + return createEnumsMethodCallCastIfNeeded( + "compareTo", instance.getTypeDescriptor(), instance, other); + } + + public static Expression createEnumsMethodCall(String methodName, Expression... arguments) { + MethodDescriptor methodDescriptor = + TypeDescriptors.get().javaemulInternalEnums.getMethodDescriptorByName(methodName); + + return MethodCall.Builder.from(methodDescriptor).setArguments(arguments).build(); + } - return createEnumsMethodCall("compareTo", instance, other); + /** + * Creates a call to the specified method with the provided expression as the first argument and a + * type literal or constructor reference as the second argument. + */ + private static Expression createEnumsMethodCall( + MethodDescriptor methodDescriptor, Expression value, TypeDescriptor valueTypeDescriptor) { + // TODO(b/278167922): Probably the best thing to pass here in WASM is a method reference to + // class object getter, to avoid the eager creation of the class object upon boxing. The class + // object is only needed for cast and instanceof. But method references involve the + // instantiation of a lambda object which is even more costly. Fix once plain wasm function + // references can be modeled. + + // Decide how to pass the information about the actual enum class by looking at the second + // parameter of the function. In JS, the JS constructor is used as a proxy for the class object. + Expression typeLiteral = + TypeDescriptors.isJavaLangClass(methodDescriptor.getParameterTypeDescriptors().get(1)) + ? new TypeLiteral(SourcePosition.NONE, valueTypeDescriptor) + : valueTypeDescriptor.getMetadataConstructorReference(); + return MethodCall.Builder.from(methodDescriptor).setArguments(value, typeLiteral).build(); } - public static Expression createEnumsMethodCall(String unbox, Expression... arguments) { + private static Expression createEnumsMethodCallCastIfNeeded( + String methodName, TypeDescriptor enumTypeDescriptor, Expression... arguments) { MethodDescriptor methodDescriptor = - TypeDescriptors.get().javaemulInternalEnums.getMethodDescriptorByName(unbox); + TypeDescriptors.get().javaemulInternalEnums.getMethodDescriptorByName(methodName); + + if (methodDescriptor == null) { + // If the method isn't found, try to find the method with type-specific suffix. This method + // takes the value types as arguments and will need the enum value to be cast to the enum + // value type to preserve correct boxing/unboxing behavior. + methodDescriptor = + TypeDescriptors.get() + .javaemulInternalEnums + .getMethodDescriptorByName(methodName + getEnumsMethodSuffix(enumTypeDescriptor)); + arguments = + stream(arguments).map(RuntimeMethods::castJsEnumToValue).toArray(Expression[]::new); + } return MethodCall.Builder.from(methodDescriptor).setArguments(arguments).build(); } + private static Expression castJsEnumToValue(Expression jsEnumExpression) { + // Preserve type consistency by inserting two casts. If we have the following expression + // + // getEnum() + // + // It is changed to: + // + // /** @type {int} */ ((MyJsEnum) getEnum()) + // + // The inner Java cast to MyJsEnum guarantees that any conversion for getEnum() is preserved. + // (e.g. in the case of erasure casts if getEnum() returned T and was specialized to MyJsEnum in + // the calling context, this allows unboxing to take place). + // The outer JsDoc cast guarantees that the expression is treated as of being the type of value + // and conversions such as boxing are correctly preserved (e.g. if the expression was assigned + // to an Integer variable). + return JsDocCastExpression.newBuilder() + .setCastType(AstUtils.getJsEnumValueFieldType(jsEnumExpression.getTypeDescriptor())) + .setExpression( + CastExpression.newBuilder() + .setCastTypeDescriptor(jsEnumExpression.getTypeDescriptor()) + // AstUtils.getJsEnumValueFieldType(jsEnumExpression.getTypeDescriptor())) + .setExpression(jsEnumExpression) + .build()) + .build(); + } + + private static String getEnumsMethodSuffix(TypeDescriptor toTypeDescriptor) { + TypeDescriptor valueTypeDescriptor = AstUtils.getJsEnumValueFieldType(toTypeDescriptor); + if (valueTypeDescriptor.isPrimitive()) { + return ((PrimitiveTypeDescriptor) valueTypeDescriptor).toBoxedType().getSimpleSourceName(); + } + checkArgument(TypeDescriptors.isJavaLangString(valueTypeDescriptor)); + return "String"; + } + /** Create a call to an Equality method. */ public static MethodCall createEqualityMethodCall(String methodName, Expression... arguments) { return createEqualityMethodCall(methodName, asList(arguments)); @@ -489,6 +579,17 @@ public static Expression createPrimitivesWideningMethodCall( return createPrimitivesMethodCall(methodName, expression); } + public static Expression createEnumsIsNullCall(Expression reference) { + TypeDescriptor valueTypeDescriptor = + AstUtils.getJsEnumValueFieldType(reference.getTypeDescriptor()); + return MethodCall.Builder.from( + TypeDescriptors.get() + .javaemulInternalEnums + .getMethodDescriptor("isNull", valueTypeDescriptor)) + .setArguments(reference) + .build(); + } + public static Expression createPlatformIsNullCall(Expression reference) { return MethodCall.Builder.from( TypeDescriptors.get().javaemulInternalPlatform.getMethodDescriptorByName("isNull")) diff --git a/transpiler/java/com/google/j2cl/transpiler/ast/TypeDeclaration.java b/transpiler/java/com/google/j2cl/transpiler/ast/TypeDeclaration.java index 6a8002d595..aefa838ae8 100644 --- a/transpiler/java/com/google/j2cl/transpiler/ast/TypeDeclaration.java +++ b/transpiler/java/com/google/j2cl/transpiler/ast/TypeDeclaration.java @@ -980,6 +980,7 @@ public TypeDeclaration build() { // TODO(b/288145698): Support native JsEnum. if (isNative()) { setJsEnumInfo(null); + setNative(false); break; } // fall through diff --git a/transpiler/java/com/google/j2cl/transpiler/ast/TypeDescriptors.java b/transpiler/java/com/google/j2cl/transpiler/ast/TypeDescriptors.java index a1dbf53f4c..54201aaed4 100644 --- a/transpiler/java/com/google/j2cl/transpiler/ast/TypeDescriptors.java +++ b/transpiler/java/com/google/j2cl/transpiler/ast/TypeDescriptors.java @@ -152,6 +152,18 @@ public class TypeDescriptors { @QualifiedBinaryName("javaemul.internal.Enums$BoxedComparableLightEnum") public DeclaredTypeDescriptor javaemulInternalBoxedComparableLightEnum; + @Nullable + @QualifiedBinaryName("javaemul.internal.Enums$BoxedIntegerEnum") + public DeclaredTypeDescriptor javaemulInternalBoxedIntegerEnum; + + @Nullable + @QualifiedBinaryName("javaemul.internal.Enums$BoxedComparableIntegerEnum") + public DeclaredTypeDescriptor javaemulInternalBoxedComparableIntegerEnum; + + @Nullable + @QualifiedBinaryName("javaemul.internal.Enums$BoxedStringEnum") + public DeclaredTypeDescriptor javaemulInternalBoxedStringEnum; + @Nullable public DeclaredTypeDescriptor javaemulInternalConstructor; @Nullable public DeclaredTypeDescriptor javaemulInternalPlatform; public DeclaredTypeDescriptor javaemulInternalExceptions; @@ -419,6 +431,9 @@ public static boolean isWasmArraySubtype(TypeDescriptor typeDescriptor) { public static TypeDescriptor getEnumBoxType(TypeDescriptor typeDescriptor) { checkState(AstUtils.isNonNativeJsEnum(typeDescriptor)); + if (TypeDescriptors.get().javaemulInternalBoxedComparableLightEnum == null) { + return getEnumBoxTypeNonparameterized(typeDescriptor); + } TypeDescriptor boxType = typeDescriptor.getJsEnumInfo().supportsComparable() ? TypeDescriptors.get().javaemulInternalBoxedComparableLightEnum @@ -430,6 +445,19 @@ public static TypeDescriptor getEnumBoxType(TypeDescriptor typeDescriptor) { return typeDescriptor.isNullable() ? specializedType : specializedType.toNonNullable(); } + private static TypeDescriptor getEnumBoxTypeNonparameterized(TypeDescriptor typeDescriptor) { + TypeDescriptor valueType = AstUtils.getJsEnumValueFieldType(typeDescriptor); + boolean supportsComparable = typeDescriptor.getJsEnumInfo().supportsComparable(); + if (isPrimitiveInt(valueType)) { + return supportsComparable + ? TypeDescriptors.get().javaemulInternalBoxedComparableIntegerEnum + : TypeDescriptors.get().javaemulInternalBoxedIntegerEnum; + } else if (isJavaLangString(valueType)) { + return TypeDescriptors.get().javaemulInternalBoxedStringEnum; + } + throw new IllegalArgumentException("Unknown enum type: " + valueType.getReadableDescription()); + } + /** Gets the type descriptor representing a native string. */ // TODO(b/257574608): This can be refactored along with improvements to well-known types. public static TypeDescriptor getNativeStringType() { @@ -571,6 +599,10 @@ public static ImmutableList toUnparameterizedTypeD public static DeclaredTypeDescriptor getWasmArrayType(ArrayTypeDescriptor arrayTypeDescriptor) { TypeDescriptor componentTypeDescriptor = arrayTypeDescriptor.getComponentTypeDescriptor(); + if (AstUtils.isNonNativeJsEnumArray(arrayTypeDescriptor)) { + componentTypeDescriptor = AstUtils.getJsEnumValueFieldType(componentTypeDescriptor); + } + if (!componentTypeDescriptor.isPrimitive()) { return TypeDescriptors.get().javaemulInternalWasmArrayOfObject; } diff --git a/transpiler/java/com/google/j2cl/transpiler/backend/Backend.java b/transpiler/java/com/google/j2cl/transpiler/backend/Backend.java index 75bdd1761f..edd03aefc6 100644 --- a/transpiler/java/com/google/j2cl/transpiler/backend/Backend.java +++ b/transpiler/java/com/google/j2cl/transpiler/backend/Backend.java @@ -113,6 +113,7 @@ import com.google.j2cl.transpiler.passes.NormalizeInterfaces; import com.google.j2cl.transpiler.passes.NormalizeJsAwaitMethodInvocations; import com.google.j2cl.transpiler.passes.NormalizeJsDocCastExpressions; +import com.google.j2cl.transpiler.passes.NormalizeJsEnumInstanceOfAndCasts; import com.google.j2cl.transpiler.passes.NormalizeJsEnums; import com.google.j2cl.transpiler.passes.NormalizeJsFunctionPropertyInvocations; import com.google.j2cl.transpiler.passes.NormalizeJsVarargs; @@ -160,6 +161,7 @@ import com.google.j2cl.transpiler.passes.ResolveImplicitStaticQualifiers; import com.google.j2cl.transpiler.passes.RestoreVariableScoping; import com.google.j2cl.transpiler.passes.RewriteAssignmentExpressions; +import com.google.j2cl.transpiler.passes.RewriteJsEnumNullChecks; import com.google.j2cl.transpiler.passes.RewriteReferenceEqualityOperations; import com.google.j2cl.transpiler.passes.RewriteShortcutOperators; import com.google.j2cl.transpiler.passes.RewriteUnaryExpressions; @@ -396,6 +398,8 @@ public ImmutableList> getPassFactories(BackendOption NormalizeTryWithResources::new, NormalizeCatchClauses::new, () -> new NormalizeEnumClasses(/* useMakeEnumNameIndirection= */ false), + // Must run after NormalizeEnumClasses and before NormalizeOverlayMembers. + NormalizeJsEnums::new, NormalizeOverlayMembers::new, NormalizeInstanceCompileTimeConstants::new, () -> new NormalizeShifts(/* narrowAllToInt= */ false), @@ -413,14 +417,22 @@ public ImmutableList> getPassFactories(BackendOption StaticallyEvaluateStringConcatenation::new, StaticallyEvaluateStringComparison::new, ImplementStringConcatenation::new, - // TODO(b/288145845): Add InsertJsEnumBoxingAndUnboxingConversions here. - // Must run after InsertJsEnumBoxingAndUnboxingConversions. + // Must run after NormalizeSwitchStatements, ImplementStringConcatenation. + InsertJsEnumBoxingAndUnboxingConversions::new, PropagateJsEnumConstants::new, InsertNarrowingReferenceConversions::new, () -> new InsertUnboxingConversions(/* areBooleanAndDoubleBoxed= */ true), () -> new InsertBoxingConversions(/* areBooleanAndDoubleBoxed= */ true), () -> new InsertNarrowingPrimitiveConversions(/* treatFloatAsDouble= */ false), () -> new InsertWideningPrimitiveConversions(/* needFloatOrDoubleWidening= */ true), + // Must run after primitive conversions, otherwise it will remove int conversions. + // Must run before RewriteReferenceEqualityOperations, because it could introduce null + // checks. + NormalizeJsEnumInstanceOfAndCasts::new, + // Rewrite 'a != b' to '!(a == b)' + // Must run after InsertJsEnumBoxingAndUnboxingConversions. + RewriteReferenceEqualityOperations::new, + RewriteJsEnumNullChecks::new, ImplementDivisionOperations::new, ImplementFloatingPointRemainderOperation::new, // Rewrite 'a || b' into 'a ? true : b' and 'a && b' into 'a ? b : false' @@ -535,6 +547,8 @@ public ImmutableList> getPassFactories(BackendOption NormalizeTryWithResources::new, NormalizeCatchClauses::new, () -> new NormalizeEnumClasses(/* useMakeEnumNameIndirection= */ false), + // Must run after NormalizeEnumClasses + NormalizeJsEnums::new, NormalizeOverlayMembers::new, NormalizeInstanceCompileTimeConstants::new, () -> new NormalizeShifts(/* narrowAllToInt= */ false), @@ -552,14 +566,22 @@ public ImmutableList> getPassFactories(BackendOption StaticallyEvaluateStringConcatenation::new, StaticallyEvaluateStringComparison::new, ImplementStringConcatenation::new, - // TODO(b/288145845): Add InsertJsEnumBoxingAndUnboxingConversions here. - // Must run after InsertJsEnumBoxingAndUnboxingConversions. + // Must run after NormalizeSwitchStatements, ImplementStringConcatenation. + InsertJsEnumBoxingAndUnboxingConversions::new, PropagateJsEnumConstants::new, InsertNarrowingReferenceConversions::new, () -> new InsertUnboxingConversions(/* areBooleanAndDoubleBoxed= */ true), () -> new InsertBoxingConversions(/* areBooleanAndDoubleBoxed= */ true), () -> new InsertNarrowingPrimitiveConversions(/* treatFloatAsDouble= */ false), () -> new InsertWideningPrimitiveConversions(/* needFloatOrDoubleWidening= */ true), + // Must run after primitive conversions, otherwise it will remove int conversions. + // Must run before RewriteReferenceEqualityOperations, because it could introduce null + // checks. + NormalizeJsEnumInstanceOfAndCasts::new, + // Rewrite 'a != b' to '!(a == b)' + // Must run after InsertJsEnumBoxingAndUnboxingConversions. + RewriteReferenceEqualityOperations::new, + RewriteJsEnumNullChecks::new, ImplementDivisionOperations::new, ImplementFloatingPointRemainderOperation::new, // Rewrite 'a || b' into 'a ? true : b' and 'a && b' into 'a ? b : false' diff --git a/transpiler/java/com/google/j2cl/transpiler/backend/wasm/ExpressionTranspiler.java b/transpiler/java/com/google/j2cl/transpiler/backend/wasm/ExpressionTranspiler.java index 3993fe9351..0db4889024 100644 --- a/transpiler/java/com/google/j2cl/transpiler/backend/wasm/ExpressionTranspiler.java +++ b/transpiler/java/com/google/j2cl/transpiler/backend/wasm/ExpressionTranspiler.java @@ -29,6 +29,7 @@ import com.google.j2cl.transpiler.ast.ArrayAccess; import com.google.j2cl.transpiler.ast.ArrayLength; import com.google.j2cl.transpiler.ast.ArrayLiteral; +import com.google.j2cl.transpiler.ast.AstUtils; import com.google.j2cl.transpiler.ast.BinaryExpression; import com.google.j2cl.transpiler.ast.BooleanLiteral; import com.google.j2cl.transpiler.ast.CastExpression; @@ -410,7 +411,8 @@ public boolean enterNewInstance(NewInstance newInstance) { .forEach( fieldDescriptor -> { sourceBuilder.append(" "); - Expression initialValue = fieldDescriptor.getTypeDescriptor().getDefaultValue(); + Expression initialValue = + AstUtils.getInitialValue(fieldDescriptor.getTypeDescriptor()); // TODO(b/296475021): Cleanup the handling of the elements field. if (environment.isWasmArrayElementsField(fieldDescriptor)) { // The initialization of the elements field in a wasm array is synthesized from diff --git a/transpiler/java/com/google/j2cl/transpiler/backend/wasm/StatementTranspiler.java b/transpiler/java/com/google/j2cl/transpiler/backend/wasm/StatementTranspiler.java index 4360fb1256..b319f7f8e8 100644 --- a/transpiler/java/com/google/j2cl/transpiler/backend/wasm/StatementTranspiler.java +++ b/transpiler/java/com/google/j2cl/transpiler/backend/wasm/StatementTranspiler.java @@ -23,6 +23,7 @@ import com.google.common.math.Stats; import com.google.j2cl.common.SourcePosition; import com.google.j2cl.transpiler.ast.AbstractVisitor; +import com.google.j2cl.transpiler.ast.AstUtils; import com.google.j2cl.transpiler.ast.Block; import com.google.j2cl.transpiler.ast.BooleanLiteral; import com.google.j2cl.transpiler.ast.BreakStatement; @@ -45,6 +46,7 @@ import com.google.j2cl.transpiler.ast.SynchronizedStatement; import com.google.j2cl.transpiler.ast.ThrowStatement; import com.google.j2cl.transpiler.ast.TryStatement; +import com.google.j2cl.transpiler.ast.TypeDescriptor; import com.google.j2cl.transpiler.ast.TypeDescriptors; import com.google.j2cl.transpiler.ast.WhileStatement; import com.google.j2cl.transpiler.backend.common.SourceBuilder; @@ -207,7 +209,7 @@ public boolean enterSwitchStatement(SwitchStatement switchStatement) { } private void renderSwitchDispatchTable(SwitchStatement switchStatement) { - if (switchStatement.getSwitchExpression().getTypeDescriptor().isPrimitive()) { + if (isPrimitiveOrJsEnum(switchStatement.getSwitchExpression().getTypeDescriptor())) { Stats stats = Stats.of( switchStatement.getCases().stream() @@ -221,6 +223,10 @@ private void renderSwitchDispatchTable(SwitchStatement switchStatement) { renderNonDenseSwitchDispatchTable(switchStatement); } + private boolean isPrimitiveOrJsEnum(TypeDescriptor typeDescriptor) { + return typeDescriptor.isPrimitive() || AstUtils.isPrimitiveNonNativeJsEnum(typeDescriptor); + } + /** * The minimum ratio between used case slots and total case slots to consider a switch dense. * Emitting br_table with a quarter of the slots empty is still shorter than emitting a nest diff --git a/transpiler/java/com/google/j2cl/transpiler/backend/wasm/WasmBinaryOperation.java b/transpiler/java/com/google/j2cl/transpiler/backend/wasm/WasmBinaryOperation.java index fb9072e7fe..4e81660b10 100644 --- a/transpiler/java/com/google/j2cl/transpiler/backend/wasm/WasmBinaryOperation.java +++ b/transpiler/java/com/google/j2cl/transpiler/backend/wasm/WasmBinaryOperation.java @@ -21,6 +21,7 @@ import com.google.common.base.Ascii; import com.google.common.collect.ImmutableMap; +import com.google.j2cl.transpiler.ast.AstUtils; import com.google.j2cl.transpiler.ast.BinaryExpression; import com.google.j2cl.transpiler.ast.BinaryOperator; import com.google.j2cl.transpiler.ast.TypeDescriptor; @@ -58,6 +59,10 @@ public enum WasmBinaryOperation { public String getInstruction(BinaryExpression expression) { TypeDescriptor operandType = getOperandType(expression); + // For JsEnums, we emit the value type. + if (AstUtils.isPrimitiveNonNativeJsEnum(operandType)) { + operandType = AstUtils.getJsEnumValueFieldType(operandType); + } String prefix = operandType.isPrimitive() ? getWasmTypeForPrimitive(operandType) : "ref"; String suffix = isPrimitiveFloatOrDouble(operandType) ? "" : integerSuffix; return prefix + "." + Ascii.toLowerCase(name()) + suffix; diff --git a/transpiler/java/com/google/j2cl/transpiler/backend/wasm/WasmConstructsGenerator.java b/transpiler/java/com/google/j2cl/transpiler/backend/wasm/WasmConstructsGenerator.java index 0c816967f7..5ac349b7ec 100644 --- a/transpiler/java/com/google/j2cl/transpiler/backend/wasm/WasmConstructsGenerator.java +++ b/transpiler/java/com/google/j2cl/transpiler/backend/wasm/WasmConstructsGenerator.java @@ -25,6 +25,7 @@ import com.google.j2cl.transpiler.ast.AbstractVisitor; import com.google.j2cl.transpiler.ast.ArrayLiteral; import com.google.j2cl.transpiler.ast.ArrayTypeDescriptor; +import com.google.j2cl.transpiler.ast.AstUtils; import com.google.j2cl.transpiler.ast.DeclaredTypeDescriptor; import com.google.j2cl.transpiler.ast.Expression; import com.google.j2cl.transpiler.ast.Field; @@ -236,7 +237,9 @@ void renderModularTypeStructs(Type type) { } private void renderTypeStructs(Type type, boolean isModular) { - if (type.isNative() || type.getDeclaration().getWasmInfo() != null) { + if (type.isNative() + || type.getDeclaration().getWasmInfo() != null + || AstUtils.isNonNativeJsEnum(type.getTypeDescriptor())) { return; } if (type.isInterface()) { @@ -301,6 +304,9 @@ private void emitStaticFieldGlobals(Library library) { } private void emitStaticFieldGlobals(Type type) { + if (AstUtils.isNonNativeJsEnum(type.getTypeDescriptor())) { + return; + } emitBeginCodeComment(type, "static fields"); for (Field field : type.getStaticFields()) { builder.newLine(); @@ -320,7 +326,9 @@ private void emitStaticFieldGlobals(Type type) { builder.indent(); builder.newLine(); ExpressionTranspiler.render( - field.getDescriptor().getTypeDescriptor().getDefaultValue(), builder, environment); + AstUtils.getInitialValue(field.getDescriptor().getTypeDescriptor()), + builder, + environment); builder.unindent(); } @@ -331,6 +339,9 @@ private void emitStaticFieldGlobals(Type type) { } void renderTypeMethods(Type type) { + if (AstUtils.isNonNativeJsEnum(type.getTypeDescriptor())) { + return; + } type.getMethods().stream() .filter(method -> !method.isAbstract() || method.isNative()) .filter(m -> m.getDescriptor().getWasmInfo() == null) @@ -535,6 +546,7 @@ void emitDispatchTablesInitialization(Library library) { .map(Type::getDeclaration) .filter(not(TypeDeclaration::isAbstract)) .filter(type -> type.getWasmInfo() == null) + .filter(not(AstUtils::isNonNativeJsEnum)) .forEach(this::emitDispatchTablesInitialization); builder.newLine(); } diff --git a/transpiler/java/com/google/j2cl/transpiler/backend/wasm/WasmGenerationEnvironment.java b/transpiler/java/com/google/j2cl/transpiler/backend/wasm/WasmGenerationEnvironment.java index 1b9c17855e..14470ee20a 100644 --- a/transpiler/java/com/google/j2cl/transpiler/backend/wasm/WasmGenerationEnvironment.java +++ b/transpiler/java/com/google/j2cl/transpiler/backend/wasm/WasmGenerationEnvironment.java @@ -31,6 +31,7 @@ import com.google.common.collect.SetMultimap; import com.google.j2cl.transpiler.ast.ArrayLiteral; import com.google.j2cl.transpiler.ast.ArrayTypeDescriptor; +import com.google.j2cl.transpiler.ast.AstUtils; import com.google.j2cl.transpiler.ast.DeclaredTypeDescriptor; import com.google.j2cl.transpiler.ast.Field; import com.google.j2cl.transpiler.ast.FieldDescriptor; @@ -113,12 +114,22 @@ WasmTypeLayout getWasmTypeLayout(TypeDeclaration typeDeclaration) { } String getWasmType(TypeDescriptor typeDescriptor) { + if (typeDescriptor.isJsEnum()) { + return getWasmEnumType(typeDescriptor); + } if (typeDescriptor.isPrimitive()) { return getWasmTypeForPrimitive(typeDescriptor); } return "(ref null " + getWasmTypeName(typeDescriptor) + ")"; } + String getWasmEnumType(TypeDescriptor typeDescriptor) { + TypeDeclaration typeDeclaration = + ((DeclaredTypeDescriptor) typeDescriptor).getTypeDeclaration(); + TypeDescriptor valueFieldType = AstUtils.getJsEnumValueFieldType(typeDeclaration); + return getWasmType(valueFieldType); + } + /** * Returns the type to be used in a context of Struct or Array which can be potentially a packed * type. (WasmGC supports packed types only in limited contexts) diff --git a/transpiler/java/com/google/j2cl/transpiler/passes/ImplementStaticInitializationBase.java b/transpiler/java/com/google/j2cl/transpiler/passes/ImplementStaticInitializationBase.java index 60a9684cd1..ae4ee6e330 100644 --- a/transpiler/java/com/google/j2cl/transpiler/passes/ImplementStaticInitializationBase.java +++ b/transpiler/java/com/google/j2cl/transpiler/passes/ImplementStaticInitializationBase.java @@ -19,6 +19,7 @@ import com.google.j2cl.common.SourcePosition; import com.google.j2cl.transpiler.ast.AbstractRewriter; import com.google.j2cl.transpiler.ast.AbstractVisitor; +import com.google.j2cl.transpiler.ast.AstUtils; import com.google.j2cl.transpiler.ast.Block; import com.google.j2cl.transpiler.ast.CompilationUnit; import com.google.j2cl.transpiler.ast.DeclaredTypeDescriptor; @@ -171,6 +172,12 @@ boolean triggersClinit(MemberDescriptor memberDescriptor, Type enclosingType) { return false; } + if (memberDescriptor.isEnumConstant() + && AstUtils.isNonNativeJsEnum(memberDescriptor.getEnclosingTypeDescriptor())) { + // Skip accesses to JsEnum constants. This may not be normalized out on all backends. + return false; + } + if (memberDescriptor.isCompileTimeConstant()) { // Compile time constants do not trigger clinit. return false; diff --git a/transpiler/java/com/google/j2cl/transpiler/passes/InsertBoxingConversions.java b/transpiler/java/com/google/j2cl/transpiler/passes/InsertBoxingConversions.java index 11fc68348c..ba2863b69a 100644 --- a/transpiler/java/com/google/j2cl/transpiler/passes/InsertBoxingConversions.java +++ b/transpiler/java/com/google/j2cl/transpiler/passes/InsertBoxingConversions.java @@ -15,7 +15,7 @@ */ package com.google.j2cl.transpiler.passes; - +import com.google.j2cl.transpiler.ast.AstUtils; import com.google.j2cl.transpiler.ast.CastExpression; import com.google.j2cl.transpiler.ast.CompilationUnit; import com.google.j2cl.transpiler.ast.Expression; @@ -119,7 +119,9 @@ private boolean needsBoxing(TypeDescriptor toTypeDescriptor, TypeDescriptor from return !TypeDescriptors.isNonVoidPrimitiveType(toTypeDescriptor) && TypeDescriptors.isNonVoidPrimitiveType(fromTypeDescriptor) && (areBooleanAndDoubleBoxed - || !TypeDescriptors.isPrimitiveBooleanOrDouble(fromTypeDescriptor)); + || !TypeDescriptors.isPrimitiveBooleanOrDouble(fromTypeDescriptor)) + // Boxing/unboxing for JsEnum is done in another pass. + && !AstUtils.isNonNativeJsEnum(toTypeDescriptor); } private static Expression maybeNarrowNumberLiteral( diff --git a/transpiler/java/com/google/j2cl/transpiler/passes/NormalizeJsEnumInstanceOfAndCasts.java b/transpiler/java/com/google/j2cl/transpiler/passes/NormalizeJsEnumInstanceOfAndCasts.java new file mode 100644 index 0000000000..1ec0a587c7 --- /dev/null +++ b/transpiler/java/com/google/j2cl/transpiler/passes/NormalizeJsEnumInstanceOfAndCasts.java @@ -0,0 +1,75 @@ +/* + * Copyright 2023 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package com.google.j2cl.transpiler.passes; + +import com.google.j2cl.transpiler.ast.AbstractRewriter; +import com.google.j2cl.transpiler.ast.AstUtils; +import com.google.j2cl.transpiler.ast.CastExpression; +import com.google.j2cl.transpiler.ast.CompilationUnit; +import com.google.j2cl.transpiler.ast.Expression; +import com.google.j2cl.transpiler.ast.InstanceOfExpression; +import com.google.j2cl.transpiler.ast.JsDocCastExpression; +import com.google.j2cl.transpiler.ast.Node; +import com.google.j2cl.transpiler.ast.RuntimeMethods; +import com.google.j2cl.transpiler.ast.TypeDescriptor; + +/** + * Replaces instanceof expression with corresponding $isInstance method call for JsEnums, and + * removes unnecessary casts. + */ +public class NormalizeJsEnumInstanceOfAndCasts extends NormalizationPass { + @Override + public void applyTo(CompilationUnit compilationUnit) { + compilationUnit.accept( + new AbstractRewriter() { + @Override + public Node rewriteInstanceOfExpression(InstanceOfExpression expression) { + if (!AstUtils.isNonNativeJsEnum(expression.getTestTypeDescriptor())) { + return expression; + } + + // Replace trivial instanceof expression with a null check. + Expression subject = expression.getExpression(); + if (subject.getTypeDescriptor().isAssignableTo(expression.getTestTypeDescriptor())) { + return RuntimeMethods.createEnumsBoxMethodCall(subject).infixNotEqualsNull(); + } + + return RuntimeMethods.createEnumsInstanceOfMethodCall( + subject, expression.getTestTypeDescriptor()); + } + + @Override + public Expression rewriteJsDocCastExpression(JsDocCastExpression expression) { + if (shouldRemoveCast(expression.getTypeDescriptor())) { + return expression.getExpression(); + } + return expression; + } + + @Override + public Expression rewriteCastExpression(CastExpression expression) { + if (shouldRemoveCast(expression.getCastTypeDescriptor())) { + return expression.getExpression(); + } + return expression; + } + }); + } + + private static boolean shouldRemoveCast(TypeDescriptor toTypeDescriptor) { + return toTypeDescriptor.isPrimitive() || AstUtils.isNonNativeJsEnum(toTypeDescriptor); + } +} diff --git a/transpiler/java/com/google/j2cl/transpiler/passes/NormalizeNullLiterals.java b/transpiler/java/com/google/j2cl/transpiler/passes/NormalizeNullLiterals.java index 4c3c00c5f5..d7c433bc9e 100644 --- a/transpiler/java/com/google/j2cl/transpiler/passes/NormalizeNullLiterals.java +++ b/transpiler/java/com/google/j2cl/transpiler/passes/NormalizeNullLiterals.java @@ -15,10 +15,12 @@ */ package com.google.j2cl.transpiler.passes; +import com.google.j2cl.transpiler.ast.AstUtils; import com.google.j2cl.transpiler.ast.CompilationUnit; import com.google.j2cl.transpiler.ast.Expression; import com.google.j2cl.transpiler.ast.NullLiteral; import com.google.j2cl.transpiler.ast.TypeDescriptor; +import com.google.j2cl.transpiler.ast.TypeDescriptors; import com.google.j2cl.transpiler.passes.ConversionContextVisitor.ContextRewriter; /** @@ -38,6 +40,14 @@ public Expression rewriteTypeConversionContext( TypeDescriptor actualTypeDescriptor, Expression expression) { if (expression instanceof NullLiteral) { + if (AstUtils.isNonNativeJsEnum(inferredTypeDescriptor)) { + // JsEnums types are removed, so this should be the boxed type. j.l.Object also + // works because boxed js enum types are never explicitly referred to in method + // signatures, and the only other types they can be passed as is Comparable and + // Serializable which are interfaces and modeled in the backend as + // java.lang.Object. + return TypeDescriptors.get().javaLangObject.getDefaultValue(); + } return inferredTypeDescriptor.getDefaultValue(); } return expression; diff --git a/transpiler/java/com/google/j2cl/transpiler/passes/RewriteJsEnumNullChecks.java b/transpiler/java/com/google/j2cl/transpiler/passes/RewriteJsEnumNullChecks.java new file mode 100644 index 0000000000..a5bc88cf89 --- /dev/null +++ b/transpiler/java/com/google/j2cl/transpiler/passes/RewriteJsEnumNullChecks.java @@ -0,0 +1,72 @@ +/* + * Copyright 2023 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package com.google.j2cl.transpiler.passes; + +import static com.google.common.base.Preconditions.checkArgument; + +import com.google.j2cl.transpiler.ast.AbstractRewriter; +import com.google.j2cl.transpiler.ast.AstUtils; +import com.google.j2cl.transpiler.ast.BinaryExpression; +import com.google.j2cl.transpiler.ast.BinaryOperator; +import com.google.j2cl.transpiler.ast.Expression; +import com.google.j2cl.transpiler.ast.Library; +import com.google.j2cl.transpiler.ast.NullLiteral; +import com.google.j2cl.transpiler.ast.RuntimeMethods; + +/** Rewrites null checks for JsEnum values for Wasm. */ +public class RewriteJsEnumNullChecks extends LibraryNormalizationPass { + + @Override + public void applyTo(Library library) { + library.accept( + new AbstractRewriter() { + @Override + public Expression rewriteBinaryExpression(BinaryExpression expression) { + if (expression.getOperator() != BinaryOperator.EQUALS + && expression.getOperator() != BinaryOperator.NOT_EQUALS) { + return expression; + } + + if (!AstUtils.isPrimitiveNonNativeJsEnum( + expression.getLeftOperand().getTypeDescriptor()) + && !AstUtils.isPrimitiveNonNativeJsEnum( + expression.getRightOperand().getTypeDescriptor())) { + return expression; + } + + if (expression.getOperator() == BinaryOperator.EQUALS) { + return rewriteJsEnumNullEquality(expression); + } + + return rewriteJsEnumNullEquality( + expression.getLeftOperand().infixEquals(expression.getRightOperand())) + .prefixNot(); + } + }); + } + + private static Expression rewriteJsEnumNullEquality(BinaryExpression expression) { + checkArgument(expression.getOperator() == BinaryOperator.EQUALS); + + if (expression.getRightOperand() instanceof NullLiteral) { + return RuntimeMethods.createEnumsIsNullCall(expression.getLeftOperand()); + } else if (expression.getLeftOperand() instanceof NullLiteral) { + return RuntimeMethods.createEnumsIsNullCall(expression.getRightOperand()); + } else { + return expression; + } + } +} diff --git a/transpiler/javatests/com/google/j2cl/integration/java/classliteral/Main.java b/transpiler/javatests/com/google/j2cl/integration/java/classliteral/Main.java index 12447f99e0..c08687e1bd 100644 --- a/transpiler/javatests/com/google/j2cl/integration/java/classliteral/Main.java +++ b/transpiler/javatests/com/google/j2cl/integration/java/classliteral/Main.java @@ -148,6 +148,10 @@ private enum MyJsEnum { } private static void testJsEnum() { + // TODO(b/295235576): enable for Wasm when class metadata is implemented for JsEnum. + if (isWasm()) { + return; + } Object o = MyJsEnum.VALUE; assertSame(MyJsEnum.class, o.getClass()); assertSame(MyJsEnum.class, MyJsEnum.VALUE.getClass()); diff --git a/transpiler/javatests/com/google/j2cl/integration/java/classliteralstripped/Main.java b/transpiler/javatests/com/google/j2cl/integration/java/classliteralstripped/Main.java index 4d5d574672..4a780313ea 100644 --- a/transpiler/javatests/com/google/j2cl/integration/java/classliteralstripped/Main.java +++ b/transpiler/javatests/com/google/j2cl/integration/java/classliteralstripped/Main.java @@ -114,6 +114,10 @@ private enum MyJsEnum { } private static void testJsEnum() { + // TODO(b/295235576): enable for Wasm when class metadata is implemented for JsEnum. + if (isWasm()) { + return; + } Object o = MyJsEnum.VALUE; assertSame(MyJsEnum.class, o.getClass()); assertSame(MyJsEnum.class, MyJsEnum.VALUE.getClass()); diff --git a/transpiler/javatests/com/google/j2cl/integration/java/jsenum/BUILD b/transpiler/javatests/com/google/j2cl/integration/java/jsenum/BUILD index d8dcd0a131..35a9d05cb3 100644 --- a/transpiler/javatests/com/google/j2cl/integration/java/jsenum/BUILD +++ b/transpiler/javatests/com/google/j2cl/integration/java/jsenum/BUILD @@ -1,3 +1,4 @@ +load("//build_defs:rules.bzl", "j2wasm_library") load( "//transpiler/javatests/com/google/j2cl/integration:integration_test.bzl", "integration_test", @@ -8,6 +9,25 @@ package( licenses = ["notice"], ) +j2wasm_library( + name = "jsenum-j2wasm", + srcs = glob( + [ + "*.java", + "super-wasm/*.java", + ], + exclude = [ + "NativeEnums.java", + ], + ), + javacopts = ["-XepDisableAllChecks"], + deps = [ + "//jre/java:javaemul_internal_annotations-j2wasm", + "//third_party:gwt-jsinterop-annotations-j2wasm", + "//transpiler/javatests/com/google/j2cl/integration/testing:testing-j2wasm", + ], +) + integration_test( name = "jsenum", srcs = glob([ @@ -17,5 +37,4 @@ integration_test( # Contains JsInterop features which are only applicable for JS output. enable_jvm_test = False, enable_kt = False, - enable_wasm = False, ) diff --git a/transpiler/javatests/com/google/j2cl/integration/java/jsenum/Main.java b/transpiler/javatests/com/google/j2cl/integration/java/jsenum/Main.java index 0518f73cfc..4d51cf92ce 100644 --- a/transpiler/javatests/com/google/j2cl/integration/java/jsenum/Main.java +++ b/transpiler/javatests/com/google/j2cl/integration/java/jsenum/Main.java @@ -22,6 +22,7 @@ import static com.google.j2cl.integration.testing.Asserts.assertTrue; import static com.google.j2cl.integration.testing.Asserts.assertUnderlyingTypeEquals; import static com.google.j2cl.integration.testing.Asserts.fail; +import static jsenum.NativeEnums.nativeClinitCalled; import java.io.Serializable; import java.util.Arrays; @@ -31,9 +32,13 @@ import java.util.function.Supplier; import javaemul.internal.annotations.DoNotAutobox; import javaemul.internal.annotations.UncheckedCast; +import javaemul.internal.annotations.Wasm; +import jsenum.NativeEnums.NativeEnum; +import jsenum.NativeEnums.NativeEnumWithClinit; +import jsenum.NativeEnums.NumberNativeEnum; +import jsenum.NativeEnums.StringNativeEnum; import jsinterop.annotations.JsEnum; import jsinterop.annotations.JsMethod; -import jsinterop.annotations.JsOverlay; import jsinterop.annotations.JsProperty; import jsinterop.annotations.JsType; @@ -49,26 +54,26 @@ public static void main(String... args) { testStringNativeJsEnum(); testCastOnNative(); testComparableJsEnum(); + testComparableJsEnumAsSeenFromJs(); + testComparableJsEnumIntersectionCasts(); + testJsEnumVariableInitialization(); testStringJsEnum(); + testStringJsEnumAsSeenFromJs(); testJsEnumClassInitialization(); testNativeEnumClassInitialization(); testDoNotAutoboxJsEnum(); testUnckeckedCastJsEnum(); + testReturnsAndParameters(); testAutoBoxing_relationalOperations(); testAutoBoxing_typeInference(); testAutoBoxing_specialMethods(); testAutoBoxing_parameterizedLambda(); testAutoBoxing_intersectionCasts(); testSpecializedSuperType(); + testSpecializedSuperTypeUnderlyingType(); } - @JsEnum(isNative = true, namespace = "test") - enum NativeEnum { - @JsProperty(name = "OK") - ACCEPT, - CANCEL - } - + @Wasm("nop") // TODO(b/288145698): Support native JsEnum. private static void testNativeJsEnum() { NativeEnum v = NativeEnum.ACCEPT; switch (v) { @@ -144,21 +149,10 @@ private static void testNativeJsEnum() { } @JsMethod(name = "passThrough") + @Wasm("nop") // TODO(b/288145698): Support native JsEnum. private static native Object asSeenFromJs(NativeEnum s); - @JsEnum(isNative = true, namespace = "test", name = "NativeEnum", hasCustomValue = true) - enum StringNativeEnum { - OK, - CANCEL; - - private String value; - - @JsOverlay - public String getValue() { - return value; - } - } - + @Wasm("nop") // TODO(b/288145698): Support native JsEnum. private static void testStringNativeJsEnum() { StringNativeEnum v = StringNativeEnum.OK; switch (v) { @@ -235,14 +229,7 @@ private static void testStringNativeJsEnum() { assertTrue(asSeenFromJs(StringNativeEnum.OK) == OK_STRING); } - @JsEnum(isNative = true, namespace = "test", name = "NativeEnumOfNumber", hasCustomValue = true) - enum NumberNativeEnum { - ONE, - TWO; - - int value; - } - + @Wasm("nop") // TODO(b/288145698): Support native JsEnum. public static void testCastOnNative() { castToNativeEnum(NativeEnum.ACCEPT); castToNativeEnum(StringNativeEnum.OK); @@ -282,6 +269,7 @@ private static NumberNativeEnum castToNumberNativeEnum(Object o) { } @JsMethod(name = "passThrough") + @Wasm("nop") // Non-native JsMethod not supported in Wasm. private static native Object asSeenFromJs(StringNativeEnum s); @JsEnum @@ -410,12 +398,6 @@ private static void testComparableJsEnum() { Comparable c = (Comparable) o; Serializable s = (Serializable) o; - // Intersection casts box/or unbox depending on the destination type. - Comparable otherC = (PlainJsEnum & Comparable) o; - assertUnderlyingTypeEquals(PlainJsEnum.class, otherC); - PlainJsEnum otherPe = (PlainJsEnum & Comparable) o; - assertUnderlyingTypeEquals(Double.class, otherPe); - assertThrowsClassCastException( () -> { Object unused = (Enum) o; @@ -427,8 +409,6 @@ private static void testComparableJsEnum() { }, Double.class); - assertTrue(asSeenFromJs(PlainJsEnum.ONE) == ONE_DOUBLE); - // Comparable test. SortedSet sortedSet = new TreeSet<>(Comparable::compareTo); sortedSet.add(PlainJsEnum.ONE); @@ -437,9 +417,37 @@ private static void testComparableJsEnum() { assertTrue(sortedSet.iterator().next() instanceof PlainJsEnum); } + @Wasm("nop") // Non-native JsMethod not supported in Wasm. + private static void testComparableJsEnumAsSeenFromJs() { + assertTrue(asSeenFromJs(PlainJsEnum.ONE) == ONE_DOUBLE); + } + + @Wasm("nop") // TODO(b/182341814, b/295235576): DoNotAutobox not supported in Wasm. JsEnum class + // literals not yet supported in Wasm. + private static void testComparableJsEnumIntersectionCasts() { + Object o = PlainJsEnum.ONE; + // Intersection casts box/or unbox depending on the destination type. + Comparable otherC = (PlainJsEnum & Comparable) o; + assertUnderlyingTypeEquals(PlainJsEnum.class, otherC); + PlainJsEnum otherPe = (PlainJsEnum & Comparable) o; + assertUnderlyingTypeEquals(Double.class, otherPe); + } + @JsMethod(name = "passThrough") + @Wasm("nop") // Non-native JsMethod not supported in Wasm. private static native Object asSeenFromJs(PlainJsEnum d); + public static PlainJsEnum defaultStaticJsEnum; + public static PlainJsEnum oneStaticJsEnum = PlainJsEnum.ONE; + + private static void testJsEnumVariableInitialization() { + assertEquals(defaultStaticJsEnum, null); + assertEquals(oneStaticJsEnum, PlainJsEnum.ONE); + + PlainJsEnum oneJsEnum = PlainJsEnum.ONE; + assertEquals(oneJsEnum, PlainJsEnum.ONE); + } + @JsEnum(hasCustomValue = true) enum StringJsEnum { HELLO("Hello"), @@ -537,11 +545,15 @@ private static void testStringJsEnum() { Object unused = (StringJsEnum & Comparable) o; }, Comparable.class); + } + @Wasm("nop") // Non-native JsMethod not supported in Wasm. + private static void testStringJsEnumAsSeenFromJs() { assertTrue(asSeenFromJs(StringJsEnum.HELLO) == HELLO_STRING); } @JsMethod(name = "passThrough") + @Wasm("nop") // Non-native JsMethod not supported in Wasm. private static native Object asSeenFromJs(StringJsEnum b); private static boolean nonNativeClinitCalled = false; @@ -580,24 +592,7 @@ private static void testJsEnumClassInitialization() { assertTrue(nonNativeClinitCalled); } - private static boolean nativeClinitCalled = false; - - @JsEnum(isNative = true, hasCustomValue = true, namespace = "test", name = "NativeEnum") - enum NativeEnumWithClinit { - OK; - - static { - nativeClinitCalled = true; - } - - String value; - - @JsOverlay - String getValue() { - return value; - } - } - + @Wasm("nop") // TODO(b/288145698): Support native JsEnum. private static void testNativeEnumClassInitialization() { assertFalse(nativeClinitCalled); // Access to an enum value does not trigger clinit. @@ -617,6 +612,7 @@ private static void testNativeEnumClassInitialization() { assertTrue(nativeClinitCalled); } + @Wasm("nop") // TODO(b/182341814): DoNotAutobox not supported in Wasm. private static void testDoNotAutoboxJsEnum() { assertTrue(returnsObject(StringJsEnum.HELLO) == HELLO_STRING); assertTrue(returnsObject(0, StringJsEnum.HELLO) == HELLO_STRING); @@ -630,6 +626,7 @@ private static Object returnsObject(int n, @DoNotAutobox Object... object) { return object[0]; } + @Wasm("nop") // Unchecked cast not supported in Wasm. private static void testUnckeckedCastJsEnum() { StringJsEnum s = uncheckedCast(HELLO_STRING); assertTrue(s == StringJsEnum.HELLO); @@ -640,6 +637,31 @@ private static T uncheckedCast(@DoNotAutobox Object object) { return (T) object; } + private static void testReturnsAndParameters() { + assertTrue(PlainJsEnum.ONE == returnsJsEnum()); + assertTrue(PlainJsEnum.ONE == returnsJsEnum(PlainJsEnum.ONE)); + assertTrue(null == returnsNullJsEnum()); + assertTrue(null == returnsJsEnum(null)); + + Main.testGenericAssertNull(null); + } + + private static PlainJsEnum returnsJsEnum() { + return PlainJsEnum.ONE; + } + + private static PlainJsEnum returnsJsEnum(PlainJsEnum value) { + return value; + } + + private static PlainJsEnum returnsNullJsEnum() { + return null; + } + + private static void testGenericAssertNull(T obj) { + assertTrue(obj == null); + } + private static void testAutoBoxing_relationalOperations() { PlainJsEnum one = PlainJsEnum.ONE; Object boxedOne = PlainJsEnum.ONE; @@ -695,6 +717,8 @@ private static void testAutoBoxing_specialMethods() { assertFalse(jsEnum.equals(stringJsEnum)); } + @Wasm("nop") // TODO(b/182341814, b/295235576): DoNotAutobox not supported in Wasm. JsEnum class + // literals not yet supported in Wasm. private static void testAutoBoxing_intersectionCasts() { Comparable c = (PlainJsEnum & Comparable) PlainJsEnum.ONE; assertTrue(c.compareTo(PlainJsEnum.ZERO) > 0); @@ -708,6 +732,8 @@ private static void testAutoBoxing_intersectionCasts() { PlainJsEnum.class, (PlainJsEnum & Comparable) PlainJsEnum.ONE); } + @Wasm("nop") // TODO(b/182341814, b/295235576): DoNotAutobox not supported in Wasm. JsEnum class + // literals not yet supported in Wasm. private static void testAutoBoxing_typeInference() { assertUnderlyingTypeEquals(Double.class, PlainJsEnum.ONE); assertUnderlyingTypeEquals(PlainJsEnum.class, boxingIdentity(PlainJsEnum.ONE)); @@ -852,8 +878,8 @@ private static void testSpecializedSuperType() { c.set(six); assertTrue(six == pc.get()); assertTrue(six == ((Container) c).get()); - assertUnderlyingTypeEquals(PlainJsEnum.class, ((Container) c).get()); - assertUnderlyingTypeEquals(Double.class, pc.get()); + // assertUnderlyingTypeEquals(PlainJsEnum.class, ((Container) c).get()); + // assertUnderlyingTypeEquals(Double.class, pc.get()); JsTypePlainJsEnumContainer jpc = new JsTypePlainJsEnumContainer(); JsTypeContainer jc = jpc; @@ -863,11 +889,29 @@ private static void testSpecializedSuperType() { jc.set(six); assertTrue(six == jpc.get()); assertTrue(six == ((JsTypeContainer) jc).get()); + // assertUnderlyingTypeEquals(PlainJsEnum.class, ((JsTypeContainer) jc).get()); + // assertUnderlyingTypeEquals(Double.class, jpc.get()); + } + + @Wasm("nop") // TODO(b/182341814, b/295235576): DoNotAutobox not supported in Wasm. JsEnum class + // literals not yet supported in Wasm. + private static void testSpecializedSuperTypeUnderlyingType() { + PlainJsEnum five = PlainJsEnum.FIVE; + PlainJsEnumContainer pc = new PlainJsEnumContainer(); + Container c = pc; + pc.set(five); + assertUnderlyingTypeEquals(PlainJsEnum.class, ((Container) c).get()); + assertUnderlyingTypeEquals(Double.class, pc.get()); + + JsTypePlainJsEnumContainer jpc = new JsTypePlainJsEnumContainer(); + JsTypeContainer jc = jpc; + jpc.set(five); assertUnderlyingTypeEquals(PlainJsEnum.class, ((JsTypeContainer) jc).get()); assertUnderlyingTypeEquals(Double.class, jpc.get()); } @JsMethod + @Wasm("nop") // Non-native js methods not supported in Wasm. // Pass through an enum value as if it were coming from and going to JavaScript. private static Object passThrough(Object o) { // Supported closure enums can only have number, boolean or string as their underlying type. diff --git a/transpiler/javatests/com/google/j2cl/integration/java/jsenum/NativeEnums.java b/transpiler/javatests/com/google/j2cl/integration/java/jsenum/NativeEnums.java new file mode 100644 index 0000000000..caf69c7b3a --- /dev/null +++ b/transpiler/javatests/com/google/j2cl/integration/java/jsenum/NativeEnums.java @@ -0,0 +1,71 @@ +/* + * Copyright 2023 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package jsenum; + +import jsinterop.annotations.JsEnum; +import jsinterop.annotations.JsOverlay; +import jsinterop.annotations.JsProperty; + +class NativeEnums { + + @JsEnum(isNative = true, namespace = "test") + enum NativeEnum { + @JsProperty(name = "OK") + ACCEPT, + CANCEL + } + + @JsEnum(isNative = true, namespace = "test", name = "NativeEnum", hasCustomValue = true) + enum StringNativeEnum { + OK, + CANCEL; + + private String value; + + @JsOverlay + public String getValue() { + return value; + } + } + + @JsEnum(isNative = true, namespace = "test", name = "NativeEnumOfNumber", hasCustomValue = true) + enum NumberNativeEnum { + ONE, + TWO; + + int value; + } + + static boolean nativeClinitCalled = false; + + @JsEnum(isNative = true, hasCustomValue = true, namespace = "test", name = "NativeEnum") + enum NativeEnumWithClinit { + OK; + + static { + nativeClinitCalled = true; + } + + String value; + + @JsOverlay + String getValue() { + return value; + } + } + + private NativeEnums() {} +} diff --git a/transpiler/javatests/com/google/j2cl/integration/java/jsenum/super-wasm/NativeEnums.java b/transpiler/javatests/com/google/j2cl/integration/java/jsenum/super-wasm/NativeEnums.java new file mode 100644 index 0000000000..482397f7ef --- /dev/null +++ b/transpiler/javatests/com/google/j2cl/integration/java/jsenum/super-wasm/NativeEnums.java @@ -0,0 +1,57 @@ +/* + * Copyright 2023 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package jsenum; + +/** Placeholders for Wasm. TODO(b/288145698): Native JsEnum is not supported. */ +class NativeEnums { + + enum NativeEnum { + ACCEPT, + CANCEL + } + + enum StringNativeEnum { + OK, + CANCEL; + + private String value; + + public String getValue() { + return value; + } + } + + enum NumberNativeEnum { + ONE, + TWO; + + int value; + } + + static boolean nativeClinitCalled = false; + + enum NativeEnumWithClinit { + OK; + + String value; + + String getValue() { + return value; + } + } + + private NativeEnums() {} +} diff --git a/transpiler/javatests/com/google/j2cl/integration/java/wasm/super-wasm/Main.java b/transpiler/javatests/com/google/j2cl/integration/java/wasm/super-wasm/Main.java index 0fcc421434..7c0dc68c37 100644 --- a/transpiler/javatests/com/google/j2cl/integration/java/wasm/super-wasm/Main.java +++ b/transpiler/javatests/com/google/j2cl/integration/java/wasm/super-wasm/Main.java @@ -20,6 +20,7 @@ import static com.google.j2cl.integration.testing.Asserts.assertTrue; import javaemul.internal.annotations.Wasm; +import jsinterop.annotations.JsEnum; /** * Incrementally tests wasm features as they are being added. @@ -35,6 +36,7 @@ public static void main(String... args) throws Exception { testArrayInstanceOf(); testArrayGetClass(); testNativeArrays(); + testJsEnumUnboxedReturn(); } private static void testWasmAnnotation() { @@ -124,4 +126,20 @@ private static void testNativeArrays() { assertTrue(i31GetS(i31Refs[i]) == i); } } + + @JsEnum + private enum PlainJsEnum { + ONE, + TWO, + THREE + } + + private static PlainJsEnum returnNullValue() { + return null; + } + + private static void testJsEnumUnboxedReturn() { + // TODO(b/301342159): Remove this test and add a test to java/jsenum when this throws an NPE. + assertTrue(returnNullValue().ordinal() == Integer.MIN_VALUE); + } } diff --git a/transpiler/javatests/com/google/j2cl/readable/java/deprecated/output_wasm/module.wat.txt b/transpiler/javatests/com/google/j2cl/readable/java/deprecated/output_wasm/module.wat.txt index 8c6c61c8e4..0446e1c791 100644 --- a/transpiler/javatests/com/google/j2cl/readable/java/deprecated/output_wasm/module.wat.txt +++ b/transpiler/javatests/com/google/j2cl/readable/java/deprecated/output_wasm/module.wat.txt @@ -10,6 +10,17 @@ )) ) + ;;; Code for deprecated.DeprecatedExample.DeprecatedJsEnum.$Overlay [type definition] + (type $deprecated.DeprecatedExample.DeprecatedJsEnum.$Overlay (sub (struct + (field $vtable (ref $deprecated.DeprecatedExample.DeprecatedJsEnum.$Overlay.vtable)) + (field $itable (ref $itable)) + )) + ) + (type $deprecated.DeprecatedExample.DeprecatedJsEnum.$Overlay.vtable (sub (struct + (field $$getClassImpl__java_lang_Class (ref $function.$getClassImpl__java_lang_Class)) + )) + ) + ;;; Code for deprecated.DeprecatedExample [type definition] (type $deprecated.DeprecatedExample (sub $java.lang.Object (struct (field $vtable (ref $deprecated.DeprecatedExample.vtable)) @@ -28,6 +39,8 @@ )) ) + ;;; Code for deprecated.DeprecatedExample.DeprecatedJsEnum [type definition] + ;;; Code for deprecated.DeprecatedExample.DeprecatedEnum [type definition] (type $deprecated.DeprecatedExample.DeprecatedEnum (sub $java.lang.Enum (struct (field $vtable (ref $deprecated.DeprecatedExample.DeprecatedEnum.vtable)) @@ -60,38 +73,6 @@ (field $slot6 (ref null struct)) ))) - ;;; Code for deprecated.DeprecatedExample.DeprecatedJsEnum [type definition] - (type $deprecated.DeprecatedExample.DeprecatedJsEnum (sub $java.lang.Enum (struct - (field $vtable (ref $deprecated.DeprecatedExample.DeprecatedJsEnum.vtable)) - (field $itable (ref $deprecated.DeprecatedExample.DeprecatedJsEnum.itable)) - (field $f_$systemIdentityHashCode__java_lang_Object (mut i32)) - (field $f_name__java_lang_Enum_ (mut (ref null $java.lang.String))) - (field $f_ordinal__java_lang_Enum_ (mut i32)) - )) - ) - (type $deprecated.DeprecatedExample.DeprecatedJsEnum.vtable (sub $java.lang.Enum.vtable (struct - (field $$getClassImpl__java_lang_Class (ref $function.$getClassImpl__java_lang_Class)) - (field $m_equals__java_lang_Object__boolean (ref $function.m_equals__java_lang_Object__boolean)) - (field $m_getClass__java_lang_Class (ref $function.m_getClass__java_lang_Class)) - (field $m_hashCode__int (ref $function.m_hashCode__int)) - (field $m_toString__java_lang_String (ref $function.m_toString__java_lang_String)) - (field $m_compareTo__java_lang_Object__int (ref $function.m_compareTo__java_lang_Object__int)) - (field $m_compareTo__java_lang_Enum__int (ref $function.m_compareTo__java_lang_Enum__int)) - (field $m_getDeclaringClass__java_lang_Class (ref $function.m_getDeclaringClass__java_lang_Class)) - (field $m_name__java_lang_String (ref $function.m_name__java_lang_String)) - (field $m_ordinal__int (ref $function.m_ordinal__int)) - )) - ) - (type $deprecated.DeprecatedExample.DeprecatedJsEnum.itable (sub $java.lang.Enum.itable (struct - (field $slot0 (ref $java.io.Serializable.vtable)) - (field $slot1 (ref $java.lang.Comparable.vtable)) - (field $slot2 (ref null struct)) - (field $slot3 (ref null struct)) - (field $slot4 (ref null struct)) - (field $slot5 (ref null struct)) - (field $slot6 (ref null struct)) - ))) - ;;; Code for deprecated.DeprecatedExample [vtable.init] (global $deprecated.DeprecatedExample.vtable (ref $deprecated.DeprecatedExample.vtable) (struct.new $deprecated.DeprecatedExample.vtable @@ -143,42 +124,10 @@ ) ) -;;; Code for deprecated.DeprecatedExample.DeprecatedJsEnum [vtable.init] -(global $deprecated.DeprecatedExample.DeprecatedJsEnum.vtable (ref $deprecated.DeprecatedExample.DeprecatedJsEnum.vtable) - (struct.new $deprecated.DeprecatedExample.DeprecatedJsEnum.vtable - (ref.func $$getClassImpl__java_lang_Class@deprecated.DeprecatedExample.DeprecatedJsEnum) - (ref.func $m_equals__java_lang_Object__boolean@java.lang.Enum) - (ref.func $m_getClass__java_lang_Class@java.lang.Object) - (ref.func $m_hashCode__int@java.lang.Enum) - (ref.func $m_toString__java_lang_String@java.lang.Enum) - (ref.func $m_compareTo__java_lang_Object__int@java.lang.Enum) - (ref.func $m_compareTo__java_lang_Enum__int@java.lang.Enum) - (ref.func $m_getDeclaringClass__java_lang_Class@java.lang.Enum) - (ref.func $m_name__java_lang_String@java.lang.Enum) - (ref.func $m_ordinal__int@java.lang.Enum) - ) -) - -;;; Code for deprecated.DeprecatedExample.DeprecatedJsEnum [itable.init] - -(global $java.io.Serializable.vtable@$deprecated.DeprecatedExample.DeprecatedJsEnum (ref $java.io.Serializable.vtable) - (struct.new $java.io.Serializable.vtable - ) -) -(global $java.lang.Comparable.vtable@$deprecated.DeprecatedExample.DeprecatedJsEnum (ref $java.lang.Comparable.vtable) - (struct.new $java.lang.Comparable.vtable - (ref.func $m_compareTo__java_lang_Object__int@java.lang.Enum) - ) -) -(global $deprecated.DeprecatedExample.DeprecatedJsEnum.itable (ref $deprecated.DeprecatedExample.DeprecatedJsEnum.itable) - (struct.new $deprecated.DeprecatedExample.DeprecatedJsEnum.itable - (global.get $java.io.Serializable.vtable@$deprecated.DeprecatedExample.DeprecatedJsEnum) - (global.get $java.lang.Comparable.vtable@$deprecated.DeprecatedExample.DeprecatedJsEnum) - (ref.null struct) - (ref.null struct) - (ref.null struct) - (ref.null struct) - (ref.null struct) +;;; Code for deprecated.DeprecatedExample.DeprecatedJsEnum.$Overlay [vtable.init] +(global $deprecated.DeprecatedExample.DeprecatedJsEnum.$Overlay.vtable (ref $deprecated.DeprecatedExample.DeprecatedJsEnum.$Overlay.vtable) + (struct.new $deprecated.DeprecatedExample.DeprecatedJsEnum.$Overlay.vtable + (ref.func $$getClassImpl__java_lang_Class@deprecated.DeprecatedExample.DeprecatedJsEnum.$Overlay) ) ) @@ -238,20 +187,14 @@ (ref.null $java.lang.String) ) -;;; Code for deprecated.DeprecatedExample.DeprecatedJsEnum [static fields] -(global $f_A_VALUE__deprecated_DeprecatedExample_DeprecatedJsEnum (mut (ref null $deprecated.DeprecatedExample.DeprecatedJsEnum)) - (ref.null $deprecated.DeprecatedExample.DeprecatedJsEnum) -) -(global $f_namesToValuesMap__deprecated_DeprecatedExample_DeprecatedJsEnum_ (mut (ref null $java.lang.Object)) - (ref.null $java.lang.Object) -) -(global $f_$initialized__deprecated_DeprecatedExample_DeprecatedJsEnum (mut i32) +;;; Code for deprecated.DeprecatedExample.DeprecatedJsEnum.$Overlay [static fields] +(global $f_$initialized__deprecated_DeprecatedExample_DeprecatedJsEnum_$Overlay (mut i32) (i32.const 0) ) -(global $f_$class__deprecated_DeprecatedExample_DeprecatedJsEnum (mut (ref null $java.lang.Class)) +(global $f_$class__deprecated_DeprecatedExample_DeprecatedJsEnum_$Overlay (mut (ref null $java.lang.Class)) (ref.null $java.lang.Class) ) -(global $f_$string_|deprecated.D...|__deprecated_DeprecatedExample_DeprecatedJsEnum (mut (ref null $java.lang.String)) +(global $f_$string_|deprecated.D...|__deprecated_DeprecatedExample_DeprecatedJsEnum_$Overlay (mut (ref null $java.lang.String)) (ref.null $java.lang.String) ) @@ -343,6 +286,63 @@ ) ) +;;; Code for deprecated.DeprecatedExample.DeprecatedJsEnum.$Overlay [methods] + +;;; void $Overlay.$clinit() +(func $$clinit__void@deprecated.DeprecatedExample.DeprecatedJsEnum.$Overlay + ;;@ deprecated/DeprecatedExample.java:62:7 + (block + ;;@ deprecated/DeprecatedExample.java:62:7 + (if (global.get $f_$initialized__deprecated_DeprecatedExample_DeprecatedJsEnum_$Overlay) + (then + ;;@ deprecated/DeprecatedExample.java:62:7 + (return ) + ) + ) + ;;@ deprecated/DeprecatedExample.java:62:7 + (global.set $f_$initialized__deprecated_DeprecatedExample_DeprecatedJsEnum_$Overlay (i32.const 1)) + ) +) + +;;; Class $Overlay.$getClassMetadata() +(func $$getClassMetadata__java_lang_Class@deprecated.DeprecatedExample.DeprecatedJsEnum.$Overlay + (result (ref null $java.lang.Class)) + (block + (if (ref.is_null (global.get $f_$class__deprecated_DeprecatedExample_DeprecatedJsEnum_$Overlay)) + (then + (global.set $f_$class__deprecated_DeprecatedExample_DeprecatedJsEnum_$Overlay (call $m_createForEnum__java_lang_String__java_lang_Class@java.lang.Class (call $function.no.side.effects.$getString_|deprecated.D...|__java_lang_String (ref.func $$getString_|deprecated.D...|__java_lang_String@deprecated.DeprecatedExample.DeprecatedJsEnum.$Overlay) ))) + ) + ) + (return (global.get $f_$class__deprecated_DeprecatedExample_DeprecatedJsEnum_$Overlay)) + ) +) + +;;; Class $Overlay.$getClassImpl() +(func $$getClassImpl__java_lang_Class@deprecated.DeprecatedExample.DeprecatedJsEnum.$Overlay + (type $function.$getClassImpl__java_lang_Class) + (param $this.untyped (ref $java.lang.Object)) + (result (ref null $java.lang.Class)) + (local $this (ref null $deprecated.DeprecatedExample.DeprecatedJsEnum.$Overlay)) + (local.set $this (ref.cast (ref $deprecated.DeprecatedExample.DeprecatedJsEnum.$Overlay) (local.get $this.untyped))) + (block + (return (call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@deprecated.DeprecatedExample.DeprecatedJsEnum.$Overlay) )) + ) +) +(elem declare func $$getClassImpl__java_lang_Class@deprecated.DeprecatedExample.DeprecatedJsEnum.$Overlay) + +;;; String $Overlay.$getString_|deprecated.D...|() +(func $$getString_|deprecated.D...|__java_lang_String@deprecated.DeprecatedExample.DeprecatedJsEnum.$Overlay + (result (ref null $java.lang.String)) + (block + (if (ref.is_null (global.get $f_$string_|deprecated.D...|__deprecated_DeprecatedExample_DeprecatedJsEnum_$Overlay)) + (then + (global.set $f_$string_|deprecated.D...|__deprecated_DeprecatedExample_DeprecatedJsEnum_$Overlay (call $m_fromJsString__java_lang_String_NativeString__java_lang_String@java.lang.String (string.const "deprecated.DeprecatedExample$DeprecatedJsEnum$$Overlay"))) + ) + ) + (return (global.get $f_$string_|deprecated.D...|__deprecated_DeprecatedExample_DeprecatedJsEnum_$Overlay)) + ) +) + ;;; Code for deprecated.DeprecatedExample [methods] ;;; void DeprecatedExample.deprecatedStaticMethod(Object someObject) @@ -477,6 +477,8 @@ ) ) +;;; Code for deprecated.DeprecatedExample.DeprecatedJsEnum [methods] + ;;; Code for deprecated.DeprecatedExample.DeprecatedEnum [methods] ;;; DeprecatedEnum DeprecatedEnum.$create(String $name, int $ordinal) @@ -617,131 +619,3 @@ (return (global.get $f_$string_|deprecated.D...|__deprecated_DeprecatedExample_DeprecatedEnum)) ) ) - -;;; Code for deprecated.DeprecatedExample.DeprecatedJsEnum [methods] - -;;; DeprecatedJsEnum DeprecatedJsEnum.$create(String $name, int $ordinal) -(func $$create__java_lang_String__int@deprecated.DeprecatedExample.DeprecatedJsEnum - (param $$name (ref null $java.lang.String)) - (param $$ordinal i32) - (result (ref null $deprecated.DeprecatedExample.DeprecatedJsEnum)) - ;;@ deprecated/DeprecatedExample.java:62:7 - (local $$instance (ref null $deprecated.DeprecatedExample.DeprecatedJsEnum)) - (block - ;;@ deprecated/DeprecatedExample.java:62:7 - (local.set $$instance (struct.new $deprecated.DeprecatedExample.DeprecatedJsEnum (ref.as_non_null (global.get $deprecated.DeprecatedExample.DeprecatedJsEnum.vtable)) (ref.as_non_null (global.get $deprecated.DeprecatedExample.DeprecatedJsEnum.itable)) (i32.const 0) (ref.null $java.lang.String) (i32.const 0))) - ;;@ deprecated/DeprecatedExample.java:62:7 - (call $$ctor__java_lang_String__int__void_$p_deprecated_DeprecatedExample_DeprecatedJsEnum@deprecated.DeprecatedExample.DeprecatedJsEnum (ref.as_non_null (local.get $$instance))(local.get $$name)(local.get $$ordinal)) - ;;@ deprecated/DeprecatedExample.java:62:7 - (return (local.get $$instance)) - ) -) - -;;; void DeprecatedJsEnum.$ctor(String $name, int $ordinal) -(func $$ctor__java_lang_String__int__void_$p_deprecated_DeprecatedExample_DeprecatedJsEnum@deprecated.DeprecatedExample.DeprecatedJsEnum - (param $this (ref null $deprecated.DeprecatedExample.DeprecatedJsEnum)) - (param $$name (ref null $java.lang.String)) - (param $$ordinal i32) - ;;@ deprecated/DeprecatedExample.java:62:7 - (block - ;;@ deprecated/DeprecatedExample.java:62:7 - (struct.set $java.lang.Enum $f_name__java_lang_Enum_ (local.get $this) (local.get $$name)) - ;;@ deprecated/DeprecatedExample.java:62:7 - (struct.set $java.lang.Enum $f_ordinal__java_lang_Enum_ (local.get $this) (local.get $$ordinal)) - ;;@ deprecated/DeprecatedExample.java:62:7 - (call $$ctor__java_lang_String__int__void_$p_java_lang_Enum@java.lang.Enum (ref.as_non_null (local.get $this))(local.get $$name)(local.get $$ordinal)) - ) -) - -;;; DeprecatedJsEnum DeprecatedJsEnum.valueOf(String name) -(func $m_valueOf__java_lang_String__deprecated_DeprecatedExample_DeprecatedJsEnum@deprecated.DeprecatedExample.DeprecatedJsEnum - (param $name (ref null $java.lang.String)) - (result (ref null $deprecated.DeprecatedExample.DeprecatedJsEnum)) - ;;@ deprecated/DeprecatedExample.java:62:7 - (block - ;;@ deprecated/DeprecatedExample.java:62:7 - (call $$clinit__void@deprecated.DeprecatedExample.DeprecatedJsEnum ) - ;;@ deprecated/DeprecatedExample.java:62:7 - (if (ref.is_null (global.get $f_namesToValuesMap__deprecated_DeprecatedExample_DeprecatedJsEnum_)) - (then - (block - ;;@ deprecated/DeprecatedExample.java:62:7 - (global.set $f_namesToValuesMap__deprecated_DeprecatedExample_DeprecatedJsEnum_ (call $m_createMapFromValues__arrayOf_java_lang_Enum__java_util_Map@javaemul.internal.Enums (call $m_values__arrayOf_deprecated_DeprecatedExample_DeprecatedJsEnum@deprecated.DeprecatedExample.DeprecatedJsEnum ))) - ) - ) - ) - ;;@ deprecated/DeprecatedExample.java:62:7 - (return (ref.cast (ref null $deprecated.DeprecatedExample.DeprecatedJsEnum) (call $m_getValueFromNameAndMap__java_lang_String__java_util_Map__java_lang_Object@javaemul.internal.Enums (local.get $name)(global.get $f_namesToValuesMap__deprecated_DeprecatedExample_DeprecatedJsEnum_)))) - ) -) - -;;; DeprecatedJsEnum[] DeprecatedJsEnum.values() -(func $m_values__arrayOf_deprecated_DeprecatedExample_DeprecatedJsEnum@deprecated.DeprecatedExample.DeprecatedJsEnum - (result (ref null $javaemul.internal.WasmArray.OfObject)) - ;;@ deprecated/DeprecatedExample.java:62:7 - (block - ;;@ deprecated/DeprecatedExample.java:62:7 - (call $$clinit__void@deprecated.DeprecatedExample.DeprecatedJsEnum ) - ;;@ deprecated/DeprecatedExample.java:62:7 - (return (call $m_newWithLiteral__arrayOf_java_lang_Object__javaemul_internal_WasmArray_OfObject@javaemul.internal.WasmArray.OfObject (array.new_fixed $java.lang.Object.array (global.get $f_A_VALUE__deprecated_DeprecatedExample_DeprecatedJsEnum)))) - ) -) - -;;; void DeprecatedJsEnum.$clinit() -(func $$clinit__void@deprecated.DeprecatedExample.DeprecatedJsEnum - ;;@ deprecated/DeprecatedExample.java:62:7 - (block - ;;@ deprecated/DeprecatedExample.java:62:7 - (if (global.get $f_$initialized__deprecated_DeprecatedExample_DeprecatedJsEnum) - (then - ;;@ deprecated/DeprecatedExample.java:62:7 - (return ) - ) - ) - ;;@ deprecated/DeprecatedExample.java:62:7 - (global.set $f_$initialized__deprecated_DeprecatedExample_DeprecatedJsEnum (i32.const 1)) - ;;@ deprecated/DeprecatedExample.java:62:7 - (call $$clinit__void@java.lang.Enum ) - ;;@ deprecated/DeprecatedExample.java:63:4 - (global.set $f_A_VALUE__deprecated_DeprecatedExample_DeprecatedJsEnum (call $$create__java_lang_String__int@deprecated.DeprecatedExample.DeprecatedJsEnum (call $function.no.side.effects.$getString_|A_VALUE|__java_lang_String (ref.func $$getString_|A_VALUE|__java_lang_String@deprecated.DeprecatedExample.DeprecatedEnum) )(i32.const 0))) - ) -) - -;;; Class DeprecatedJsEnum.$getClassMetadata() -(func $$getClassMetadata__java_lang_Class@deprecated.DeprecatedExample.DeprecatedJsEnum - (result (ref null $java.lang.Class)) - (block - (if (ref.is_null (global.get $f_$class__deprecated_DeprecatedExample_DeprecatedJsEnum)) - (then - (global.set $f_$class__deprecated_DeprecatedExample_DeprecatedJsEnum (call $m_createForEnum__java_lang_String__java_lang_Class@java.lang.Class (call $function.no.side.effects.$getString_|deprecated.D...|__java_lang_String (ref.func $$getString_|deprecated.D...|__java_lang_String@deprecated.DeprecatedExample.DeprecatedJsEnum) ))) - ) - ) - (return (global.get $f_$class__deprecated_DeprecatedExample_DeprecatedJsEnum)) - ) -) - -;;; Class DeprecatedJsEnum.$getClassImpl() -(func $$getClassImpl__java_lang_Class@deprecated.DeprecatedExample.DeprecatedJsEnum - (type $function.$getClassImpl__java_lang_Class) - (param $this.untyped (ref $java.lang.Object)) - (result (ref null $java.lang.Class)) - (local $this (ref null $deprecated.DeprecatedExample.DeprecatedJsEnum)) - (local.set $this (ref.cast (ref $deprecated.DeprecatedExample.DeprecatedJsEnum) (local.get $this.untyped))) - (block - (return (call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@deprecated.DeprecatedExample.DeprecatedJsEnum) )) - ) -) -(elem declare func $$getClassImpl__java_lang_Class@deprecated.DeprecatedExample.DeprecatedJsEnum) - -;;; String DeprecatedJsEnum.$getString_|deprecated.D...|() -(func $$getString_|deprecated.D...|__java_lang_String@deprecated.DeprecatedExample.DeprecatedJsEnum - (result (ref null $java.lang.String)) - (block - (if (ref.is_null (global.get $f_$string_|deprecated.D...|__deprecated_DeprecatedExample_DeprecatedJsEnum)) - (then - (global.set $f_$string_|deprecated.D...|__deprecated_DeprecatedExample_DeprecatedJsEnum (call $m_fromJsString__java_lang_String_NativeString__java_lang_String@java.lang.String (string.const "deprecated.DeprecatedExample$DeprecatedJsEnum"))) - ) - ) - (return (global.get $f_$string_|deprecated.D...|__deprecated_DeprecatedExample_DeprecatedJsEnum)) - ) -) diff --git a/transpiler/javatests/com/google/j2cl/readable/java/jsenum/BUILD b/transpiler/javatests/com/google/j2cl/readable/java/jsenum/BUILD index b64a77f16d..e37047facc 100644 --- a/transpiler/javatests/com/google/j2cl/readable/java/jsenum/BUILD +++ b/transpiler/javatests/com/google/j2cl/readable/java/jsenum/BUILD @@ -13,6 +13,5 @@ readable_example( "*.java", "*.native.js", ]), - generate_wasm_readables = False, deps = ["//third_party:gwt-jsinterop-annotations-j2cl"], ) diff --git a/transpiler/javatests/com/google/j2cl/readable/java/jsenum/Main.java b/transpiler/javatests/com/google/j2cl/readable/java/jsenum/Main.java index cd89caeebf..17467316c9 100644 --- a/transpiler/javatests/com/google/j2cl/readable/java/jsenum/Main.java +++ b/transpiler/javatests/com/google/j2cl/readable/java/jsenum/Main.java @@ -167,6 +167,9 @@ private static void testJsEnumAutoboxingSpecialMethods() { o.equals(ComparableJsEnum.ZERO); StringJsEnum.ONE.equals(jsEnum); + + boxingPassthrough(ComparableJsEnum.ONE).equals(boxingPassthrough(ComparableJsEnum.ONE)); + boxingPassthrough(ComparableJsEnum.ONE).equals(boxingPassthrough(StringJsEnum.ONE)); } @JsFunction @@ -178,6 +181,22 @@ private static void acceptsJsFunctionSupplier(JsFunctionSuppiler> supplier) {} + private static void testReturnsAndParameters() { + ComparableJsEnum returnedValue = returnsJsEnum(); + ComparableJsEnum returnedNullValue = returnsNullJsEnum(); + takesJsEnum(ComparableJsEnum.ONE); + } + + private static ComparableJsEnum returnsJsEnum() { + return ComparableJsEnum.ONE; + } + + private static ComparableJsEnum returnsNullJsEnum() { + return null; + } + + private static void takesJsEnum(ComparableJsEnum value) {} + private static void testBoxUnboxWithTypeInference() { // Make sure the enum is boxed even when assigned to a field that is inferred to be JsEnum. TemplatedField templatedField = diff --git a/transpiler/javatests/com/google/j2cl/readable/java/jsenum/output_closure/Main.impl.java.js.txt b/transpiler/javatests/com/google/j2cl/readable/java/jsenum/output_closure/Main.impl.java.js.txt index 6ecaed3df0..158e2f18fe 100644 --- a/transpiler/javatests/com/google/j2cl/readable/java/jsenum/output_closure/Main.impl.java.js.txt +++ b/transpiler/javatests/com/google/j2cl/readable/java/jsenum/output_closure/Main.impl.java.js.txt @@ -108,12 +108,30 @@ class Main extends j_l_Object { $Objects.m_equals__java_lang_Object__java_lang_Object__boolean(/**@type {$Enums_BoxedComparableLightEnum}*/ ($Enums.boxComparable(ComparableJsEnum.ONE, $Overlay)), o); $Objects.m_equals__java_lang_Object__java_lang_Object__boolean(o, /**@type {$Enums_BoxedComparableLightEnum}*/ ($Enums.boxComparable(ComparableJsEnum.ZERO, $Overlay))); $Objects.m_equals__java_lang_Object__java_lang_Object__boolean(/**@type {$Enums_BoxedLightEnum}*/ ($Enums.box(StringJsEnum.ONE, StringJsEnum_$Overlay)), /**@type {$Enums_BoxedComparableLightEnum}*/ ($Enums.boxComparable(jsEnum, $Overlay))); + $Enums.equals(/**@type {?ComparableJsEnum}*/ ($Enums.unbox(Main.m_boxingPassthrough__java_lang_Object__java_lang_Object(/**@type {$Enums_BoxedComparableLightEnum}*/ ($Enums.boxComparable(ComparableJsEnum.ONE, $Overlay))), $Overlay)), /**@type {?ComparableJsEnum}*/ ($Enums.unbox(Main.m_boxingPassthrough__java_lang_Object__java_lang_Object(/**@type {$Enums_BoxedComparableLightEnum}*/ ($Enums.boxComparable(ComparableJsEnum.ONE, $Overlay))), $Overlay))); + $Objects.m_equals__java_lang_Object__java_lang_Object__boolean(/**@type {$Enums_BoxedComparableLightEnum}*/ ($Enums.boxComparable(/**@type {?ComparableJsEnum}*/ ($Enums.unbox(Main.m_boxingPassthrough__java_lang_Object__java_lang_Object(/**@type {$Enums_BoxedComparableLightEnum}*/ ($Enums.boxComparable(ComparableJsEnum.ONE, $Overlay))), $Overlay)), $Overlay)), /**@type {$Enums_BoxedLightEnum}*/ ($Enums.box(/**@type {?StringJsEnum}*/ ($Enums.unbox(Main.m_boxingPassthrough__java_lang_Object__java_lang_Object(/**@type {$Enums_BoxedLightEnum}*/ ($Enums.box(StringJsEnum.ONE, StringJsEnum_$Overlay))), StringJsEnum_$Overlay)), StringJsEnum_$Overlay))); } /** @nodts */ static m_acceptsJsFunctionSupplier__jsenum_Main_JsFunctionSuppiler__void(/** ?function():$Enums_BoxedComparableLightEnum */ supplier) {} /** @nodts */ static m_acceptsSupplierOfSupplier__jsenum_Main_Supplier__void(/** Supplier>> */ supplier) {} /** @nodts */ + static m_testReturnsAndParameters__void() { + let returnedValue = Main.m_returnsJsEnum__jsenum_Main_ComparableJsEnum(); + let returnedNullValue = Main.m_returnsNullJsEnum__jsenum_Main_ComparableJsEnum(); + Main.m_takesJsEnum__jsenum_Main_ComparableJsEnum__void(ComparableJsEnum.ONE); + } + /** @nodts @return {?ComparableJsEnum} */ + static m_returnsJsEnum__jsenum_Main_ComparableJsEnum() { + return ComparableJsEnum.ONE; + } + /** @nodts @return {?ComparableJsEnum} */ + static m_returnsNullJsEnum__jsenum_Main_ComparableJsEnum() { + return /**@type {?ComparableJsEnum}*/ ($Enums.unbox(null, $Overlay)); + } + /** @nodts */ + static m_takesJsEnum__jsenum_Main_ComparableJsEnum__void(/** ?ComparableJsEnum */ value) {} + /** @nodts */ static m_testBoxUnboxWithTypeInference__void() { let templatedField = /**@type {!TemplatedField<$Enums_BoxedComparableLightEnum>}*/ (TemplatedField.$create__java_lang_Object(/**@type {$Enums_BoxedComparableLightEnum}*/ ($Enums.boxComparable(ComparableJsEnum.ONE, $Overlay)))); let unboxed = /**@type {?ComparableJsEnum}*/ ($Enums.unbox(templatedField.m_getValue__java_lang_Object_$pp_jsenum(), $Overlay)); diff --git a/transpiler/javatests/com/google/j2cl/readable/java/jsenum/output_closure/Main.js.mappings.txt b/transpiler/javatests/com/google/j2cl/readable/java/jsenum/output_closure/Main.js.mappings.txt index 92450438f9..60585941eb 100644 --- a/transpiler/javatests/com/google/j2cl/readable/java/jsenum/output_closure/Main.js.mappings.txt +++ b/transpiler/javatests/com/google/j2cl/readable/java/jsenum/output_closure/Main.js.mappings.txt @@ -107,10 +107,24 @@ [ComparableJsEnum.ONE.equals(o);] => [$Objects.m_equals__java_lang_Object__java_lang_Object__boolean(/**@type {$Enums_BoxedComparableLightEnum}*/ ($Enums.boxComparable(ComparableJsEnum.ONE, $Overlay)), o);] "jsenum.Main.testJsEnumAutoboxingSpecialMethods" [o.equals(ComparableJsEnum.ZERO);] => [$Objects.m_equals__java_lang_Object__java_lang_Object__boolean(o, /**@type {$Enums_BoxedComparableLightEnum}*/ ($Enums.boxComparable(ComparableJsEnum.ZERO, $Overlay)));] "jsenum.Main.testJsEnumAutoboxingSpecialMethods" [StringJsEnum.ONE.equals(jsEnum);] => [$Objects.m_equals__java_lang_Object__java_lang_Object__boolean(/**@type {$Enums_BoxedLightEnum}*/ ($Enums.box(StringJsEnum.ONE, StringJsEnum_$Overlay)), /**@type {$Enums_BoxedComparableLightEnum}*/ ($Enums.boxComparable(jsEnum, $Overlay)));] "jsenum.Main.testJsEnumAutoboxingSpecialMethods" +[boxingPassthrough(ComparableJsEnum.ONE).equals(boxingPassthrough(ComparableJsEnum.ONE));] => [$Enums.equals(/**@type {?ComparableJsEnum}*/ ($Enums.unbox(Main.m_boxingPassthrough__java_lang_Object__java_lang_Object(/**@type {$Enums_BoxedComparableLightEnum}*/ ($Enums.boxComparable(ComparableJsEnum.ONE, $Overlay))), $Overlay)), /**@type {?ComparableJsEnum}*/ ($Enums.unbox(Main.m_boxingPassthrough__java_lang_Object__java_lang_Object(/**@type {$Enums_BoxedComparableLightEnum}*/ ($Enums.boxComparable(ComparableJsEnum.ONE, $Overlay))), $Overlay)));] "jsenum.Main.testJsEnumAutoboxingSpecialMethods" +[boxingPassthrough(ComparableJsEnum.ONE).equals(boxingPassthrough(StringJsEnum.ONE));] => [$Objects.m_equals__java_lang_Object__java_lang_Object__boolean(/**@type {$Enums_BoxedComparableLightEnum}*/ ($Enums.boxComparable(/**@type {?ComparableJsEnum}*/ ($Enums.unbox(Main.m_boxingPassthrough__java_lang_Object__java_lang_Object(/**@type {$Enums_BoxedComparableLightEnum}*/ ($Enums.boxComparable(ComparableJsEnum.ONE, $Overlay))), $Overlay)), $Overlay)), /**@type {$Enums_BoxedLightEnum}*/ ($Enums.box(/**@type {?StringJsEnum}*/ ($Enums.unbox(Main.m_boxingPassthrough__java_lang_Object__java_lang_Object(/**@type {$Enums_BoxedLightEnum}*/ ($Enums.box(StringJsEnum.ONE, StringJsEnum_$Overlay))), StringJsEnum_$Overlay)), StringJsEnum_$Overlay)));] "jsenum.Main.testJsEnumAutoboxingSpecialMethods" [acceptsJsFunctionSupplier] => [m_acceptsJsFunctionSupplier__jsenum_Main_JsFunctionSuppiler__void] [supplier] => [supplier] "supplier" [acceptsSupplierOfSupplier] => [m_acceptsSupplierOfSupplier__jsenum_Main_Supplier__void] [supplier] => [supplier] "supplier" +[testReturnsAndParameters] => [m_testReturnsAndParameters__void] +[ComparableJsEnum returnedValue = returnsJsEnum();] => [let returnedValue = Main.m_returnsJsEnum__jsenum_Main_ComparableJsEnum();] "jsenum.Main.testReturnsAndParameters" +[returnedValue] => [returnedValue] "returnedValue" +[ComparableJsEnum returnedNullValue = returnsNullJsEnum();] => [let returnedNullValue = Main.m_returnsNullJsEnum__jsenum_Main_ComparableJsEnum();] "jsenum.Main.testReturnsAndParameters" +[returnedNullValue] => [returnedNullValue] "returnedNullValue" +[takesJsEnum(ComparableJsEnum.ONE);] => [Main.m_takesJsEnum__jsenum_Main_ComparableJsEnum__void(ComparableJsEnum.ONE);] "jsenum.Main.testReturnsAndParameters" +[returnsJsEnum] => [m_returnsJsEnum__jsenum_Main_ComparableJsEnum] +[return ComparableJsEnum.ONE;] => [return ComparableJsEnum.ONE;] "jsenum.Main.returnsJsEnum" +[returnsNullJsEnum] => [m_returnsNullJsEnum__jsenum_Main_ComparableJsEnum] +[return null;] => [return /**@type {?ComparableJsEnum}*/ ($Enums.unbox(null, $Overlay));] "jsenum.Main.returnsNullJsEnum" +[takesJsEnum] => [m_takesJsEnum__jsenum_Main_ComparableJsEnum__void] +[value] => [value] "value" [testBoxUnboxWithTypeInference] => [m_testBoxUnboxWithTypeInference__void] [TemplatedField templatedField = new TemplatedField(ComparableJsEnum.ONE);] => [let templatedField = /**@type {!TemplatedField<$Enums_BoxedComparableLightEnum>}*/ (TemplatedField.$create__java_lang_Object(/**@type {$Enums_BoxedComparableLightEnum}*/ ($Enums.boxComparable(ComparableJsEnum.ONE, $Overlay))));] "jsenum.Main.testBoxUnboxWithTypeInference" diff --git a/transpiler/javatests/com/google/j2cl/readable/java/jsenum/output_kt/Main.kt.txt b/transpiler/javatests/com/google/j2cl/readable/java/jsenum/output_kt/Main.kt.txt index c6891f7bef..d5daf8aeae 100644 --- a/transpiler/javatests/com/google/j2cl/readable/java/jsenum/output_kt/Main.kt.txt +++ b/transpiler/javatests/com/google/j2cl/readable/java/jsenum/output_kt/Main.kt.txt @@ -119,6 +119,8 @@ open class Main { Main.ComparableJsEnum.ONE.equals(o) o!!.equals(Main.ComparableJsEnum.ZERO) Main.StringJsEnum.ONE.equals(jsEnum) + Main.boxingPassthrough_private_2(Main.ComparableJsEnum.ONE)!!.equals(Main.boxingPassthrough_private_2(Main.ComparableJsEnum.ONE)) + Main.boxingPassthrough_private_2(Main.ComparableJsEnum.ONE)!!.equals(Main.boxingPassthrough_private_2(Main.StringJsEnum.ONE)) } @JvmStatic @@ -127,6 +129,26 @@ open class Main { @JvmStatic internal fun acceptsSupplierOfSupplier_private_2(supplier: Main.Supplier?>?) {} + @JvmStatic + internal fun testReturnsAndParameters_private_2() { + val returnedValue: Main.ComparableJsEnum? = Main.returnsJsEnum_private_2() + val returnedNullValue: Main.ComparableJsEnum? = Main.returnsNullJsEnum_private_2() + Main.takesJsEnum_private_2(Main.ComparableJsEnum.ONE) + } + + @JvmStatic + internal fun returnsJsEnum_private_2(): Main.ComparableJsEnum? { + return Main.ComparableJsEnum.ONE + } + + @JvmStatic + internal fun returnsNullJsEnum_private_2(): Main.ComparableJsEnum? { + return null + } + + @JvmStatic + internal fun takesJsEnum_private_2(value: Main.ComparableJsEnum?) {} + @JvmStatic internal fun testBoxUnboxWithTypeInference_private_2() { val templatedField: Main.TemplatedField? = Main.TemplatedField(Main.ComparableJsEnum.ONE) diff --git a/transpiler/javatests/com/google/j2cl/readable/java/jsenum/output_wasm/module.wat.txt b/transpiler/javatests/com/google/j2cl/readable/java/jsenum/output_wasm/module.wat.txt new file mode 100644 index 0000000000..5229d78cd2 --- /dev/null +++ b/transpiler/javatests/com/google/j2cl/readable/java/jsenum/output_wasm/module.wat.txt @@ -0,0 +1,3236 @@ + ;;; Code for jsenum.Main.Supplier [type definition] + (type $jsenum.Main.Supplier.vtable (sub (struct + (field $m_get__java_lang_Object (ref $function.m_get__java_lang_Object)) + )) + ) + + ;;; Code for jsenum.Main.Consumer [type definition] + (type $jsenum.Main.Consumer.vtable (sub (struct + (field $m_accept__java_lang_Object__void (ref $function.m_accept__java_lang_Object__void)) + )) + ) + + ;;; Code for jsenum.Main.JsFunctionSuppiler [type definition] + (type $jsenum.Main.JsFunctionSuppiler.vtable (sub (struct + (field $m_get__java_lang_Object (ref $function.m_get__java_lang_Object)) + )) + ) + + ;;; Code for jsenum.Main.ComparableJsEnumSupplierConsumer [type definition] + (type $jsenum.Main.ComparableJsEnumSupplierConsumer.vtable (sub (struct + (field $m_accept__jsenum_Main_ComparableJsEnum__void (ref $function.m_accept__jsenum_Main_ComparableJsEnum__void)) + (field $m_get__jsenum_Main_ComparableJsEnum (ref $function.m_get__jsenum_Main_ComparableJsEnum)) + )) + ) + + ;;; Code for jsenum.Main.ComparableJsEnum.$Overlay [type definition] + (type $jsenum.Main.ComparableJsEnum.$Overlay (sub (struct + (field $vtable (ref $jsenum.Main.ComparableJsEnum.$Overlay.vtable)) + (field $itable (ref $itable)) + )) + ) + (type $jsenum.Main.ComparableJsEnum.$Overlay.vtable (sub (struct + (field $$getClassImpl__java_lang_Class (ref $function.$getClassImpl__java_lang_Class)) + )) + ) + + ;;; Code for jsenum.Main.IntJsEnum.$Overlay [type definition] + (type $jsenum.Main.IntJsEnum.$Overlay (sub (struct + (field $vtable (ref $jsenum.Main.IntJsEnum.$Overlay.vtable)) + (field $itable (ref $itable)) + )) + ) + (type $jsenum.Main.IntJsEnum.$Overlay.vtable (sub (struct + (field $$getClassImpl__java_lang_Class (ref $function.$getClassImpl__java_lang_Class)) + )) + ) + + ;;; Code for jsenum.Main.StringJsEnum.$Overlay [type definition] + (type $jsenum.Main.StringJsEnum.$Overlay (sub (struct + (field $vtable (ref $jsenum.Main.StringJsEnum.$Overlay.vtable)) + (field $itable (ref $itable)) + )) + ) + (type $jsenum.Main.StringJsEnum.$Overlay.vtable (sub (struct + (field $$getClassImpl__java_lang_Class (ref $function.$getClassImpl__java_lang_Class)) + )) + ) + + ;;; Code for jsenum.Main.NonNullableStringJsEnum.$Overlay [type definition] + (type $jsenum.Main.NonNullableStringJsEnum.$Overlay (sub (struct + (field $vtable (ref $jsenum.Main.NonNullableStringJsEnum.$Overlay.vtable)) + (field $itable (ref $itable)) + )) + ) + (type $jsenum.Main.NonNullableStringJsEnum.$Overlay.vtable (sub (struct + (field $$getClassImpl__java_lang_Class (ref $function.$getClassImpl__java_lang_Class)) + )) + ) + + ;;; Code for jsenum.Main.JsEnumWithRenamedProperties.$Overlay [type definition] + (type $jsenum.Main.JsEnumWithRenamedProperties.$Overlay (sub (struct + (field $vtable (ref $jsenum.Main.JsEnumWithRenamedProperties.$Overlay.vtable)) + (field $itable (ref $itable)) + )) + ) + (type $jsenum.Main.JsEnumWithRenamedProperties.$Overlay.vtable (sub (struct + (field $$getClassImpl__java_lang_Class (ref $function.$getClassImpl__java_lang_Class)) + )) + ) + + ;;; Code for jsenum.Main [type definition] + (type $jsenum.Main (sub $java.lang.Object (struct + (field $vtable (ref $jsenum.Main.vtable)) + (field $itable (ref $itable)) + (field $f_$systemIdentityHashCode__java_lang_Object (mut i32)) + )) + ) + (type $jsenum.Main.vtable (sub $java.lang.Object.vtable (struct + (field $$getClassImpl__java_lang_Class (ref $function.$getClassImpl__java_lang_Class)) + (field $m_equals__java_lang_Object__boolean (ref $function.m_equals__java_lang_Object__boolean)) + (field $m_getClass__java_lang_Class (ref $function.m_getClass__java_lang_Class)) + (field $m_hashCode__int (ref $function.m_hashCode__int)) + (field $m_toString__java_lang_String (ref $function.m_toString__java_lang_String)) + )) + ) + + ;;; Code for jsenum.Main.$LambdaImplementor$1 [type definition] + (type $jsenum.Main.$LambdaImplementor$1 (sub $java.lang.Object (struct + (field $vtable (ref $jsenum.Main.$LambdaImplementor$1.vtable)) + (field $itable (ref $jsenum.Main.$LambdaImplementor$1.itable)) + (field $f_$systemIdentityHashCode__java_lang_Object (mut i32)) + )) + ) + (type $jsenum.Main.$LambdaImplementor$1.vtable (sub $java.lang.Object.vtable (struct + (field $$getClassImpl__java_lang_Class (ref $function.$getClassImpl__java_lang_Class)) + (field $m_equals__java_lang_Object__boolean (ref $function.m_equals__java_lang_Object__boolean)) + (field $m_getClass__java_lang_Class (ref $function.m_getClass__java_lang_Class)) + (field $m_hashCode__int (ref $function.m_hashCode__int)) + (field $m_toString__java_lang_String (ref $function.m_toString__java_lang_String)) + (field $m_get__java_lang_Object (ref $function.m_get__java_lang_Object)) + )) + ) + (type $jsenum.Main.$LambdaImplementor$1.itable (sub $itable (struct + (field $slot0 (ref $jsenum.Main.Supplier.vtable)) + (field $slot1 (ref null struct)) + (field $slot2 (ref null struct)) + (field $slot3 (ref null struct)) + (field $slot4 (ref null struct)) + (field $slot5 (ref null struct)) + (field $slot6 (ref null struct)) + ))) + + ;;; Code for jsenum.Main.$LambdaImplementor$2 [type definition] + (type $jsenum.Main.$LambdaImplementor$2 (sub $java.lang.Object (struct + (field $vtable (ref $jsenum.Main.$LambdaImplementor$2.vtable)) + (field $itable (ref $jsenum.Main.$LambdaImplementor$2.itable)) + (field $f_$systemIdentityHashCode__java_lang_Object (mut i32)) + )) + ) + (type $jsenum.Main.$LambdaImplementor$2.vtable (sub $java.lang.Object.vtable (struct + (field $$getClassImpl__java_lang_Class (ref $function.$getClassImpl__java_lang_Class)) + (field $m_equals__java_lang_Object__boolean (ref $function.m_equals__java_lang_Object__boolean)) + (field $m_getClass__java_lang_Class (ref $function.m_getClass__java_lang_Class)) + (field $m_hashCode__int (ref $function.m_hashCode__int)) + (field $m_toString__java_lang_String (ref $function.m_toString__java_lang_String)) + (field $m_accept__java_lang_Object__void (ref $function.m_accept__java_lang_Object__void)) + )) + ) + (type $jsenum.Main.$LambdaImplementor$2.itable (sub $itable (struct + (field $slot0 (ref null struct)) + (field $slot1 (ref $jsenum.Main.Consumer.vtable)) + (field $slot2 (ref null struct)) + (field $slot3 (ref null struct)) + (field $slot4 (ref null struct)) + (field $slot5 (ref null struct)) + (field $slot6 (ref null struct)) + ))) + + ;;; Code for jsenum.Main.$LambdaImplementor$3 [type definition] + (type $jsenum.Main.$LambdaImplementor$3 (sub $java.lang.Object (struct + (field $vtable (ref $jsenum.Main.$LambdaImplementor$3.vtable)) + (field $itable (ref $jsenum.Main.$LambdaImplementor$3.itable)) + (field $f_$systemIdentityHashCode__java_lang_Object (mut i32)) + )) + ) + (type $jsenum.Main.$LambdaImplementor$3.vtable (sub $java.lang.Object.vtable (struct + (field $$getClassImpl__java_lang_Class (ref $function.$getClassImpl__java_lang_Class)) + (field $m_equals__java_lang_Object__boolean (ref $function.m_equals__java_lang_Object__boolean)) + (field $m_getClass__java_lang_Class (ref $function.m_getClass__java_lang_Class)) + (field $m_hashCode__int (ref $function.m_hashCode__int)) + (field $m_toString__java_lang_String (ref $function.m_toString__java_lang_String)) + (field $m_get__java_lang_Object (ref $function.m_get__java_lang_Object)) + )) + ) + (type $jsenum.Main.$LambdaImplementor$3.itable (sub $itable (struct + (field $slot0 (ref $jsenum.Main.JsFunctionSuppiler.vtable)) + (field $slot1 (ref null struct)) + (field $slot2 (ref null struct)) + (field $slot3 (ref null struct)) + (field $slot4 (ref null struct)) + (field $slot5 (ref null struct)) + (field $slot6 (ref null struct)) + ))) + + ;;; Code for jsenum.Main.$LambdaImplementor$4 [type definition] + (type $jsenum.Main.$LambdaImplementor$4 (sub $java.lang.Object (struct + (field $vtable (ref $jsenum.Main.$LambdaImplementor$4.vtable)) + (field $itable (ref $jsenum.Main.$LambdaImplementor$4.itable)) + (field $f_$systemIdentityHashCode__java_lang_Object (mut i32)) + )) + ) + (type $jsenum.Main.$LambdaImplementor$4.vtable (sub $java.lang.Object.vtable (struct + (field $$getClassImpl__java_lang_Class (ref $function.$getClassImpl__java_lang_Class)) + (field $m_equals__java_lang_Object__boolean (ref $function.m_equals__java_lang_Object__boolean)) + (field $m_getClass__java_lang_Class (ref $function.m_getClass__java_lang_Class)) + (field $m_hashCode__int (ref $function.m_hashCode__int)) + (field $m_toString__java_lang_String (ref $function.m_toString__java_lang_String)) + (field $m_get__java_lang_Object (ref $function.m_get__java_lang_Object)) + )) + ) + (type $jsenum.Main.$LambdaImplementor$4.itable (sub $itable (struct + (field $slot0 (ref $jsenum.Main.Supplier.vtable)) + (field $slot1 (ref null struct)) + (field $slot2 (ref null struct)) + (field $slot3 (ref null struct)) + (field $slot4 (ref null struct)) + (field $slot5 (ref null struct)) + (field $slot6 (ref null struct)) + ))) + + ;;; Code for jsenum.Main.$LambdaImplementor$5 [type definition] + (type $jsenum.Main.$LambdaImplementor$5 (sub $java.lang.Object (struct + (field $vtable (ref $jsenum.Main.$LambdaImplementor$5.vtable)) + (field $itable (ref $jsenum.Main.$LambdaImplementor$5.itable)) + (field $f_$systemIdentityHashCode__java_lang_Object (mut i32)) + )) + ) + (type $jsenum.Main.$LambdaImplementor$5.vtable (sub $java.lang.Object.vtable (struct + (field $$getClassImpl__java_lang_Class (ref $function.$getClassImpl__java_lang_Class)) + (field $m_equals__java_lang_Object__boolean (ref $function.m_equals__java_lang_Object__boolean)) + (field $m_getClass__java_lang_Class (ref $function.m_getClass__java_lang_Class)) + (field $m_hashCode__int (ref $function.m_hashCode__int)) + (field $m_toString__java_lang_String (ref $function.m_toString__java_lang_String)) + (field $m_get__java_lang_Object (ref $function.m_get__java_lang_Object)) + )) + ) + (type $jsenum.Main.$LambdaImplementor$5.itable (sub $itable (struct + (field $slot0 (ref $jsenum.Main.Supplier.vtable)) + (field $slot1 (ref null struct)) + (field $slot2 (ref null struct)) + (field $slot3 (ref null struct)) + (field $slot4 (ref null struct)) + (field $slot5 (ref null struct)) + (field $slot6 (ref null struct)) + ))) + + ;;; Code for jsenum.Main.ComparableJsEnum [type definition] + + ;;; Code for jsenum.Main.IntJsEnum [type definition] + + ;;; Code for jsenum.Main.StringJsEnum [type definition] + + ;;; Code for jsenum.Main.NonNullableStringJsEnum [type definition] + + ;;; Code for jsenum.Main.TemplatedField [type definition] + (type $jsenum.Main.TemplatedField (sub $java.lang.Object (struct + (field $vtable (ref $jsenum.Main.TemplatedField.vtable)) + (field $itable (ref $itable)) + (field $f_$systemIdentityHashCode__java_lang_Object (mut i32)) + (field $f_value__jsenum_Main_TemplatedField (mut (ref null $java.lang.Object))) + )) + ) + (type $jsenum.Main.TemplatedField.vtable (sub $java.lang.Object.vtable (struct + (field $$getClassImpl__java_lang_Class (ref $function.$getClassImpl__java_lang_Class)) + (field $m_equals__java_lang_Object__boolean (ref $function.m_equals__java_lang_Object__boolean)) + (field $m_getClass__java_lang_Class (ref $function.m_getClass__java_lang_Class)) + (field $m_hashCode__int (ref $function.m_hashCode__int)) + (field $m_toString__java_lang_String (ref $function.m_toString__java_lang_String)) + (field $m_getValue__java_lang_Object_$pp_jsenum (ref $function.m_getValue__java_lang_Object_$pp_jsenum)) + )) + ) + + ;;; Code for jsenum.Main.Foo [type definition] + (type $jsenum.Main.Foo (sub $java.lang.Object (struct + (field $vtable (ref $jsenum.Main.Foo.vtable)) + (field $itable (ref $itable)) + (field $f_$systemIdentityHashCode__java_lang_Object (mut i32)) + )) + ) + (type $jsenum.Main.Foo.vtable (sub $java.lang.Object.vtable (struct + (field $$getClassImpl__java_lang_Class (ref $function.$getClassImpl__java_lang_Class)) + (field $m_equals__java_lang_Object__boolean (ref $function.m_equals__java_lang_Object__boolean)) + (field $m_getClass__java_lang_Class (ref $function.m_getClass__java_lang_Class)) + (field $m_hashCode__int (ref $function.m_hashCode__int)) + (field $m_toString__java_lang_String (ref $function.m_toString__java_lang_String)) + )) + ) + + ;;; Code for jsenum.Main.JsEnumWithRenamedProperties [type definition] + + ;;; Code for jsenum.Main.SupplierConsumerImpl [type definition] + (type $jsenum.Main.SupplierConsumerImpl (sub $java.lang.Object (struct + (field $vtable (ref $jsenum.Main.SupplierConsumerImpl.vtable)) + (field $itable (ref $jsenum.Main.SupplierConsumerImpl.itable)) + (field $f_$systemIdentityHashCode__java_lang_Object (mut i32)) + )) + ) + (type $jsenum.Main.SupplierConsumerImpl.vtable (sub $java.lang.Object.vtable (struct + (field $$getClassImpl__java_lang_Class (ref $function.$getClassImpl__java_lang_Class)) + (field $m_equals__java_lang_Object__boolean (ref $function.m_equals__java_lang_Object__boolean)) + (field $m_getClass__java_lang_Class (ref $function.m_getClass__java_lang_Class)) + (field $m_hashCode__int (ref $function.m_hashCode__int)) + (field $m_toString__java_lang_String (ref $function.m_toString__java_lang_String)) + (field $m_get__java_lang_Object (ref $function.m_get__java_lang_Object)) + (field $m_accept__java_lang_Object__void (ref $function.m_accept__java_lang_Object__void)) + )) + ) + (type $jsenum.Main.SupplierConsumerImpl.itable (sub $itable (struct + (field $slot0 (ref $jsenum.Main.Supplier.vtable)) + (field $slot1 (ref $jsenum.Main.Consumer.vtable)) + (field $slot2 (ref null struct)) + (field $slot3 (ref null struct)) + (field $slot4 (ref null struct)) + (field $slot5 (ref null struct)) + (field $slot6 (ref null struct)) + ))) + + ;;; Code for jsenum.Main.NativeStringEnum [type definition] + (type $jsenum.Main.NativeStringEnum (sub $java.lang.Enum (struct + (field $vtable (ref $jsenum.Main.NativeStringEnum.vtable)) + (field $itable (ref $jsenum.Main.NativeStringEnum.itable)) + (field $f_$systemIdentityHashCode__java_lang_Object (mut i32)) + (field $f_name__java_lang_Enum_ (mut (ref null $java.lang.String))) + (field $f_ordinal__java_lang_Enum_ (mut i32)) + )) + ) + (type $jsenum.Main.NativeStringEnum.vtable (sub $java.lang.Enum.vtable (struct + (field $$getClassImpl__java_lang_Class (ref $function.$getClassImpl__java_lang_Class)) + (field $m_equals__java_lang_Object__boolean (ref $function.m_equals__java_lang_Object__boolean)) + (field $m_getClass__java_lang_Class (ref $function.m_getClass__java_lang_Class)) + (field $m_hashCode__int (ref $function.m_hashCode__int)) + (field $m_toString__java_lang_String (ref $function.m_toString__java_lang_String)) + (field $m_compareTo__java_lang_Object__int (ref $function.m_compareTo__java_lang_Object__int)) + (field $m_compareTo__java_lang_Enum__int (ref $function.m_compareTo__java_lang_Enum__int)) + (field $m_getDeclaringClass__java_lang_Class (ref $function.m_getDeclaringClass__java_lang_Class)) + (field $m_name__java_lang_String (ref $function.m_name__java_lang_String)) + (field $m_ordinal__int (ref $function.m_ordinal__int)) + )) + ) + (type $jsenum.Main.NativeStringEnum.itable (sub $java.lang.Enum.itable (struct + (field $slot0 (ref $java.io.Serializable.vtable)) + (field $slot1 (ref $java.lang.Comparable.vtable)) + (field $slot2 (ref null struct)) + (field $slot3 (ref null struct)) + (field $slot4 (ref null struct)) + (field $slot5 (ref null struct)) + (field $slot6 (ref null struct)) + ))) + + ;;; Code for jsenum.Main.ComparableJsEnumSupplierConsumerImpl [type definition] + (type $jsenum.Main.ComparableJsEnumSupplierConsumerImpl (sub $jsenum.Main.SupplierConsumerImpl (struct + (field $vtable (ref $jsenum.Main.ComparableJsEnumSupplierConsumerImpl.vtable)) + (field $itable (ref $jsenum.Main.ComparableJsEnumSupplierConsumerImpl.itable)) + (field $f_$systemIdentityHashCode__java_lang_Object (mut i32)) + )) + ) + (type $jsenum.Main.ComparableJsEnumSupplierConsumerImpl.vtable (sub $jsenum.Main.SupplierConsumerImpl.vtable (struct + (field $$getClassImpl__java_lang_Class (ref $function.$getClassImpl__java_lang_Class)) + (field $m_equals__java_lang_Object__boolean (ref $function.m_equals__java_lang_Object__boolean)) + (field $m_getClass__java_lang_Class (ref $function.m_getClass__java_lang_Class)) + (field $m_hashCode__int (ref $function.m_hashCode__int)) + (field $m_toString__java_lang_String (ref $function.m_toString__java_lang_String)) + (field $m_get__java_lang_Object (ref $function.m_get__java_lang_Object)) + (field $m_accept__java_lang_Object__void (ref $function.m_accept__java_lang_Object__void)) + (field $m_accept__jsenum_Main_ComparableJsEnum__void (ref $function.m_accept__jsenum_Main_ComparableJsEnum__void)) + (field $m_get__jsenum_Main_ComparableJsEnum (ref $function.m_get__jsenum_Main_ComparableJsEnum)) + )) + ) + (type $jsenum.Main.ComparableJsEnumSupplierConsumerImpl.itable (sub $jsenum.Main.SupplierConsumerImpl.itable (struct + (field $slot0 (ref $jsenum.Main.Supplier.vtable)) + (field $slot1 (ref $jsenum.Main.Consumer.vtable)) + (field $slot2 (ref $jsenum.Main.ComparableJsEnumSupplierConsumer.vtable)) + (field $slot3 (ref null struct)) + (field $slot4 (ref null struct)) + (field $slot5 (ref null struct)) + (field $slot6 (ref null struct)) + ))) + + ;;; Code for jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides [type definition] + (type $jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides (sub $jsenum.Main.SupplierConsumerImpl (struct + (field $vtable (ref $jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides.vtable)) + (field $itable (ref $jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides.itable)) + (field $f_$systemIdentityHashCode__java_lang_Object (mut i32)) + )) + ) + (type $jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides.vtable (sub $jsenum.Main.SupplierConsumerImpl.vtable (struct + (field $$getClassImpl__java_lang_Class (ref $function.$getClassImpl__java_lang_Class)) + (field $m_equals__java_lang_Object__boolean (ref $function.m_equals__java_lang_Object__boolean)) + (field $m_getClass__java_lang_Class (ref $function.m_getClass__java_lang_Class)) + (field $m_hashCode__int (ref $function.m_hashCode__int)) + (field $m_toString__java_lang_String (ref $function.m_toString__java_lang_String)) + (field $m_get__java_lang_Object (ref $function.m_get__java_lang_Object)) + (field $m_accept__java_lang_Object__void (ref $function.m_accept__java_lang_Object__void)) + (field $m_accept__jsenum_Main_ComparableJsEnum__void (ref $function.m_accept__jsenum_Main_ComparableJsEnum__void)) + (field $m_get__jsenum_Main_ComparableJsEnum (ref $function.m_get__jsenum_Main_ComparableJsEnum)) + )) + ) + (type $jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides.itable (sub $jsenum.Main.SupplierConsumerImpl.itable (struct + (field $slot0 (ref $jsenum.Main.Supplier.vtable)) + (field $slot1 (ref $jsenum.Main.Consumer.vtable)) + (field $slot2 (ref $jsenum.Main.ComparableJsEnumSupplierConsumer.vtable)) + (field $slot3 (ref null struct)) + (field $slot4 (ref null struct)) + (field $slot5 (ref null struct)) + (field $slot6 (ref null struct)) + ))) + +;;; Code for jsenum.Main [vtable.init] +(global $jsenum.Main.vtable (ref $jsenum.Main.vtable) + (struct.new $jsenum.Main.vtable + (ref.func $$getClassImpl__java_lang_Class@jsenum.Main) + (ref.func $m_equals__java_lang_Object__boolean@java.lang.Object) + (ref.func $m_getClass__java_lang_Class@java.lang.Object) + (ref.func $m_hashCode__int@java.lang.Object) + (ref.func $m_toString__java_lang_String@java.lang.Object) + ) +) + +;;; Code for jsenum.Main.$LambdaImplementor$1 [vtable.init] +(global $jsenum.Main.$LambdaImplementor$1.vtable (ref $jsenum.Main.$LambdaImplementor$1.vtable) + (struct.new $jsenum.Main.$LambdaImplementor$1.vtable + (ref.func $$getClassImpl__java_lang_Class@jsenum.Main.$LambdaImplementor$1) + (ref.func $m_equals__java_lang_Object__boolean@java.lang.Object) + (ref.func $m_getClass__java_lang_Class@java.lang.Object) + (ref.func $m_hashCode__int@java.lang.Object) + (ref.func $m_toString__java_lang_String@java.lang.Object) + (ref.func $m_get__java_lang_Object@jsenum.Main.$LambdaImplementor$1) + ) +) + +;;; Code for jsenum.Main.$LambdaImplementor$1 [itable.init] + +(global $jsenum.Main.Supplier.vtable@$jsenum.Main.$LambdaImplementor$1 (ref $jsenum.Main.Supplier.vtable) + (struct.new $jsenum.Main.Supplier.vtable + (ref.func $m_get__java_lang_Object@jsenum.Main.$LambdaImplementor$1) + ) +) +(global $jsenum.Main.$LambdaImplementor$1.itable (ref $jsenum.Main.$LambdaImplementor$1.itable) + (struct.new $jsenum.Main.$LambdaImplementor$1.itable + (global.get $jsenum.Main.Supplier.vtable@$jsenum.Main.$LambdaImplementor$1) + (ref.null struct) + (ref.null struct) + (ref.null struct) + (ref.null struct) + (ref.null struct) + (ref.null struct) + ) +) + +;;; Code for jsenum.Main.$LambdaImplementor$2 [vtable.init] +(global $jsenum.Main.$LambdaImplementor$2.vtable (ref $jsenum.Main.$LambdaImplementor$2.vtable) + (struct.new $jsenum.Main.$LambdaImplementor$2.vtable + (ref.func $$getClassImpl__java_lang_Class@jsenum.Main.$LambdaImplementor$2) + (ref.func $m_equals__java_lang_Object__boolean@java.lang.Object) + (ref.func $m_getClass__java_lang_Class@java.lang.Object) + (ref.func $m_hashCode__int@java.lang.Object) + (ref.func $m_toString__java_lang_String@java.lang.Object) + (ref.func $m_accept__java_lang_Object__void@jsenum.Main.$LambdaImplementor$2) + ) +) + +;;; Code for jsenum.Main.$LambdaImplementor$2 [itable.init] + +(global $jsenum.Main.Consumer.vtable@$jsenum.Main.$LambdaImplementor$2 (ref $jsenum.Main.Consumer.vtable) + (struct.new $jsenum.Main.Consumer.vtable + (ref.func $m_accept__java_lang_Object__void@jsenum.Main.$LambdaImplementor$2) + ) +) +(global $jsenum.Main.$LambdaImplementor$2.itable (ref $jsenum.Main.$LambdaImplementor$2.itable) + (struct.new $jsenum.Main.$LambdaImplementor$2.itable + (ref.null struct) + (global.get $jsenum.Main.Consumer.vtable@$jsenum.Main.$LambdaImplementor$2) + (ref.null struct) + (ref.null struct) + (ref.null struct) + (ref.null struct) + (ref.null struct) + ) +) + +;;; Code for jsenum.Main.$LambdaImplementor$3 [vtable.init] +(global $jsenum.Main.$LambdaImplementor$3.vtable (ref $jsenum.Main.$LambdaImplementor$3.vtable) + (struct.new $jsenum.Main.$LambdaImplementor$3.vtable + (ref.func $$getClassImpl__java_lang_Class@jsenum.Main.$LambdaImplementor$3) + (ref.func $m_equals__java_lang_Object__boolean@java.lang.Object) + (ref.func $m_getClass__java_lang_Class@java.lang.Object) + (ref.func $m_hashCode__int@java.lang.Object) + (ref.func $m_toString__java_lang_String@java.lang.Object) + (ref.func $m_get__java_lang_Object@jsenum.Main.$LambdaImplementor$3) + ) +) + +;;; Code for jsenum.Main.$LambdaImplementor$3 [itable.init] + +(global $jsenum.Main.JsFunctionSuppiler.vtable@$jsenum.Main.$LambdaImplementor$3 (ref $jsenum.Main.JsFunctionSuppiler.vtable) + (struct.new $jsenum.Main.JsFunctionSuppiler.vtable + (ref.func $m_get__java_lang_Object@jsenum.Main.$LambdaImplementor$3) + ) +) +(global $jsenum.Main.$LambdaImplementor$3.itable (ref $jsenum.Main.$LambdaImplementor$3.itable) + (struct.new $jsenum.Main.$LambdaImplementor$3.itable + (global.get $jsenum.Main.JsFunctionSuppiler.vtable@$jsenum.Main.$LambdaImplementor$3) + (ref.null struct) + (ref.null struct) + (ref.null struct) + (ref.null struct) + (ref.null struct) + (ref.null struct) + ) +) + +;;; Code for jsenum.Main.$LambdaImplementor$4 [vtable.init] +(global $jsenum.Main.$LambdaImplementor$4.vtable (ref $jsenum.Main.$LambdaImplementor$4.vtable) + (struct.new $jsenum.Main.$LambdaImplementor$4.vtable + (ref.func $$getClassImpl__java_lang_Class@jsenum.Main.$LambdaImplementor$4) + (ref.func $m_equals__java_lang_Object__boolean@java.lang.Object) + (ref.func $m_getClass__java_lang_Class@java.lang.Object) + (ref.func $m_hashCode__int@java.lang.Object) + (ref.func $m_toString__java_lang_String@java.lang.Object) + (ref.func $m_get__java_lang_Object@jsenum.Main.$LambdaImplementor$4) + ) +) + +;;; Code for jsenum.Main.$LambdaImplementor$4 [itable.init] + +(global $jsenum.Main.Supplier.vtable@$jsenum.Main.$LambdaImplementor$4 (ref $jsenum.Main.Supplier.vtable) + (struct.new $jsenum.Main.Supplier.vtable + (ref.func $m_get__java_lang_Object@jsenum.Main.$LambdaImplementor$4) + ) +) +(global $jsenum.Main.$LambdaImplementor$4.itable (ref $jsenum.Main.$LambdaImplementor$4.itable) + (struct.new $jsenum.Main.$LambdaImplementor$4.itable + (global.get $jsenum.Main.Supplier.vtable@$jsenum.Main.$LambdaImplementor$4) + (ref.null struct) + (ref.null struct) + (ref.null struct) + (ref.null struct) + (ref.null struct) + (ref.null struct) + ) +) + +;;; Code for jsenum.Main.$LambdaImplementor$5 [vtable.init] +(global $jsenum.Main.$LambdaImplementor$5.vtable (ref $jsenum.Main.$LambdaImplementor$5.vtable) + (struct.new $jsenum.Main.$LambdaImplementor$5.vtable + (ref.func $$getClassImpl__java_lang_Class@jsenum.Main.$LambdaImplementor$5) + (ref.func $m_equals__java_lang_Object__boolean@java.lang.Object) + (ref.func $m_getClass__java_lang_Class@java.lang.Object) + (ref.func $m_hashCode__int@java.lang.Object) + (ref.func $m_toString__java_lang_String@java.lang.Object) + (ref.func $m_get__java_lang_Object@jsenum.Main.$LambdaImplementor$5) + ) +) + +;;; Code for jsenum.Main.$LambdaImplementor$5 [itable.init] + +(global $jsenum.Main.Supplier.vtable@$jsenum.Main.$LambdaImplementor$5 (ref $jsenum.Main.Supplier.vtable) + (struct.new $jsenum.Main.Supplier.vtable + (ref.func $m_get__java_lang_Object@jsenum.Main.$LambdaImplementor$5) + ) +) +(global $jsenum.Main.$LambdaImplementor$5.itable (ref $jsenum.Main.$LambdaImplementor$5.itable) + (struct.new $jsenum.Main.$LambdaImplementor$5.itable + (global.get $jsenum.Main.Supplier.vtable@$jsenum.Main.$LambdaImplementor$5) + (ref.null struct) + (ref.null struct) + (ref.null struct) + (ref.null struct) + (ref.null struct) + (ref.null struct) + ) +) + +;;; Code for jsenum.Main.NativeStringEnum [vtable.init] +(global $jsenum.Main.NativeStringEnum.vtable (ref $jsenum.Main.NativeStringEnum.vtable) + (struct.new $jsenum.Main.NativeStringEnum.vtable + (ref.func $$getClassImpl__java_lang_Class@jsenum.Main.NativeStringEnum) + (ref.func $m_equals__java_lang_Object__boolean@java.lang.Enum) + (ref.func $m_getClass__java_lang_Class@java.lang.Object) + (ref.func $m_hashCode__int@java.lang.Enum) + (ref.func $m_toString__java_lang_String@java.lang.Enum) + (ref.func $m_compareTo__java_lang_Object__int@java.lang.Enum) + (ref.func $m_compareTo__java_lang_Enum__int@java.lang.Enum) + (ref.func $m_getDeclaringClass__java_lang_Class@java.lang.Enum) + (ref.func $m_name__java_lang_String@java.lang.Enum) + (ref.func $m_ordinal__int@java.lang.Enum) + ) +) + +;;; Code for jsenum.Main.NativeStringEnum [itable.init] + +(global $java.io.Serializable.vtable@$jsenum.Main.NativeStringEnum (ref $java.io.Serializable.vtable) + (struct.new $java.io.Serializable.vtable + ) +) +(global $java.lang.Comparable.vtable@$jsenum.Main.NativeStringEnum (ref $java.lang.Comparable.vtable) + (struct.new $java.lang.Comparable.vtable + (ref.func $m_compareTo__java_lang_Object__int@java.lang.Enum) + ) +) +(global $jsenum.Main.NativeStringEnum.itable (ref $jsenum.Main.NativeStringEnum.itable) + (struct.new $jsenum.Main.NativeStringEnum.itable + (global.get $java.io.Serializable.vtable@$jsenum.Main.NativeStringEnum) + (global.get $java.lang.Comparable.vtable@$jsenum.Main.NativeStringEnum) + (ref.null struct) + (ref.null struct) + (ref.null struct) + (ref.null struct) + (ref.null struct) + ) +) + +;;; Code for jsenum.Main.TemplatedField [vtable.init] +(global $jsenum.Main.TemplatedField.vtable (ref $jsenum.Main.TemplatedField.vtable) + (struct.new $jsenum.Main.TemplatedField.vtable + (ref.func $$getClassImpl__java_lang_Class@jsenum.Main.TemplatedField) + (ref.func $m_equals__java_lang_Object__boolean@java.lang.Object) + (ref.func $m_getClass__java_lang_Class@java.lang.Object) + (ref.func $m_hashCode__int@java.lang.Object) + (ref.func $m_toString__java_lang_String@java.lang.Object) + (ref.func $m_getValue__java_lang_Object_$pp_jsenum@jsenum.Main.TemplatedField) + ) +) + +;;; Code for jsenum.Main.Foo [vtable.init] +(global $jsenum.Main.Foo.vtable (ref $jsenum.Main.Foo.vtable) + (struct.new $jsenum.Main.Foo.vtable + (ref.func $$getClassImpl__java_lang_Class@jsenum.Main.Foo) + (ref.func $m_equals__java_lang_Object__boolean@java.lang.Object) + (ref.func $m_getClass__java_lang_Class@java.lang.Object) + (ref.func $m_hashCode__int@java.lang.Object) + (ref.func $m_toString__java_lang_String@java.lang.Object) + ) +) + +;;; Code for jsenum.Main.SupplierConsumerImpl [vtable.init] +(global $jsenum.Main.SupplierConsumerImpl.vtable (ref $jsenum.Main.SupplierConsumerImpl.vtable) + (struct.new $jsenum.Main.SupplierConsumerImpl.vtable + (ref.func $$getClassImpl__java_lang_Class@jsenum.Main.SupplierConsumerImpl) + (ref.func $m_equals__java_lang_Object__boolean@java.lang.Object) + (ref.func $m_getClass__java_lang_Class@java.lang.Object) + (ref.func $m_hashCode__int@java.lang.Object) + (ref.func $m_toString__java_lang_String@java.lang.Object) + (ref.func $m_get__java_lang_Object@jsenum.Main.SupplierConsumerImpl) + (ref.func $m_accept__java_lang_Object__void@jsenum.Main.SupplierConsumerImpl) + ) +) + +;;; Code for jsenum.Main.SupplierConsumerImpl [itable.init] + +(global $jsenum.Main.Supplier.vtable@$jsenum.Main.SupplierConsumerImpl (ref $jsenum.Main.Supplier.vtable) + (struct.new $jsenum.Main.Supplier.vtable + (ref.func $m_get__java_lang_Object@jsenum.Main.SupplierConsumerImpl) + ) +) +(global $jsenum.Main.Consumer.vtable@$jsenum.Main.SupplierConsumerImpl (ref $jsenum.Main.Consumer.vtable) + (struct.new $jsenum.Main.Consumer.vtable + (ref.func $m_accept__java_lang_Object__void@jsenum.Main.SupplierConsumerImpl) + ) +) +(global $jsenum.Main.SupplierConsumerImpl.itable (ref $jsenum.Main.SupplierConsumerImpl.itable) + (struct.new $jsenum.Main.SupplierConsumerImpl.itable + (global.get $jsenum.Main.Supplier.vtable@$jsenum.Main.SupplierConsumerImpl) + (global.get $jsenum.Main.Consumer.vtable@$jsenum.Main.SupplierConsumerImpl) + (ref.null struct) + (ref.null struct) + (ref.null struct) + (ref.null struct) + (ref.null struct) + ) +) + +;;; Code for jsenum.Main.ComparableJsEnumSupplierConsumerImpl [vtable.init] +(global $jsenum.Main.ComparableJsEnumSupplierConsumerImpl.vtable (ref $jsenum.Main.ComparableJsEnumSupplierConsumerImpl.vtable) + (struct.new $jsenum.Main.ComparableJsEnumSupplierConsumerImpl.vtable + (ref.func $$getClassImpl__java_lang_Class@jsenum.Main.ComparableJsEnumSupplierConsumerImpl) + (ref.func $m_equals__java_lang_Object__boolean@java.lang.Object) + (ref.func $m_getClass__java_lang_Class@java.lang.Object) + (ref.func $m_hashCode__int@java.lang.Object) + (ref.func $m_toString__java_lang_String@java.lang.Object) + (ref.func $m_get__java_lang_Object@jsenum.Main.SupplierConsumerImpl) + (ref.func $m_accept__java_lang_Object__void@jsenum.Main.SupplierConsumerImpl) + (ref.func $m_accept__jsenum_Main_ComparableJsEnum__void@jsenum.Main.ComparableJsEnumSupplierConsumerImpl) + (ref.func $m_get__jsenum_Main_ComparableJsEnum@jsenum.Main.ComparableJsEnumSupplierConsumerImpl) + ) +) + +;;; Code for jsenum.Main.ComparableJsEnumSupplierConsumerImpl [itable.init] + +(global $jsenum.Main.Supplier.vtable@$jsenum.Main.ComparableJsEnumSupplierConsumerImpl (ref $jsenum.Main.Supplier.vtable) + (struct.new $jsenum.Main.Supplier.vtable + (ref.func $m_get__java_lang_Object@jsenum.Main.SupplierConsumerImpl) + ) +) +(global $jsenum.Main.Consumer.vtable@$jsenum.Main.ComparableJsEnumSupplierConsumerImpl (ref $jsenum.Main.Consumer.vtable) + (struct.new $jsenum.Main.Consumer.vtable + (ref.func $m_accept__java_lang_Object__void@jsenum.Main.SupplierConsumerImpl) + ) +) +(global $jsenum.Main.ComparableJsEnumSupplierConsumer.vtable@$jsenum.Main.ComparableJsEnumSupplierConsumerImpl (ref $jsenum.Main.ComparableJsEnumSupplierConsumer.vtable) + (struct.new $jsenum.Main.ComparableJsEnumSupplierConsumer.vtable + (ref.func $m_accept__jsenum_Main_ComparableJsEnum__void@jsenum.Main.ComparableJsEnumSupplierConsumerImpl) + (ref.func $m_get__jsenum_Main_ComparableJsEnum@jsenum.Main.ComparableJsEnumSupplierConsumerImpl) + ) +) +(global $jsenum.Main.ComparableJsEnumSupplierConsumerImpl.itable (ref $jsenum.Main.ComparableJsEnumSupplierConsumerImpl.itable) + (struct.new $jsenum.Main.ComparableJsEnumSupplierConsumerImpl.itable + (global.get $jsenum.Main.Supplier.vtable@$jsenum.Main.ComparableJsEnumSupplierConsumerImpl) + (global.get $jsenum.Main.Consumer.vtable@$jsenum.Main.ComparableJsEnumSupplierConsumerImpl) + (global.get $jsenum.Main.ComparableJsEnumSupplierConsumer.vtable@$jsenum.Main.ComparableJsEnumSupplierConsumerImpl) + (ref.null struct) + (ref.null struct) + (ref.null struct) + (ref.null struct) + ) +) + +;;; Code for jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides [vtable.init] +(global $jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides.vtable (ref $jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides.vtable) + (struct.new $jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides.vtable + (ref.func $$getClassImpl__java_lang_Class@jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides) + (ref.func $m_equals__java_lang_Object__boolean@java.lang.Object) + (ref.func $m_getClass__java_lang_Class@java.lang.Object) + (ref.func $m_hashCode__int@java.lang.Object) + (ref.func $m_toString__java_lang_String@java.lang.Object) + (ref.func $m_get__java_lang_Object@jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides) + (ref.func $m_accept__java_lang_Object__void@jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides) + (ref.func $m_accept__jsenum_Main_ComparableJsEnum__void@jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides) + (ref.func $m_get__jsenum_Main_ComparableJsEnum@jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides) + ) +) + +;;; Code for jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides [itable.init] + +(global $jsenum.Main.Supplier.vtable@$jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides (ref $jsenum.Main.Supplier.vtable) + (struct.new $jsenum.Main.Supplier.vtable + (ref.func $m_get__java_lang_Object@jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides) + ) +) +(global $jsenum.Main.Consumer.vtable@$jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides (ref $jsenum.Main.Consumer.vtable) + (struct.new $jsenum.Main.Consumer.vtable + (ref.func $m_accept__java_lang_Object__void@jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides) + ) +) +(global $jsenum.Main.ComparableJsEnumSupplierConsumer.vtable@$jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides (ref $jsenum.Main.ComparableJsEnumSupplierConsumer.vtable) + (struct.new $jsenum.Main.ComparableJsEnumSupplierConsumer.vtable + (ref.func $m_accept__jsenum_Main_ComparableJsEnum__void@jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides) + (ref.func $m_get__jsenum_Main_ComparableJsEnum@jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides) + ) +) +(global $jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides.itable (ref $jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides.itable) + (struct.new $jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides.itable + (global.get $jsenum.Main.Supplier.vtable@$jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides) + (global.get $jsenum.Main.Consumer.vtable@$jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides) + (global.get $jsenum.Main.ComparableJsEnumSupplierConsumer.vtable@$jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides) + (ref.null struct) + (ref.null struct) + (ref.null struct) + (ref.null struct) + ) +) + +;;; Code for jsenum.Main.ComparableJsEnum.$Overlay [vtable.init] +(global $jsenum.Main.ComparableJsEnum.$Overlay.vtable (ref $jsenum.Main.ComparableJsEnum.$Overlay.vtable) + (struct.new $jsenum.Main.ComparableJsEnum.$Overlay.vtable + (ref.func $$getClassImpl__java_lang_Class@jsenum.Main.ComparableJsEnum.$Overlay) + ) +) + +;;; Code for jsenum.Main.IntJsEnum.$Overlay [vtable.init] +(global $jsenum.Main.IntJsEnum.$Overlay.vtable (ref $jsenum.Main.IntJsEnum.$Overlay.vtable) + (struct.new $jsenum.Main.IntJsEnum.$Overlay.vtable + (ref.func $$getClassImpl__java_lang_Class@jsenum.Main.IntJsEnum.$Overlay) + ) +) + +;;; Code for jsenum.Main.StringJsEnum.$Overlay [vtable.init] +(global $jsenum.Main.StringJsEnum.$Overlay.vtable (ref $jsenum.Main.StringJsEnum.$Overlay.vtable) + (struct.new $jsenum.Main.StringJsEnum.$Overlay.vtable + (ref.func $$getClassImpl__java_lang_Class@jsenum.Main.StringJsEnum.$Overlay) + ) +) + +;;; Code for jsenum.Main.NonNullableStringJsEnum.$Overlay [vtable.init] +(global $jsenum.Main.NonNullableStringJsEnum.$Overlay.vtable (ref $jsenum.Main.NonNullableStringJsEnum.$Overlay.vtable) + (struct.new $jsenum.Main.NonNullableStringJsEnum.$Overlay.vtable + (ref.func $$getClassImpl__java_lang_Class@jsenum.Main.NonNullableStringJsEnum.$Overlay) + ) +) + +;;; Code for jsenum.Main.JsEnumWithRenamedProperties.$Overlay [vtable.init] +(global $jsenum.Main.JsEnumWithRenamedProperties.$Overlay.vtable (ref $jsenum.Main.JsEnumWithRenamedProperties.$Overlay.vtable) + (struct.new $jsenum.Main.JsEnumWithRenamedProperties.$Overlay.vtable + (ref.func $$getClassImpl__java_lang_Class@jsenum.Main.JsEnumWithRenamedProperties.$Overlay) + ) +) + +;;; Code for jsenum.Main [static fields] +(global $f_$initialized__jsenum_Main (mut i32) + (i32.const 0) +) +(global $f_$class__jsenum_Main (mut (ref null $java.lang.Class)) + (ref.null $java.lang.Class) +) +(global $f_$string_|ONE|__jsenum_Main (mut (ref null $java.lang.String)) + (ref.null $java.lang.String) +) +(global $f_$string_|10|__jsenum_Main (mut (ref null $java.lang.String)) + (ref.null $java.lang.String) +) +(global $f_$string_|THREE|__jsenum_Main (mut (ref null $java.lang.String)) + (ref.null $java.lang.String) +) +(global $f_$string_|jsenum.Main|__jsenum_Main (mut (ref null $java.lang.String)) + (ref.null $java.lang.String) +) + +;;; Code for jsenum.Main.$LambdaImplementor$1 [static fields] +(global $f_$initialized__jsenum_Main_$LambdaImplementor$1 (mut i32) + (i32.const 0) +) +(global $f_$class__jsenum_Main_$LambdaImplementor$1 (mut (ref null $java.lang.Class)) + (ref.null $java.lang.Class) +) +(global $f_$string_|jsenum.Main_...|__jsenum_Main_$LambdaImplementor$1 (mut (ref null $java.lang.String)) + (ref.null $java.lang.String) +) + +;;; Code for jsenum.Main.$LambdaImplementor$2 [static fields] +(global $f_$initialized__jsenum_Main_$LambdaImplementor$2 (mut i32) + (i32.const 0) +) +(global $f_$class__jsenum_Main_$LambdaImplementor$2 (mut (ref null $java.lang.Class)) + (ref.null $java.lang.Class) +) +(global $f_$string_|jsenum.Main_...|__jsenum_Main_$LambdaImplementor$2 (mut (ref null $java.lang.String)) + (ref.null $java.lang.String) +) + +;;; Code for jsenum.Main.$LambdaImplementor$3 [static fields] +(global $f_$initialized__jsenum_Main_$LambdaImplementor$3 (mut i32) + (i32.const 0) +) +(global $f_$class__jsenum_Main_$LambdaImplementor$3 (mut (ref null $java.lang.Class)) + (ref.null $java.lang.Class) +) +(global $f_$string_|jsenum.Main_...|__jsenum_Main_$LambdaImplementor$3 (mut (ref null $java.lang.String)) + (ref.null $java.lang.String) +) + +;;; Code for jsenum.Main.$LambdaImplementor$4 [static fields] +(global $f_$initialized__jsenum_Main_$LambdaImplementor$4 (mut i32) + (i32.const 0) +) +(global $f_$class__jsenum_Main_$LambdaImplementor$4 (mut (ref null $java.lang.Class)) + (ref.null $java.lang.Class) +) +(global $f_$string_|jsenum.Main_...|__jsenum_Main_$LambdaImplementor$4 (mut (ref null $java.lang.String)) + (ref.null $java.lang.String) +) + +;;; Code for jsenum.Main.$LambdaImplementor$5 [static fields] +(global $f_$initialized__jsenum_Main_$LambdaImplementor$5 (mut i32) + (i32.const 0) +) +(global $f_$class__jsenum_Main_$LambdaImplementor$5 (mut (ref null $java.lang.Class)) + (ref.null $java.lang.Class) +) +(global $f_$string_|jsenum.Main_...|__jsenum_Main_$LambdaImplementor$5 (mut (ref null $java.lang.String)) + (ref.null $java.lang.String) +) + +;;; Code for jsenum.Main.Supplier [static fields] +(global $f_$initialized__jsenum_Main_Supplier (mut i32) + (i32.const 0) +) +(global $f_$class__jsenum_Main_Supplier (mut (ref null $java.lang.Class)) + (ref.null $java.lang.Class) +) +(global $f_$string_|jsenum.Main_...|__jsenum_Main_Supplier (mut (ref null $java.lang.String)) + (ref.null $java.lang.String) +) + +;;; Code for jsenum.Main.Consumer [static fields] +(global $f_$initialized__jsenum_Main_Consumer (mut i32) + (i32.const 0) +) +(global $f_$class__jsenum_Main_Consumer (mut (ref null $java.lang.Class)) + (ref.null $java.lang.Class) +) +(global $f_$string_|jsenum.Main_...|__jsenum_Main_Consumer (mut (ref null $java.lang.String)) + (ref.null $java.lang.String) +) + +;;; Code for jsenum.Main.NativeStringEnum [static fields] +(global $f_ONE__jsenum_Main_NativeStringEnum (mut (ref null $jsenum.Main.NativeStringEnum)) + (ref.null $jsenum.Main.NativeStringEnum) +) +(global $f_THREE__jsenum_Main_NativeStringEnum (mut (ref null $jsenum.Main.NativeStringEnum)) + (ref.null $jsenum.Main.NativeStringEnum) +) +(global $f_namesToValuesMap__jsenum_Main_NativeStringEnum_ (mut (ref null $java.lang.Object)) + (ref.null $java.lang.Object) +) +(global $f_$initialized__jsenum_Main_NativeStringEnum (mut i32) + (i32.const 0) +) +(global $f_$class__jsenum_Main_NativeStringEnum (mut (ref null $java.lang.Class)) + (ref.null $java.lang.Class) +) +(global $f_$string_|jsenum.Main_...|__jsenum_Main_NativeStringEnum (mut (ref null $java.lang.String)) + (ref.null $java.lang.String) +) + +;;; Code for jsenum.Main.JsFunctionSuppiler [static fields] +(global $f_$initialized__jsenum_Main_JsFunctionSuppiler (mut i32) + (i32.const 0) +) +(global $f_$class__jsenum_Main_JsFunctionSuppiler (mut (ref null $java.lang.Class)) + (ref.null $java.lang.Class) +) +(global $f_$string_|jsenum.Main_...|__jsenum_Main_JsFunctionSuppiler (mut (ref null $java.lang.String)) + (ref.null $java.lang.String) +) + +;;; Code for jsenum.Main.TemplatedField [static fields] +(global $f_$initialized__jsenum_Main_TemplatedField (mut i32) + (i32.const 0) +) +(global $f_$class__jsenum_Main_TemplatedField (mut (ref null $java.lang.Class)) + (ref.null $java.lang.Class) +) +(global $f_$string_|jsenum.Main_...|__jsenum_Main_TemplatedField (mut (ref null $java.lang.String)) + (ref.null $java.lang.String) +) + +;;; Code for jsenum.Main.Foo [static fields] +(global $f_$initialized__jsenum_Main_Foo (mut i32) + (i32.const 0) +) +(global $f_$class__jsenum_Main_Foo (mut (ref null $java.lang.Class)) + (ref.null $java.lang.Class) +) +(global $f_$string_|jsenum.Main_Foo|__jsenum_Main_Foo (mut (ref null $java.lang.String)) + (ref.null $java.lang.String) +) + +;;; Code for jsenum.Main.SupplierConsumerImpl [static fields] +(global $f_$initialized__jsenum_Main_SupplierConsumerImpl (mut i32) + (i32.const 0) +) +(global $f_$class__jsenum_Main_SupplierConsumerImpl (mut (ref null $java.lang.Class)) + (ref.null $java.lang.Class) +) +(global $f_$string_|jsenum.Main_...|__jsenum_Main_SupplierConsumerImpl (mut (ref null $java.lang.String)) + (ref.null $java.lang.String) +) + +;;; Code for jsenum.Main.ComparableJsEnumSupplierConsumer [static fields] +(global $f_$initialized__jsenum_Main_ComparableJsEnumSupplierConsumer (mut i32) + (i32.const 0) +) +(global $f_$class__jsenum_Main_ComparableJsEnumSupplierConsumer (mut (ref null $java.lang.Class)) + (ref.null $java.lang.Class) +) +(global $f_$string_|jsenum.Main_...|__jsenum_Main_ComparableJsEnumSupplierConsumer (mut (ref null $java.lang.String)) + (ref.null $java.lang.String) +) + +;;; Code for jsenum.Main.ComparableJsEnumSupplierConsumerImpl [static fields] +(global $f_$initialized__jsenum_Main_ComparableJsEnumSupplierConsumerImpl (mut i32) + (i32.const 0) +) +(global $f_$class__jsenum_Main_ComparableJsEnumSupplierConsumerImpl (mut (ref null $java.lang.Class)) + (ref.null $java.lang.Class) +) +(global $f_$string_|jsenum.Main_...|__jsenum_Main_ComparableJsEnumSupplierConsumerImpl (mut (ref null $java.lang.String)) + (ref.null $java.lang.String) +) + +;;; Code for jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides [static fields] +(global $f_$initialized__jsenum_Main_ComparableJsEnumSupplierConsumerImplWithOverrides (mut i32) + (i32.const 0) +) +(global $f_$class__jsenum_Main_ComparableJsEnumSupplierConsumerImplWithOverrides (mut (ref null $java.lang.Class)) + (ref.null $java.lang.Class) +) +(global $f_$string_|jsenum.Main_...|__jsenum_Main_ComparableJsEnumSupplierConsumerImplWithOverrides (mut (ref null $java.lang.String)) + (ref.null $java.lang.String) +) + +;;; Code for jsenum.Main.ComparableJsEnum.$Overlay [static fields] +(global $f_$initialized__jsenum_Main_ComparableJsEnum_$Overlay (mut i32) + (i32.const 0) +) +(global $f_$class__jsenum_Main_ComparableJsEnum_$Overlay (mut (ref null $java.lang.Class)) + (ref.null $java.lang.Class) +) +(global $f_$string_|jsenum.Main_...|__jsenum_Main_ComparableJsEnum_$Overlay (mut (ref null $java.lang.String)) + (ref.null $java.lang.String) +) + +;;; Code for jsenum.Main.IntJsEnum.$Overlay [static fields] +(global $f_$initialized__jsenum_Main_IntJsEnum_$Overlay (mut i32) + (i32.const 0) +) +(global $f_$class__jsenum_Main_IntJsEnum_$Overlay (mut (ref null $java.lang.Class)) + (ref.null $java.lang.Class) +) +(global $f_$string_|jsenum.Main_...|__jsenum_Main_IntJsEnum_$Overlay (mut (ref null $java.lang.String)) + (ref.null $java.lang.String) +) + +;;; Code for jsenum.Main.StringJsEnum.$Overlay [static fields] +(global $f_$initialized__jsenum_Main_StringJsEnum_$Overlay (mut i32) + (i32.const 0) +) +(global $f_$class__jsenum_Main_StringJsEnum_$Overlay (mut (ref null $java.lang.Class)) + (ref.null $java.lang.Class) +) +(global $f_$string_|jsenum.Main_...|__jsenum_Main_StringJsEnum_$Overlay (mut (ref null $java.lang.String)) + (ref.null $java.lang.String) +) + +;;; Code for jsenum.Main.NonNullableStringJsEnum.$Overlay [static fields] +(global $f_$initialized__jsenum_Main_NonNullableStringJsEnum_$Overlay (mut i32) + (i32.const 0) +) +(global $f_$class__jsenum_Main_NonNullableStringJsEnum_$Overlay (mut (ref null $java.lang.Class)) + (ref.null $java.lang.Class) +) +(global $f_$string_|jsenum.Main_...|__jsenum_Main_NonNullableStringJsEnum_$Overlay (mut (ref null $java.lang.String)) + (ref.null $java.lang.String) +) + +;;; Code for jsenum.Main.JsEnumWithRenamedProperties.$Overlay [static fields] +(global $f_$initialized__jsenum_Main_JsEnumWithRenamedProperties_$Overlay (mut i32) + (i32.const 0) +) +(global $f_$class__jsenum_Main_JsEnumWithRenamedProperties_$Overlay (mut (ref null $java.lang.Class)) + (ref.null $java.lang.Class) +) +(global $f_$string_|jsenum.Main_...|__jsenum_Main_JsEnumWithRenamedProperties_$Overlay (mut (ref null $java.lang.String)) + (ref.null $java.lang.String) +) + +;;; Code for jsenum.Main.Supplier [methods] + +;;; void Supplier.$clinit() +(func $$clinit__void@jsenum.Main.Supplier + ;;@ jsenum/Main.java:27:12 + (block + ;;@ jsenum/Main.java:27:12 + (if (global.get $f_$initialized__jsenum_Main_Supplier) + (then + ;;@ jsenum/Main.java:27:12 + (return ) + ) + ) + ;;@ jsenum/Main.java:27:12 + (global.set $f_$initialized__jsenum_Main_Supplier (i32.const 1)) + ) +) + +;;; Class Supplier.$getClassMetadata() +(func $$getClassMetadata__java_lang_Class@jsenum.Main.Supplier + (result (ref null $java.lang.Class)) + (block + (if (ref.is_null (global.get $f_$class__jsenum_Main_Supplier)) + (then + (global.set $f_$class__jsenum_Main_Supplier (call $m_createForInterface__java_lang_String__java_lang_Class@java.lang.Class (call $function.no.side.effects.$getString_|jsenum.Main_...|__java_lang_String (ref.func $$getString_|jsenum.Main_...|__java_lang_String@jsenum.Main.Supplier) ))) + ) + ) + (return (global.get $f_$class__jsenum_Main_Supplier)) + ) +) + +;;; String Supplier.$getString_|jsenum.Main_...|() +(func $$getString_|jsenum.Main_...|__java_lang_String@jsenum.Main.Supplier + (result (ref null $java.lang.String)) + (block + (if (ref.is_null (global.get $f_$string_|jsenum.Main_...|__jsenum_Main_Supplier)) + (then + (global.set $f_$string_|jsenum.Main_...|__jsenum_Main_Supplier (call $m_fromJsString__java_lang_String_NativeString__java_lang_String@java.lang.String (string.const "jsenum.Main$Supplier"))) + ) + ) + (return (global.get $f_$string_|jsenum.Main_...|__jsenum_Main_Supplier)) + ) +) + +;;; Code for jsenum.Main.Consumer [methods] + +;;; void Consumer.$clinit() +(func $$clinit__void@jsenum.Main.Consumer + ;;@ jsenum/Main.java:31:12 + (block + ;;@ jsenum/Main.java:31:12 + (if (global.get $f_$initialized__jsenum_Main_Consumer) + (then + ;;@ jsenum/Main.java:31:12 + (return ) + ) + ) + ;;@ jsenum/Main.java:31:12 + (global.set $f_$initialized__jsenum_Main_Consumer (i32.const 1)) + ) +) + +;;; Class Consumer.$getClassMetadata() +(func $$getClassMetadata__java_lang_Class@jsenum.Main.Consumer + (result (ref null $java.lang.Class)) + (block + (if (ref.is_null (global.get $f_$class__jsenum_Main_Consumer)) + (then + (global.set $f_$class__jsenum_Main_Consumer (call $m_createForInterface__java_lang_String__java_lang_Class@java.lang.Class (call $function.no.side.effects.$getString_|jsenum.Main_...|__java_lang_String (ref.func $$getString_|jsenum.Main_...|__java_lang_String@jsenum.Main.Consumer) ))) + ) + ) + (return (global.get $f_$class__jsenum_Main_Consumer)) + ) +) + +;;; String Consumer.$getString_|jsenum.Main_...|() +(func $$getString_|jsenum.Main_...|__java_lang_String@jsenum.Main.Consumer + (result (ref null $java.lang.String)) + (block + (if (ref.is_null (global.get $f_$string_|jsenum.Main_...|__jsenum_Main_Consumer)) + (then + (global.set $f_$string_|jsenum.Main_...|__jsenum_Main_Consumer (call $m_fromJsString__java_lang_String_NativeString__java_lang_String@java.lang.String (string.const "jsenum.Main$Consumer"))) + ) + ) + (return (global.get $f_$string_|jsenum.Main_...|__jsenum_Main_Consumer)) + ) +) + +;;; Code for jsenum.Main.JsFunctionSuppiler [methods] + +;;; void JsFunctionSuppiler.$clinit() +(func $$clinit__void@jsenum.Main.JsFunctionSuppiler + ;;@ jsenum/Main.java:176:12 + (block + ;;@ jsenum/Main.java:176:12 + (if (global.get $f_$initialized__jsenum_Main_JsFunctionSuppiler) + (then + ;;@ jsenum/Main.java:176:12 + (return ) + ) + ) + ;;@ jsenum/Main.java:176:12 + (global.set $f_$initialized__jsenum_Main_JsFunctionSuppiler (i32.const 1)) + ) +) + +;;; Class JsFunctionSuppiler.$getClassMetadata() +(func $$getClassMetadata__java_lang_Class@jsenum.Main.JsFunctionSuppiler + (result (ref null $java.lang.Class)) + (block + (if (ref.is_null (global.get $f_$class__jsenum_Main_JsFunctionSuppiler)) + (then + (global.set $f_$class__jsenum_Main_JsFunctionSuppiler (call $m_createForInterface__java_lang_String__java_lang_Class@java.lang.Class (call $function.no.side.effects.$getString_|jsenum.Main_...|__java_lang_String (ref.func $$getString_|jsenum.Main_...|__java_lang_String@jsenum.Main.JsFunctionSuppiler) ))) + ) + ) + (return (global.get $f_$class__jsenum_Main_JsFunctionSuppiler)) + ) +) + +;;; String JsFunctionSuppiler.$getString_|jsenum.Main_...|() +(func $$getString_|jsenum.Main_...|__java_lang_String@jsenum.Main.JsFunctionSuppiler + (result (ref null $java.lang.String)) + (block + (if (ref.is_null (global.get $f_$string_|jsenum.Main_...|__jsenum_Main_JsFunctionSuppiler)) + (then + (global.set $f_$string_|jsenum.Main_...|__jsenum_Main_JsFunctionSuppiler (call $m_fromJsString__java_lang_String_NativeString__java_lang_String@java.lang.String (string.const "jsenum.Main$JsFunctionSuppiler"))) + ) + ) + (return (global.get $f_$string_|jsenum.Main_...|__jsenum_Main_JsFunctionSuppiler)) + ) +) + +;;; Code for jsenum.Main.ComparableJsEnumSupplierConsumer [methods] + +;;; void ComparableJsEnumSupplierConsumer.$clinit() +(func $$clinit__void@jsenum.Main.ComparableJsEnumSupplierConsumer + ;;@ jsenum/Main.java:259:12 + (block + ;;@ jsenum/Main.java:259:12 + (if (global.get $f_$initialized__jsenum_Main_ComparableJsEnumSupplierConsumer) + (then + ;;@ jsenum/Main.java:259:12 + (return ) + ) + ) + ;;@ jsenum/Main.java:259:12 + (global.set $f_$initialized__jsenum_Main_ComparableJsEnumSupplierConsumer (i32.const 1)) + ) +) + +;;; Class ComparableJsEnumSupplierConsumer.$getClassMetadata() +(func $$getClassMetadata__java_lang_Class@jsenum.Main.ComparableJsEnumSupplierConsumer + (result (ref null $java.lang.Class)) + (block + (if (ref.is_null (global.get $f_$class__jsenum_Main_ComparableJsEnumSupplierConsumer)) + (then + (global.set $f_$class__jsenum_Main_ComparableJsEnumSupplierConsumer (call $m_createForInterface__java_lang_String__java_lang_Class@java.lang.Class (call $function.no.side.effects.$getString_|jsenum.Main_...|__java_lang_String (ref.func $$getString_|jsenum.Main_...|__java_lang_String@jsenum.Main.ComparableJsEnumSupplierConsumer) ))) + ) + ) + (return (global.get $f_$class__jsenum_Main_ComparableJsEnumSupplierConsumer)) + ) +) + +;;; String ComparableJsEnumSupplierConsumer.$getString_|jsenum.Main_...|() +(func $$getString_|jsenum.Main_...|__java_lang_String@jsenum.Main.ComparableJsEnumSupplierConsumer + (result (ref null $java.lang.String)) + (block + (if (ref.is_null (global.get $f_$string_|jsenum.Main_...|__jsenum_Main_ComparableJsEnumSupplierConsumer)) + (then + (global.set $f_$string_|jsenum.Main_...|__jsenum_Main_ComparableJsEnumSupplierConsumer (call $m_fromJsString__java_lang_String_NativeString__java_lang_String@java.lang.String (string.const "jsenum.Main$ComparableJsEnumSupplierConsumer"))) + ) + ) + (return (global.get $f_$string_|jsenum.Main_...|__jsenum_Main_ComparableJsEnumSupplierConsumer)) + ) +) + +;;; Code for jsenum.Main.ComparableJsEnum.$Overlay [methods] + +;;; int $Overlay.getValue__$devirt(ComparableJsEnum $thisArg) +(func $m_getValue__$devirt__jsenum_Main_ComparableJsEnum__int@jsenum.Main.ComparableJsEnum.$Overlay + (param $$thisArg i32) + (result i32) + ;;@ jsenum/Main.java:41:15 + (block + ;;@ jsenum/Main.java:41:15 + (call $$clinit__void@jsenum.Main.ComparableJsEnum.$Overlay ) + ;;@ jsenum/Main.java:42:6 + (return (local.get $$thisArg)) + ) +) + +;;; void $Overlay.$clinit() +(func $$clinit__void@jsenum.Main.ComparableJsEnum.$Overlay + ;;@ jsenum/Main.java:36:7 + (block + ;;@ jsenum/Main.java:36:7 + (if (global.get $f_$initialized__jsenum_Main_ComparableJsEnum_$Overlay) + (then + ;;@ jsenum/Main.java:36:7 + (return ) + ) + ) + ;;@ jsenum/Main.java:36:7 + (global.set $f_$initialized__jsenum_Main_ComparableJsEnum_$Overlay (i32.const 1)) + ) +) + +;;; Class $Overlay.$getClassMetadata() +(func $$getClassMetadata__java_lang_Class@jsenum.Main.ComparableJsEnum.$Overlay + (result (ref null $java.lang.Class)) + (block + (if (ref.is_null (global.get $f_$class__jsenum_Main_ComparableJsEnum_$Overlay)) + (then + (global.set $f_$class__jsenum_Main_ComparableJsEnum_$Overlay (call $m_createForEnum__java_lang_String__java_lang_Class@java.lang.Class (call $function.no.side.effects.$getString_|jsenum.Main_...|__java_lang_String (ref.func $$getString_|jsenum.Main_...|__java_lang_String@jsenum.Main.ComparableJsEnum.$Overlay) ))) + ) + ) + (return (global.get $f_$class__jsenum_Main_ComparableJsEnum_$Overlay)) + ) +) + +;;; Class $Overlay.$getClassImpl() +(func $$getClassImpl__java_lang_Class@jsenum.Main.ComparableJsEnum.$Overlay + (type $function.$getClassImpl__java_lang_Class) + (param $this.untyped (ref $java.lang.Object)) + (result (ref null $java.lang.Class)) + (local $this (ref null $jsenum.Main.ComparableJsEnum.$Overlay)) + (local.set $this (ref.cast (ref $jsenum.Main.ComparableJsEnum.$Overlay) (local.get $this.untyped))) + (block + (return (call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.ComparableJsEnum.$Overlay) )) + ) +) +(elem declare func $$getClassImpl__java_lang_Class@jsenum.Main.ComparableJsEnum.$Overlay) + +;;; String $Overlay.$getString_|jsenum.Main_...|() +(func $$getString_|jsenum.Main_...|__java_lang_String@jsenum.Main.ComparableJsEnum.$Overlay + (result (ref null $java.lang.String)) + (block + (if (ref.is_null (global.get $f_$string_|jsenum.Main_...|__jsenum_Main_ComparableJsEnum_$Overlay)) + (then + (global.set $f_$string_|jsenum.Main_...|__jsenum_Main_ComparableJsEnum_$Overlay (call $m_fromJsString__java_lang_String_NativeString__java_lang_String@java.lang.String (string.const "jsenum.Main$ComparableJsEnum$$Overlay"))) + ) + ) + (return (global.get $f_$string_|jsenum.Main_...|__jsenum_Main_ComparableJsEnum_$Overlay)) + ) +) + +;;; Code for jsenum.Main.IntJsEnum.$Overlay [methods] + +;;; int $Overlay.getValue__$devirt(IntJsEnum $thisArg) +(func $m_getValue__$devirt__jsenum_Main_IntJsEnum__int@jsenum.Main.IntJsEnum.$Overlay + (param $$thisArg i32) + (result i32) + ;;@ jsenum/Main.java:54:15 + (block + ;;@ jsenum/Main.java:54:15 + (call $$clinit__void@jsenum.Main.IntJsEnum.$Overlay ) + ;;@ jsenum/Main.java:55:6 + (return (local.get $$thisArg)) + ) +) + +;;; void $Overlay.$clinit() +(func $$clinit__void@jsenum.Main.IntJsEnum.$Overlay + ;;@ jsenum/Main.java:47:7 + (block + ;;@ jsenum/Main.java:47:7 + (if (global.get $f_$initialized__jsenum_Main_IntJsEnum_$Overlay) + (then + ;;@ jsenum/Main.java:47:7 + (return ) + ) + ) + ;;@ jsenum/Main.java:47:7 + (global.set $f_$initialized__jsenum_Main_IntJsEnum_$Overlay (i32.const 1)) + ) +) + +;;; Class $Overlay.$getClassMetadata() +(func $$getClassMetadata__java_lang_Class@jsenum.Main.IntJsEnum.$Overlay + (result (ref null $java.lang.Class)) + (block + (if (ref.is_null (global.get $f_$class__jsenum_Main_IntJsEnum_$Overlay)) + (then + (global.set $f_$class__jsenum_Main_IntJsEnum_$Overlay (call $m_createForEnum__java_lang_String__java_lang_Class@java.lang.Class (call $function.no.side.effects.$getString_|jsenum.Main_...|__java_lang_String (ref.func $$getString_|jsenum.Main_...|__java_lang_String@jsenum.Main.IntJsEnum.$Overlay) ))) + ) + ) + (return (global.get $f_$class__jsenum_Main_IntJsEnum_$Overlay)) + ) +) + +;;; Class $Overlay.$getClassImpl() +(func $$getClassImpl__java_lang_Class@jsenum.Main.IntJsEnum.$Overlay + (type $function.$getClassImpl__java_lang_Class) + (param $this.untyped (ref $java.lang.Object)) + (result (ref null $java.lang.Class)) + (local $this (ref null $jsenum.Main.IntJsEnum.$Overlay)) + (local.set $this (ref.cast (ref $jsenum.Main.IntJsEnum.$Overlay) (local.get $this.untyped))) + (block + (return (call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.IntJsEnum.$Overlay) )) + ) +) +(elem declare func $$getClassImpl__java_lang_Class@jsenum.Main.IntJsEnum.$Overlay) + +;;; String $Overlay.$getString_|jsenum.Main_...|() +(func $$getString_|jsenum.Main_...|__java_lang_String@jsenum.Main.IntJsEnum.$Overlay + (result (ref null $java.lang.String)) + (block + (if (ref.is_null (global.get $f_$string_|jsenum.Main_...|__jsenum_Main_IntJsEnum_$Overlay)) + (then + (global.set $f_$string_|jsenum.Main_...|__jsenum_Main_IntJsEnum_$Overlay (call $m_fromJsString__java_lang_String_NativeString__java_lang_String@java.lang.String (string.const "jsenum.Main$IntJsEnum$$Overlay"))) + ) + ) + (return (global.get $f_$string_|jsenum.Main_...|__jsenum_Main_IntJsEnum_$Overlay)) + ) +) + +;;; Code for jsenum.Main.StringJsEnum.$Overlay [methods] + +;;; String $Overlay.getValue__$devirt(StringJsEnum $thisArg) +(func $m_getValue__$devirt__jsenum_Main_StringJsEnum__java_lang_String@jsenum.Main.StringJsEnum.$Overlay + (param $$thisArg (ref null $java.lang.String)) + (result (ref null $java.lang.String)) + ;;@ jsenum/Main.java:70:18 + (block + ;;@ jsenum/Main.java:70:18 + (call $$clinit__void@jsenum.Main.StringJsEnum.$Overlay ) + ;;@ jsenum/Main.java:71:6 + (return (ref.cast (ref null $java.lang.String) (local.get $$thisArg))) + ) +) + +;;; void $Overlay.$clinit() +(func $$clinit__void@jsenum.Main.StringJsEnum.$Overlay + ;;@ jsenum/Main.java:64:7 + (block + ;;@ jsenum/Main.java:64:7 + (if (global.get $f_$initialized__jsenum_Main_StringJsEnum_$Overlay) + (then + ;;@ jsenum/Main.java:64:7 + (return ) + ) + ) + ;;@ jsenum/Main.java:64:7 + (global.set $f_$initialized__jsenum_Main_StringJsEnum_$Overlay (i32.const 1)) + ) +) + +;;; Class $Overlay.$getClassMetadata() +(func $$getClassMetadata__java_lang_Class@jsenum.Main.StringJsEnum.$Overlay + (result (ref null $java.lang.Class)) + (block + (if (ref.is_null (global.get $f_$class__jsenum_Main_StringJsEnum_$Overlay)) + (then + (global.set $f_$class__jsenum_Main_StringJsEnum_$Overlay (call $m_createForEnum__java_lang_String__java_lang_Class@java.lang.Class (call $function.no.side.effects.$getString_|jsenum.Main_...|__java_lang_String (ref.func $$getString_|jsenum.Main_...|__java_lang_String@jsenum.Main.StringJsEnum.$Overlay) ))) + ) + ) + (return (global.get $f_$class__jsenum_Main_StringJsEnum_$Overlay)) + ) +) + +;;; Class $Overlay.$getClassImpl() +(func $$getClassImpl__java_lang_Class@jsenum.Main.StringJsEnum.$Overlay + (type $function.$getClassImpl__java_lang_Class) + (param $this.untyped (ref $java.lang.Object)) + (result (ref null $java.lang.Class)) + (local $this (ref null $jsenum.Main.StringJsEnum.$Overlay)) + (local.set $this (ref.cast (ref $jsenum.Main.StringJsEnum.$Overlay) (local.get $this.untyped))) + (block + (return (call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.StringJsEnum.$Overlay) )) + ) +) +(elem declare func $$getClassImpl__java_lang_Class@jsenum.Main.StringJsEnum.$Overlay) + +;;; String $Overlay.$getString_|jsenum.Main_...|() +(func $$getString_|jsenum.Main_...|__java_lang_String@jsenum.Main.StringJsEnum.$Overlay + (result (ref null $java.lang.String)) + (block + (if (ref.is_null (global.get $f_$string_|jsenum.Main_...|__jsenum_Main_StringJsEnum_$Overlay)) + (then + (global.set $f_$string_|jsenum.Main_...|__jsenum_Main_StringJsEnum_$Overlay (call $m_fromJsString__java_lang_String_NativeString__java_lang_String@java.lang.String (string.const "jsenum.Main$StringJsEnum$$Overlay"))) + ) + ) + (return (global.get $f_$string_|jsenum.Main_...|__jsenum_Main_StringJsEnum_$Overlay)) + ) +) + +;;; Code for jsenum.Main.NonNullableStringJsEnum.$Overlay [methods] + +;;; String $Overlay.getValue__$devirt(NonNullableStringJsEnum $thisArg) +(func $m_getValue__$devirt__jsenum_Main_NonNullableStringJsEnum__java_lang_String@jsenum.Main.NonNullableStringJsEnum.$Overlay + (param $$thisArg (ref null $java.lang.String)) + (result (ref null $java.lang.String)) + ;;@ jsenum/Main.java:86:18 + (block + ;;@ jsenum/Main.java:86:18 + (call $$clinit__void@jsenum.Main.NonNullableStringJsEnum.$Overlay ) + ;;@ jsenum/Main.java:87:6 + (return (ref.cast (ref null $java.lang.String) (local.get $$thisArg))) + ) +) + +;;; void $Overlay.$clinit() +(func $$clinit__void@jsenum.Main.NonNullableStringJsEnum.$Overlay + ;;@ jsenum/Main.java:80:7 + (block + ;;@ jsenum/Main.java:80:7 + (if (global.get $f_$initialized__jsenum_Main_NonNullableStringJsEnum_$Overlay) + (then + ;;@ jsenum/Main.java:80:7 + (return ) + ) + ) + ;;@ jsenum/Main.java:80:7 + (global.set $f_$initialized__jsenum_Main_NonNullableStringJsEnum_$Overlay (i32.const 1)) + ) +) + +;;; Class $Overlay.$getClassMetadata() +(func $$getClassMetadata__java_lang_Class@jsenum.Main.NonNullableStringJsEnum.$Overlay + (result (ref null $java.lang.Class)) + (block + (if (ref.is_null (global.get $f_$class__jsenum_Main_NonNullableStringJsEnum_$Overlay)) + (then + (global.set $f_$class__jsenum_Main_NonNullableStringJsEnum_$Overlay (call $m_createForEnum__java_lang_String__java_lang_Class@java.lang.Class (call $function.no.side.effects.$getString_|jsenum.Main_...|__java_lang_String (ref.func $$getString_|jsenum.Main_...|__java_lang_String@jsenum.Main.NonNullableStringJsEnum.$Overlay) ))) + ) + ) + (return (global.get $f_$class__jsenum_Main_NonNullableStringJsEnum_$Overlay)) + ) +) + +;;; Class $Overlay.$getClassImpl() +(func $$getClassImpl__java_lang_Class@jsenum.Main.NonNullableStringJsEnum.$Overlay + (type $function.$getClassImpl__java_lang_Class) + (param $this.untyped (ref $java.lang.Object)) + (result (ref null $java.lang.Class)) + (local $this (ref null $jsenum.Main.NonNullableStringJsEnum.$Overlay)) + (local.set $this (ref.cast (ref $jsenum.Main.NonNullableStringJsEnum.$Overlay) (local.get $this.untyped))) + (block + (return (call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.NonNullableStringJsEnum.$Overlay) )) + ) +) +(elem declare func $$getClassImpl__java_lang_Class@jsenum.Main.NonNullableStringJsEnum.$Overlay) + +;;; String $Overlay.$getString_|jsenum.Main_...|() +(func $$getString_|jsenum.Main_...|__java_lang_String@jsenum.Main.NonNullableStringJsEnum.$Overlay + (result (ref null $java.lang.String)) + (block + (if (ref.is_null (global.get $f_$string_|jsenum.Main_...|__jsenum_Main_NonNullableStringJsEnum_$Overlay)) + (then + (global.set $f_$string_|jsenum.Main_...|__jsenum_Main_NonNullableStringJsEnum_$Overlay (call $m_fromJsString__java_lang_String_NativeString__java_lang_String@java.lang.String (string.const "jsenum.Main$NonNullableStringJsEnum$$Overlay"))) + ) + ) + (return (global.get $f_$string_|jsenum.Main_...|__jsenum_Main_NonNullableStringJsEnum_$Overlay)) + ) +) + +;;; Code for jsenum.Main.JsEnumWithRenamedProperties.$Overlay [methods] + +;;; int $Overlay.getValue__$devirt(JsEnumWithRenamedProperties $thisArg) +(func $m_getValue__$devirt__jsenum_Main_JsEnumWithRenamedProperties__int@jsenum.Main.JsEnumWithRenamedProperties.$Overlay + (param $$thisArg i32) + (result i32) + ;;@ jsenum/Main.java:243:15 + (block + ;;@ jsenum/Main.java:243:15 + (call $$clinit__void@jsenum.Main.JsEnumWithRenamedProperties.$Overlay ) + ;;@ jsenum/Main.java:244:6 + (return (local.get $$thisArg)) + ) +) + +;;; void $Overlay.$clinit() +(func $$clinit__void@jsenum.Main.JsEnumWithRenamedProperties.$Overlay + ;;@ jsenum/Main.java:237:7 + (block + ;;@ jsenum/Main.java:237:7 + (if (global.get $f_$initialized__jsenum_Main_JsEnumWithRenamedProperties_$Overlay) + (then + ;;@ jsenum/Main.java:237:7 + (return ) + ) + ) + ;;@ jsenum/Main.java:237:7 + (global.set $f_$initialized__jsenum_Main_JsEnumWithRenamedProperties_$Overlay (i32.const 1)) + ) +) + +;;; Class $Overlay.$getClassMetadata() +(func $$getClassMetadata__java_lang_Class@jsenum.Main.JsEnumWithRenamedProperties.$Overlay + (result (ref null $java.lang.Class)) + (block + (if (ref.is_null (global.get $f_$class__jsenum_Main_JsEnumWithRenamedProperties_$Overlay)) + (then + (global.set $f_$class__jsenum_Main_JsEnumWithRenamedProperties_$Overlay (call $m_createForEnum__java_lang_String__java_lang_Class@java.lang.Class (call $function.no.side.effects.$getString_|jsenum.Main_...|__java_lang_String (ref.func $$getString_|jsenum.Main_...|__java_lang_String@jsenum.Main.JsEnumWithRenamedProperties.$Overlay) ))) + ) + ) + (return (global.get $f_$class__jsenum_Main_JsEnumWithRenamedProperties_$Overlay)) + ) +) + +;;; Class $Overlay.$getClassImpl() +(func $$getClassImpl__java_lang_Class@jsenum.Main.JsEnumWithRenamedProperties.$Overlay + (type $function.$getClassImpl__java_lang_Class) + (param $this.untyped (ref $java.lang.Object)) + (result (ref null $java.lang.Class)) + (local $this (ref null $jsenum.Main.JsEnumWithRenamedProperties.$Overlay)) + (local.set $this (ref.cast (ref $jsenum.Main.JsEnumWithRenamedProperties.$Overlay) (local.get $this.untyped))) + (block + (return (call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.JsEnumWithRenamedProperties.$Overlay) )) + ) +) +(elem declare func $$getClassImpl__java_lang_Class@jsenum.Main.JsEnumWithRenamedProperties.$Overlay) + +;;; String $Overlay.$getString_|jsenum.Main_...|() +(func $$getString_|jsenum.Main_...|__java_lang_String@jsenum.Main.JsEnumWithRenamedProperties.$Overlay + (result (ref null $java.lang.String)) + (block + (if (ref.is_null (global.get $f_$string_|jsenum.Main_...|__jsenum_Main_JsEnumWithRenamedProperties_$Overlay)) + (then + (global.set $f_$string_|jsenum.Main_...|__jsenum_Main_JsEnumWithRenamedProperties_$Overlay (call $m_fromJsString__java_lang_String_NativeString__java_lang_String@java.lang.String (string.const "jsenum.Main$JsEnumWithRenamedProperties$$Overlay"))) + ) + ) + (return (global.get $f_$string_|jsenum.Main_...|__jsenum_Main_JsEnumWithRenamedProperties_$Overlay)) + ) +) + +;;; Code for jsenum.Main [methods] + +;;; Main Main.$create() +(func $$create__@jsenum.Main + (result (ref null $jsenum.Main)) + ;;@ jsenum/Main.java:26:13 + (local $$instance (ref null $jsenum.Main)) + (block + ;;@ jsenum/Main.java:26:13 + (call $$clinit__void@jsenum.Main ) + ;;@ jsenum/Main.java:26:13 + (local.set $$instance (struct.new $jsenum.Main (ref.as_non_null (global.get $jsenum.Main.vtable)) (ref.as_non_null (global.get $itable.empty)) (i32.const 0))) + ;;@ jsenum/Main.java:26:13 + (call $$ctor__void_$p_jsenum_Main@jsenum.Main (ref.as_non_null (local.get $$instance))) + ;;@ jsenum/Main.java:26:13 + (return (local.get $$instance)) + ) +) + +;;; void Main.$ctor() +(func $$ctor__void_$p_jsenum_Main@jsenum.Main + (param $this (ref null $jsenum.Main)) + ;;@ jsenum/Main.java:26:13 + (block + ;;@ jsenum/Main.java:26:13 + (call $$ctor__void_$p_java_lang_Object@java.lang.Object (ref.as_non_null (local.get $this))) + ) +) + +;;; void Main.testJsEnumSwitch() +(func $m_testJsEnumSwitch__void@jsenum.Main + ;;@ jsenum/Main.java:101:21 + (local $comparableJsEnum i32) + (local $$expression i32) + (local $comparable (ref null $java.lang.Object)) + (local $intJsEnum i32) + (local $$expression_1 i32) + (local $o (ref null $java.lang.Object)) + (local $equal i32) + (local $isInstance i32) + (local $$expression_2 (ref null $javaemul.internal.Enums.BoxedIntegerEnum)) + (local $stringJsEnum (ref null $java.lang.String)) + (local $$expression_3 (ref null $java.lang.String)) + (local $$qualifier (ref null $jsenum.Main.NativeStringEnum)) + (local $$qualifier_1 (ref null $jsenum.Main.NativeStringEnum)) + (local $supplier (ref null $java.lang.Object)) + (local $consummer (ref null $java.lang.Object)) + (block + ;;@ jsenum/Main.java:101:40 + (call $$clinit__void@jsenum.Main ) + ;;@ jsenum/Main.java:102:4 + (local.set $comparableJsEnum (if (result i32) (i32.eq (call $m_getValue__$devirt__jsenum_Main_ComparableJsEnum__int@jsenum.Main.ComparableJsEnum.$Overlay (i32.const 1)) (i32.const 1)) (then (i32.const 2)) (else (call $m_unboxInteger__java_lang_Object__java_lang_Class__int@javaemul.internal.Enums (ref.null $java.lang.Object)(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.ComparableJsEnum.$Overlay) ))))) + ;;@ jsenum/Main.java:104:4 + (block $SWITCH.BREAK + (block + ;;@ jsenum/Main.java:104:4 + (local.set $$expression (block (result i32) + (call $m_checkNotNull__boolean__void@javaemul.internal.InternalPreconditions (i32.eqz (call $m_isNull__int__boolean@javaemul.internal.Enums (local.get $comparableJsEnum)))) + (local.get $comparableJsEnum) + )) + ;;@ jsenum/Main.java:104:4 + (block + (block + (block ;; evaluate expression and jump + (br_table 0 1 (i32.sub (local.get $$expression) (i32.const 2))) + ) + ;; case 2: + ;;@ jsenum/Main.java:106:8 + (br $SWITCH.BREAK) + ) + ;; default: + ) + ) + ) + ;;@ jsenum/Main.java:110:4 + (local.set $comparable (call $m_boxComparableInteger__int__java_lang_Class__javaemul_internal_Enums_BoxedComparableIntegerEnum@javaemul.internal.Enums (local.get $comparableJsEnum)(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.ComparableJsEnum.$Overlay) ))) + ;;@ jsenum/Main.java:111:4 + (local.set $comparableJsEnum (call $m_unboxInteger__java_lang_Object__java_lang_Class__int@javaemul.internal.Enums (local.get $comparable)(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.ComparableJsEnum.$Overlay) ))) + ;;@ jsenum/Main.java:113:4 + (local.set $intJsEnum (if (result i32) (i32.eq (call $m_getValue__$devirt__jsenum_Main_IntJsEnum__int@jsenum.Main.IntJsEnum.$Overlay (i32.const 11)) (i32.const 10)) (then (i32.const 11)) (else (call $m_unboxInteger__java_lang_Object__java_lang_Class__int@javaemul.internal.Enums (ref.null $java.lang.Object)(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.IntJsEnum.$Overlay) ))))) + ;;@ jsenum/Main.java:114:4 + (block $SWITCH_1.BREAK + (block + ;;@ jsenum/Main.java:114:4 + (local.set $$expression_1 (block (result i32) + (call $m_checkNotNull__boolean__void@javaemul.internal.InternalPreconditions (i32.eqz (call $m_isNull__int__boolean@javaemul.internal.Enums (local.get $intJsEnum)))) + (local.get $intJsEnum) + )) + ;;@ jsenum/Main.java:114:4 + (block + (block + (block ;; evaluate expression and jump + (br_table 0 1 (i32.sub (local.get $$expression_1) (i32.const 20))) + ) + ;; case 20: + ;;@ jsenum/Main.java:116:8 + (br $SWITCH_1.BREAK) + ) + ;; default: + ) + ) + ) + ;;@ jsenum/Main.java:120:4 + (local.set $o (call $m_boxInteger__int__java_lang_Class__javaemul_internal_Enums_BoxedIntegerEnum@javaemul.internal.Enums (local.get $intJsEnum)(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.IntJsEnum.$Overlay) ))) + ;;@ jsenum/Main.java:121:4 + (local.set $intJsEnum (call $m_unboxInteger__java_lang_Object__java_lang_Class__int@javaemul.internal.Enums (local.get $o)(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.IntJsEnum.$Overlay) ))) + ;;@ jsenum/Main.java:124:4 + (local.set $equal (i32.eq (local.get $intJsEnum) (i32.const 20))) + ;;@ jsenum/Main.java:125:4 + (local.set $isInstance (i32.eqz (ref.is_null (call $m_boxInteger__int__java_lang_Class__javaemul_internal_Enums_BoxedIntegerEnum@javaemul.internal.Enums (local.get $intJsEnum)(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.IntJsEnum.$Overlay) ))))) + ;;@ jsenum/Main.java:127:4 + (local.set $isInstance (block (result i32) + (local.set $$expression_2 (call $m_boxInteger__int__java_lang_Class__javaemul_internal_Enums_BoxedIntegerEnum@javaemul.internal.Enums (local.get $intJsEnum)(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.IntJsEnum.$Overlay) ))) + (if (result i32) (ref.is_null (local.get $$expression_2)) + (then (i32.const 0)) + (else + (ref.test (ref $java.lang.Comparable.vtable) (struct.get $itable $slot1 (struct.get $java.lang.Object $itable (local.get $$expression_2) ))) + ) + ) + )) + ;;@ jsenum/Main.java:129:4 + (local.set $stringJsEnum (if (result (ref null $java.lang.String)) (ref.eq (call $m_getValue__$devirt__jsenum_Main_StringJsEnum__java_lang_String@jsenum.Main.StringJsEnum.$Overlay (call $function.no.side.effects.$getString_|ONE|__java_lang_String (ref.func $$getString_|ONE|__java_lang_String@jsenum.Main) )) (call $function.no.side.effects.$getString_|10|__java_lang_String (ref.func $$getString_|10|__java_lang_String@jsenum.Main) )) (then (call $function.no.side.effects.$getString_|THREE|__java_lang_String (ref.func $$getString_|THREE|__java_lang_String@jsenum.Main) )) (else (call $m_unboxString__java_lang_Object__java_lang_Class__java_lang_String@javaemul.internal.Enums (ref.null $java.lang.Object)(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.StringJsEnum.$Overlay) ))))) + ;;@ jsenum/Main.java:130:4 + (block $SWITCH_2.BREAK + (block + ;;@ jsenum/Main.java:130:4 + (local.set $$expression_3 (block (result (ref null $java.lang.String)) + (call $m_checkNotNull__boolean__void@javaemul.internal.InternalPreconditions (i32.eqz (ref.is_null (local.get $stringJsEnum)))) + (local.get $stringJsEnum) + )) + ;;@ jsenum/Main.java:130:4 + (block + (block + (block ;; evaluate expression and jump + (br_if 0 (call_ref $function.m_equals__java_lang_Object__boolean (ref.as_non_null (call $function.no.side.effects.$getString_|ONE|__java_lang_String (ref.func $$getString_|ONE|__java_lang_String@jsenum.Main) ))(local.get $$expression_3)(struct.get $java.lang.String.vtable $m_equals__java_lang_Object__boolean (struct.get $java.lang.String $vtable(call $function.no.side.effects.$getString_|ONE|__java_lang_String (ref.func $$getString_|ONE|__java_lang_String@jsenum.Main) ))))) + (br 1) + ) + ;; case jsenum.Main.$getString_|ONE|(): + ;;@ jsenum/Main.java:132:8 + (br $SWITCH_2.BREAK) + ) + ;; default: + ) + ) + ) + (block + ;;@ jsenum/Main.java:136:4 + (local.set $$qualifier (block (result (ref null $jsenum.Main.NativeStringEnum)) + (call $$clinit__void@jsenum.Main.NativeStringEnum ) + (global.get $f_ONE__jsenum_Main_NativeStringEnum) + )) + ;;@ jsenum/Main.java:136:4 + (drop (call_ref $function.m_compareTo__java_lang_Enum__int (ref.as_non_null (local.get $$qualifier))(block (result (ref null $jsenum.Main.NativeStringEnum)) + (call $$clinit__void@jsenum.Main.NativeStringEnum ) + (global.get $f_THREE__jsenum_Main_NativeStringEnum) + )(struct.get $java.lang.Enum.vtable $m_compareTo__java_lang_Enum__int (struct.get $java.lang.Enum $vtable(local.get $$qualifier))))) + ) + (block + ;;@ jsenum/Main.java:137:4 + (local.set $$qualifier_1 (block (result (ref null $jsenum.Main.NativeStringEnum)) + (call $$clinit__void@jsenum.Main.NativeStringEnum ) + (global.get $f_ONE__jsenum_Main_NativeStringEnum) + )) + ;;@ jsenum/Main.java:137:4 + (drop (call_ref $function.m_equals__java_lang_Object__boolean (ref.as_non_null (local.get $$qualifier_1))(block (result (ref null $jsenum.Main.NativeStringEnum)) + (call $$clinit__void@jsenum.Main.NativeStringEnum ) + (global.get $f_THREE__jsenum_Main_NativeStringEnum) + )(struct.get $java.lang.Enum.vtable $m_equals__java_lang_Object__boolean (struct.get $java.lang.Enum $vtable(local.get $$qualifier_1))))) + ) + ;;@ jsenum/Main.java:139:4 + (local.set $supplier (call $$create__@jsenum.Main.$LambdaImplementor$1 )) + ;;@ jsenum/Main.java:140:4 + (local.set $consummer (call $$create__@jsenum.Main.$LambdaImplementor$2 )) + ;;@ jsenum/Main.java:142:4 + (call $m_acceptsJsFunctionSupplier__jsenum_Main_JsFunctionSuppiler__void@jsenum.Main (call $$create__@jsenum.Main.$LambdaImplementor$3 )) + ;;@ jsenum/Main.java:143:4 + (call $m_acceptsSupplierOfSupplier__jsenum_Main_Supplier__void@jsenum.Main (call $$create__@jsenum.Main.$LambdaImplementor$5 )) + ) +) + +;;; void Main.testJsEnumAutoboxingSpecialMethods() +(func $m_testJsEnumAutoboxingSpecialMethods__void@jsenum.Main + ;;@ jsenum/Main.java:146:22 + (local $stringJsEnum (ref null $java.lang.String)) + (local $nullStringJsEnum (ref null $java.lang.String)) + (local $jsEnum i32) + (local $nullJsEnum i32) + (local $o (ref null $java.lang.Object)) + (local $$qualifier (ref null $javaemul.internal.Enums.BoxedStringEnum)) + (local $$qualifier_1 (ref null $javaemul.internal.Enums.BoxedStringEnum)) + (local $$qualifier_2 (ref null $javaemul.internal.Enums.BoxedComparableIntegerEnum)) + (local $$qualifier_3 (ref null $javaemul.internal.Enums.BoxedComparableIntegerEnum)) + (local $$qualifier_4 (ref null $javaemul.internal.Enums.BoxedComparableIntegerEnum)) + (local $$qualifier_5 (ref null $javaemul.internal.Enums.BoxedStringEnum)) + (local $$qualifier_6 (ref null $javaemul.internal.Enums.BoxedComparableIntegerEnum)) + (block + ;;@ jsenum/Main.java:147:4 + (local.set $stringJsEnum (call $function.no.side.effects.$getString_|ONE|__java_lang_String (ref.func $$getString_|ONE|__java_lang_String@jsenum.Main) )) + ;;@ jsenum/Main.java:148:4 + (local.set $nullStringJsEnum (call $m_unboxString__java_lang_Object__java_lang_Class__java_lang_String@javaemul.internal.Enums (ref.null $java.lang.Object)(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.StringJsEnum.$Overlay) ))) + ;;@ jsenum/Main.java:149:4 + (local.set $jsEnum (i32.const 1)) + ;;@ jsenum/Main.java:150:4 + (local.set $nullJsEnum (call $m_unboxInteger__java_lang_Object__java_lang_Class__int@javaemul.internal.Enums (ref.null $java.lang.Object)(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.ComparableJsEnum.$Overlay) ))) + ;;@ jsenum/Main.java:151:4 + (local.set $o (call $m_boxComparableInteger__int__java_lang_Class__javaemul_internal_Enums_BoxedComparableIntegerEnum@javaemul.internal.Enums (i32.const 1)(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.ComparableJsEnum.$Overlay) ))) + ;;@ jsenum/Main.java:153:4 + (drop (call $m_equalsString__java_lang_String__java_lang_String__boolean@javaemul.internal.Enums (ref.cast (ref null $java.lang.String) (call $function.no.side.effects.$getString_|ONE|__java_lang_String (ref.func $$getString_|ONE|__java_lang_String@jsenum.Main) ))(ref.cast (ref null $java.lang.String) (call $function.no.side.effects.$getString_|THREE|__java_lang_String (ref.func $$getString_|THREE|__java_lang_String@jsenum.Main) )))) + ;;@ jsenum/Main.java:154:4 + (drop (call $m_equalsString__java_lang_String__java_lang_String__boolean@javaemul.internal.Enums (ref.cast (ref null $java.lang.String) (call $function.no.side.effects.$getString_|ONE|__java_lang_String (ref.func $$getString_|ONE|__java_lang_String@jsenum.Main) ))(ref.cast (ref null $java.lang.String) (local.get $stringJsEnum)))) + ;;@ jsenum/Main.java:155:4 + (drop (call $m_equalsString__java_lang_String__java_lang_String__boolean@javaemul.internal.Enums (ref.cast (ref null $java.lang.String) (call $function.no.side.effects.$getString_|ONE|__java_lang_String (ref.func $$getString_|ONE|__java_lang_String@jsenum.Main) ))(ref.cast (ref null $java.lang.String) (local.get $nullStringJsEnum)))) + (block + ;;@ jsenum/Main.java:156:4 + (local.set $$qualifier (call $m_boxString__java_lang_String__java_lang_Class__javaemul_internal_Enums_BoxedStringEnum@javaemul.internal.Enums (call $function.no.side.effects.$getString_|ONE|__java_lang_String (ref.func $$getString_|ONE|__java_lang_String@jsenum.Main) )(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.StringJsEnum.$Overlay) ))) + ;;@ jsenum/Main.java:156:4 + (drop (call_ref $function.m_equals__java_lang_Object__boolean (ref.as_non_null (local.get $$qualifier))(ref.null $java.lang.Object)(struct.get $java.lang.Object.vtable $m_equals__java_lang_Object__boolean (struct.get $java.lang.Object $vtable(local.get $$qualifier))))) + ) + (block + ;;@ jsenum/Main.java:157:4 + (local.set $$qualifier_1 (call $m_boxString__java_lang_String__java_lang_Class__javaemul_internal_Enums_BoxedStringEnum@javaemul.internal.Enums (call $function.no.side.effects.$getString_|ONE|__java_lang_String (ref.func $$getString_|ONE|__java_lang_String@jsenum.Main) )(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.StringJsEnum.$Overlay) ))) + ;;@ jsenum/Main.java:157:4 + (drop (call_ref $function.m_equals__java_lang_Object__boolean (ref.as_non_null (local.get $$qualifier_1))(local.get $o)(struct.get $java.lang.Object.vtable $m_equals__java_lang_Object__boolean (struct.get $java.lang.Object $vtable(local.get $$qualifier_1))))) + ) + ;;@ jsenum/Main.java:158:4 + (drop (call_ref $function.m_equals__java_lang_Object__boolean (ref.as_non_null (local.get $o))(call $m_boxString__java_lang_String__java_lang_Class__javaemul_internal_Enums_BoxedStringEnum@javaemul.internal.Enums (call $function.no.side.effects.$getString_|THREE|__java_lang_String (ref.func $$getString_|THREE|__java_lang_String@jsenum.Main) )(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.StringJsEnum.$Overlay) ))(struct.get $java.lang.Object.vtable $m_equals__java_lang_Object__boolean (struct.get $java.lang.Object $vtable(local.get $o))))) + ;;@ jsenum/Main.java:160:4 + (drop (call $m_compareToInteger__int__int__int@javaemul.internal.Enums (i32.const 1)(i32.const 0))) + (block + ;;@ jsenum/Main.java:161:4 + (local.set $$qualifier_2 (call $m_boxComparableInteger__int__java_lang_Class__javaemul_internal_Enums_BoxedComparableIntegerEnum@javaemul.internal.Enums (i32.const 1)(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.ComparableJsEnum.$Overlay) ))) + ;;@ jsenum/Main.java:161:4 + (drop (call_ref $function.m_compareTo__java_lang_Object__int (ref.as_non_null (local.get $$qualifier_2))(ref.null $java.lang.Object)(struct.get $javaemul.internal.Enums.BoxedComparableIntegerEnum.vtable $m_compareTo__java_lang_Object__int (struct.get $javaemul.internal.Enums.BoxedComparableIntegerEnum $vtable(local.get $$qualifier_2))))) + ) + ;;@ jsenum/Main.java:162:4 + (drop (call $m_equalsInteger__int__int__boolean@javaemul.internal.Enums (i32.const 1)(i32.const 0))) + ;;@ jsenum/Main.java:163:4 + (drop (call $m_equalsInteger__int__int__boolean@javaemul.internal.Enums (i32.const 1)(local.get $jsEnum))) + ;;@ jsenum/Main.java:164:4 + (drop (call $m_equalsInteger__int__int__boolean@javaemul.internal.Enums (i32.const 1)(local.get $nullJsEnum))) + (block + ;;@ jsenum/Main.java:165:4 + (local.set $$qualifier_3 (call $m_boxComparableInteger__int__java_lang_Class__javaemul_internal_Enums_BoxedComparableIntegerEnum@javaemul.internal.Enums (i32.const 1)(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.ComparableJsEnum.$Overlay) ))) + ;;@ jsenum/Main.java:165:4 + (drop (call_ref $function.m_equals__java_lang_Object__boolean (ref.as_non_null (local.get $$qualifier_3))(ref.null $java.lang.Object)(struct.get $java.lang.Object.vtable $m_equals__java_lang_Object__boolean (struct.get $java.lang.Object $vtable(local.get $$qualifier_3))))) + ) + (block + ;;@ jsenum/Main.java:166:4 + (local.set $$qualifier_4 (call $m_boxComparableInteger__int__java_lang_Class__javaemul_internal_Enums_BoxedComparableIntegerEnum@javaemul.internal.Enums (i32.const 1)(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.ComparableJsEnum.$Overlay) ))) + ;;@ jsenum/Main.java:166:4 + (drop (call_ref $function.m_equals__java_lang_Object__boolean (ref.as_non_null (local.get $$qualifier_4))(local.get $o)(struct.get $java.lang.Object.vtable $m_equals__java_lang_Object__boolean (struct.get $java.lang.Object $vtable(local.get $$qualifier_4))))) + ) + ;;@ jsenum/Main.java:167:4 + (drop (call_ref $function.m_equals__java_lang_Object__boolean (ref.as_non_null (local.get $o))(call $m_boxComparableInteger__int__java_lang_Class__javaemul_internal_Enums_BoxedComparableIntegerEnum@javaemul.internal.Enums (i32.const 0)(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.ComparableJsEnum.$Overlay) ))(struct.get $java.lang.Object.vtable $m_equals__java_lang_Object__boolean (struct.get $java.lang.Object $vtable(local.get $o))))) + (block + ;;@ jsenum/Main.java:169:4 + (local.set $$qualifier_5 (call $m_boxString__java_lang_String__java_lang_Class__javaemul_internal_Enums_BoxedStringEnum@javaemul.internal.Enums (call $function.no.side.effects.$getString_|ONE|__java_lang_String (ref.func $$getString_|ONE|__java_lang_String@jsenum.Main) )(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.StringJsEnum.$Overlay) ))) + ;;@ jsenum/Main.java:169:4 + (drop (call_ref $function.m_equals__java_lang_Object__boolean (ref.as_non_null (local.get $$qualifier_5))(call $m_boxComparableInteger__int__java_lang_Class__javaemul_internal_Enums_BoxedComparableIntegerEnum@javaemul.internal.Enums (local.get $jsEnum)(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.ComparableJsEnum.$Overlay) ))(struct.get $java.lang.Object.vtable $m_equals__java_lang_Object__boolean (struct.get $java.lang.Object $vtable(local.get $$qualifier_5))))) + ) + ;;@ jsenum/Main.java:171:4 + (drop (call $m_equalsInteger__int__int__boolean@javaemul.internal.Enums (call $m_unboxInteger__java_lang_Object__java_lang_Class__int@javaemul.internal.Enums (call $m_boxingPassthrough__java_lang_Object__java_lang_Object@jsenum.Main (call $m_boxComparableInteger__int__java_lang_Class__javaemul_internal_Enums_BoxedComparableIntegerEnum@javaemul.internal.Enums (i32.const 1)(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.ComparableJsEnum.$Overlay) )))(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.ComparableJsEnum.$Overlay) ))(call $m_unboxInteger__java_lang_Object__java_lang_Class__int@javaemul.internal.Enums (call $m_boxingPassthrough__java_lang_Object__java_lang_Object@jsenum.Main (call $m_boxComparableInteger__int__java_lang_Class__javaemul_internal_Enums_BoxedComparableIntegerEnum@javaemul.internal.Enums (i32.const 1)(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.ComparableJsEnum.$Overlay) )))(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.ComparableJsEnum.$Overlay) )))) + (block + ;;@ jsenum/Main.java:172:4 + (local.set $$qualifier_6 (call $m_boxComparableInteger__int__java_lang_Class__javaemul_internal_Enums_BoxedComparableIntegerEnum@javaemul.internal.Enums (call $m_unboxInteger__java_lang_Object__java_lang_Class__int@javaemul.internal.Enums (call $m_boxingPassthrough__java_lang_Object__java_lang_Object@jsenum.Main (call $m_boxComparableInteger__int__java_lang_Class__javaemul_internal_Enums_BoxedComparableIntegerEnum@javaemul.internal.Enums (i32.const 1)(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.ComparableJsEnum.$Overlay) )))(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.ComparableJsEnum.$Overlay) ))(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.ComparableJsEnum.$Overlay) ))) + ;;@ jsenum/Main.java:172:4 + (drop (call_ref $function.m_equals__java_lang_Object__boolean (ref.as_non_null (local.get $$qualifier_6))(call $m_boxString__java_lang_String__java_lang_Class__javaemul_internal_Enums_BoxedStringEnum@javaemul.internal.Enums (call $m_unboxString__java_lang_Object__java_lang_Class__java_lang_String@javaemul.internal.Enums (call $m_boxingPassthrough__java_lang_Object__java_lang_Object@jsenum.Main (call $m_boxString__java_lang_String__java_lang_Class__javaemul_internal_Enums_BoxedStringEnum@javaemul.internal.Enums (call $function.no.side.effects.$getString_|ONE|__java_lang_String (ref.func $$getString_|ONE|__java_lang_String@jsenum.Main) )(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.StringJsEnum.$Overlay) )))(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.StringJsEnum.$Overlay) ))(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.StringJsEnum.$Overlay) ))(struct.get $java.lang.Object.vtable $m_equals__java_lang_Object__boolean (struct.get $java.lang.Object $vtable(local.get $$qualifier_6))))) + ) + ) +) + +;;; void Main.acceptsJsFunctionSupplier(JsFunctionSuppiler supplier) +(func $m_acceptsJsFunctionSupplier__jsenum_Main_JsFunctionSuppiler__void@jsenum.Main + (param $supplier (ref null $java.lang.Object)) + ;;@ jsenum/Main.java:180:22 + (block + ) +) + +;;; void Main.acceptsSupplierOfSupplier(Supplier> supplier) +(func $m_acceptsSupplierOfSupplier__jsenum_Main_Supplier__void@jsenum.Main + (param $supplier (ref null $java.lang.Object)) + ;;@ jsenum/Main.java:182:22 + (block + ) +) + +;;; void Main.testReturnsAndParameters() +(func $m_testReturnsAndParameters__void@jsenum.Main + ;;@ jsenum/Main.java:184:22 + (local $returnedValue i32) + (local $returnedNullValue i32) + (block + ;;@ jsenum/Main.java:185:4 + (local.set $returnedValue (call $m_returnsJsEnum__jsenum_Main_ComparableJsEnum@jsenum.Main )) + ;;@ jsenum/Main.java:186:4 + (local.set $returnedNullValue (call $m_returnsNullJsEnum__jsenum_Main_ComparableJsEnum@jsenum.Main )) + ;;@ jsenum/Main.java:187:4 + (call $m_takesJsEnum__jsenum_Main_ComparableJsEnum__void@jsenum.Main (i32.const 1)) + ) +) + +;;; ComparableJsEnum Main.returnsJsEnum() +(func $m_returnsJsEnum__jsenum_Main_ComparableJsEnum@jsenum.Main + (result i32) + ;;@ jsenum/Main.java:190:34 + (block + ;;@ jsenum/Main.java:191:4 + (return (i32.const 1)) + ) +) + +;;; ComparableJsEnum Main.returnsNullJsEnum() +(func $m_returnsNullJsEnum__jsenum_Main_ComparableJsEnum@jsenum.Main + (result i32) + ;;@ jsenum/Main.java:194:34 + (block + ;;@ jsenum/Main.java:195:4 + (return (call $m_unboxInteger__java_lang_Object__java_lang_Class__int@javaemul.internal.Enums (ref.null $java.lang.Object)(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.ComparableJsEnum.$Overlay) ))) + ) +) + +;;; void Main.takesJsEnum(ComparableJsEnum value) +(func $m_takesJsEnum__jsenum_Main_ComparableJsEnum__void@jsenum.Main + (param $value i32) + ;;@ jsenum/Main.java:198:22 + (block + ) +) + +;;; void Main.testBoxUnboxWithTypeInference() +(func $m_testBoxUnboxWithTypeInference__void@jsenum.Main + ;;@ jsenum/Main.java:200:22 + (local $templatedField (ref null $jsenum.Main.TemplatedField)) + (local $unboxed i32) + (local $b i32) + (block + ;;@ jsenum/Main.java:202:4 + (local.set $templatedField (call $$create__java_lang_Object@jsenum.Main.TemplatedField (call $m_boxComparableInteger__int__java_lang_Class__javaemul_internal_Enums_BoxedComparableIntegerEnum@javaemul.internal.Enums (i32.const 1)(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.ComparableJsEnum.$Overlay) )))) + ;;@ jsenum/Main.java:204:4 + (local.set $unboxed (call $m_unboxInteger__java_lang_Object__java_lang_Class__int@javaemul.internal.Enums (call_ref $function.m_getValue__java_lang_Object_$pp_jsenum (ref.as_non_null (local.get $templatedField))(struct.get $jsenum.Main.TemplatedField.vtable $m_getValue__java_lang_Object_$pp_jsenum (struct.get $jsenum.Main.TemplatedField $vtable(local.get $templatedField))))(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.ComparableJsEnum.$Overlay) ))) + ;;@ jsenum/Main.java:205:4 + (local.set $unboxed (call $m_unboxInteger__java_lang_Object__java_lang_Class__int@javaemul.internal.Enums (struct.get $jsenum.Main.TemplatedField $f_value__jsenum_Main_TemplatedField (local.get $templatedField))(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.ComparableJsEnum.$Overlay) ))) + ;;@ jsenum/Main.java:206:4 + (struct.set $jsenum.Main.TemplatedField $f_value__jsenum_Main_TemplatedField (local.get $templatedField) (call $m_boxComparableInteger__int__java_lang_Class__javaemul_internal_Enums_BoxedComparableIntegerEnum@javaemul.internal.Enums (i32.const 1)(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.ComparableJsEnum.$Overlay) ))) + ;;@ jsenum/Main.java:207:4 + (drop (call $m_asList__arrayOf_java_lang_Object__java_util_List@java.util.Arrays (call $m_newWithLiteral__arrayOf_java_lang_Object__javaemul_internal_WasmArray_OfObject@javaemul.internal.WasmArray.OfObject (array.new_fixed $java.lang.Object.array (call $m_boxComparableInteger__int__java_lang_Class__javaemul_internal_Enums_BoxedComparableIntegerEnum@javaemul.internal.Enums (i32.const 1)(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.ComparableJsEnum.$Overlay) )))))) + ;;@ jsenum/Main.java:208:4 + (drop (call $m_unboxInteger__java_lang_Object__java_lang_Class__int@javaemul.internal.Enums (call_ref $function.m_getValue__java_lang_Object_$pp_jsenum (ref.as_non_null (local.get $templatedField))(struct.get $jsenum.Main.TemplatedField.vtable $m_getValue__java_lang_Object_$pp_jsenum (struct.get $jsenum.Main.TemplatedField $vtable(local.get $templatedField))))(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.ComparableJsEnum.$Overlay) ))) + ;;@ jsenum/Main.java:209:4 + (local.set $b (ref.eq (call $m_boxComparableInteger__int__java_lang_Class__javaemul_internal_Enums_BoxedComparableIntegerEnum@javaemul.internal.Enums (i32.const 1)(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.ComparableJsEnum.$Overlay) )) (call $m_boxingPassthrough__java_lang_Object__java_lang_Object@jsenum.Main (call $m_boxComparableInteger__int__java_lang_Class__javaemul_internal_Enums_BoxedComparableIntegerEnum@javaemul.internal.Enums (i32.const 1)(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.ComparableJsEnum.$Overlay) ))))) + ) +) + +;;; T Main.boxingPassthrough(T t) +(func $m_boxingPassthrough__java_lang_Object__java_lang_Object@jsenum.Main + (param $t (ref null $java.lang.Object)) + (result (ref null $java.lang.Object)) + ;;@ jsenum/Main.java:224:23 + (block + ;;@ jsenum/Main.java:225:4 + (return (local.get $t)) + ) +) + +;;; void Main.boxingWithGenerics() +(func $m_boxingWithGenerics__void@jsenum.Main + ;;@ jsenum/Main.java:228:14 + (block + ;;@ jsenum/Main.java:228:35 + (call $$clinit__void@jsenum.Main ) + ;;@ jsenum/Main.java:229:4 + (drop (call $$create__java_util_Optional@jsenum.Main.Foo (call $m_of__java_lang_Object__java_util_Optional@java.util.Optional (call $m_boxInteger__int__java_lang_Class__javaemul_internal_Enums_BoxedIntegerEnum@javaemul.internal.Enums (i32.const -1)(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.IntJsEnum.$Overlay) ))))) + ) +) + +;;; void Main.$clinit() +(func $$clinit__void@jsenum.Main + ;;@ jsenum/Main.java:26:13 + (block + ;;@ jsenum/Main.java:26:13 + (if (global.get $f_$initialized__jsenum_Main) + (then + ;;@ jsenum/Main.java:26:13 + (return ) + ) + ) + ;;@ jsenum/Main.java:26:13 + (global.set $f_$initialized__jsenum_Main (i32.const 1)) + ;;@ jsenum/Main.java:26:13 + (call $$clinit__void@java.lang.Object ) + ) +) + +;;; Class Main.$getClassMetadata() +(func $$getClassMetadata__java_lang_Class@jsenum.Main + (result (ref null $java.lang.Class)) + (block + (if (ref.is_null (global.get $f_$class__jsenum_Main)) + (then + (global.set $f_$class__jsenum_Main (call $m_createForClass__java_lang_String__java_lang_Class__java_lang_Class@java.lang.Class (call $function.no.side.effects.$getString_|jsenum.Main|__java_lang_String (ref.func $$getString_|jsenum.Main|__java_lang_String@jsenum.Main) )(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@java.lang.Object) ))) + ) + ) + (return (global.get $f_$class__jsenum_Main)) + ) +) + +;;; Class Main.$getClassImpl() +(func $$getClassImpl__java_lang_Class@jsenum.Main + (type $function.$getClassImpl__java_lang_Class) + (param $this.untyped (ref $java.lang.Object)) + (result (ref null $java.lang.Class)) + (local $this (ref null $jsenum.Main)) + (local.set $this (ref.cast (ref $jsenum.Main) (local.get $this.untyped))) + (block + (return (call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main) )) + ) +) +(elem declare func $$getClassImpl__java_lang_Class@jsenum.Main) + +;;; String Main.$getString_|ONE|() +(func $$getString_|ONE|__java_lang_String@jsenum.Main + (result (ref null $java.lang.String)) + (block + (if (ref.is_null (global.get $f_$string_|ONE|__jsenum_Main)) + (then + (global.set $f_$string_|ONE|__jsenum_Main (call $m_fromJsString__java_lang_String_NativeString__java_lang_String@java.lang.String (string.const "ONE"))) + ) + ) + (return (global.get $f_$string_|ONE|__jsenum_Main)) + ) +) + +;;; String Main.$getString_|10|() +(func $$getString_|10|__java_lang_String@jsenum.Main + (result (ref null $java.lang.String)) + (block + (if (ref.is_null (global.get $f_$string_|10|__jsenum_Main)) + (then + (global.set $f_$string_|10|__jsenum_Main (call $m_fromJsString__java_lang_String_NativeString__java_lang_String@java.lang.String (string.const "10"))) + ) + ) + (return (global.get $f_$string_|10|__jsenum_Main)) + ) +) + +;;; String Main.$getString_|THREE|() +(func $$getString_|THREE|__java_lang_String@jsenum.Main + (result (ref null $java.lang.String)) + (block + (if (ref.is_null (global.get $f_$string_|THREE|__jsenum_Main)) + (then + (global.set $f_$string_|THREE|__jsenum_Main (call $m_fromJsString__java_lang_String_NativeString__java_lang_String@java.lang.String (string.const "THREE"))) + ) + ) + (return (global.get $f_$string_|THREE|__jsenum_Main)) + ) +) + +;;; String Main.$getString_|jsenum.Main|() +(func $$getString_|jsenum.Main|__java_lang_String@jsenum.Main + (result (ref null $java.lang.String)) + (block + (if (ref.is_null (global.get $f_$string_|jsenum.Main|__jsenum_Main)) + (then + (global.set $f_$string_|jsenum.Main|__jsenum_Main (call $m_fromJsString__java_lang_String_NativeString__java_lang_String@java.lang.String (string.const "jsenum.Main"))) + ) + ) + (return (global.get $f_$string_|jsenum.Main|__jsenum_Main)) + ) +) + +;;; Code for jsenum.Main.$LambdaImplementor$1 [methods] + +;;; implements Supplier implements Supplier.$create() +(func $$create__@jsenum.Main.$LambdaImplementor$1 + (result (ref null $jsenum.Main.$LambdaImplementor$1)) + ;;@ jsenum/Main.java:139:42 + (local $$instance (ref null $jsenum.Main.$LambdaImplementor$1)) + (block + ;;@ jsenum/Main.java:139:42 + (call $$clinit__void@jsenum.Main.$LambdaImplementor$1 ) + ;;@ jsenum/Main.java:139:42 + (local.set $$instance (struct.new $jsenum.Main.$LambdaImplementor$1 (ref.as_non_null (global.get $jsenum.Main.$LambdaImplementor$1.vtable)) (ref.as_non_null (global.get $jsenum.Main.$LambdaImplementor$1.itable)) (i32.const 0))) + ;;@ jsenum/Main.java:139:42 + (call $$ctor__void_$p_jsenum_Main_$LambdaImplementor$1@jsenum.Main.$LambdaImplementor$1 (ref.as_non_null (local.get $$instance))) + ;;@ jsenum/Main.java:139:42 + (return (local.get $$instance)) + ) +) + +;;; void implements Supplier.$ctor() +(func $$ctor__void_$p_jsenum_Main_$LambdaImplementor$1@jsenum.Main.$LambdaImplementor$1 + (param $this (ref null $jsenum.Main.$LambdaImplementor$1)) + ;;@ jsenum/Main.java:139:42 + (block + ;;@ jsenum/Main.java:139:42 + (call $$ctor__void_$p_java_lang_Object@java.lang.Object (ref.as_non_null (local.get $this))) + ) +) + +;;; T implements Supplier.get() +(func $m_get__java_lang_Object@jsenum.Main.$LambdaImplementor$1 + (type $function.m_get__java_lang_Object) + (param $this.untyped (ref $java.lang.Object)) + (result (ref null $java.lang.Object)) + ;;@ jsenum/Main.java:139:42 + (local $this (ref null $jsenum.Main.$LambdaImplementor$1)) + (local.set $this (ref.cast (ref $jsenum.Main.$LambdaImplementor$1) (local.get $this.untyped))) + (block + ;;@ jsenum/Main.java:139:48 + (return (call $m_boxComparableInteger__int__java_lang_Class__javaemul_internal_Enums_BoxedComparableIntegerEnum@javaemul.internal.Enums (i32.const 1)(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.ComparableJsEnum.$Overlay) ))) + ) +) +(elem declare func $m_get__java_lang_Object@jsenum.Main.$LambdaImplementor$1) + +;;; void implements Supplier.$clinit() +(func $$clinit__void@jsenum.Main.$LambdaImplementor$1 + ;;@ jsenum/Main.java:139:42 + (block + ;;@ jsenum/Main.java:139:42 + (if (global.get $f_$initialized__jsenum_Main_$LambdaImplementor$1) + (then + ;;@ jsenum/Main.java:139:42 + (return ) + ) + ) + ;;@ jsenum/Main.java:139:42 + (global.set $f_$initialized__jsenum_Main_$LambdaImplementor$1 (i32.const 1)) + ;;@ jsenum/Main.java:139:42 + (call $$clinit__void@java.lang.Object ) + ) +) + +;;; Class implements Supplier.$getClassMetadata() +(func $$getClassMetadata__java_lang_Class@jsenum.Main.$LambdaImplementor$1 + (result (ref null $java.lang.Class)) + (block + (if (ref.is_null (global.get $f_$class__jsenum_Main_$LambdaImplementor$1)) + (then + (global.set $f_$class__jsenum_Main_$LambdaImplementor$1 (call $m_createForClass__java_lang_String__java_lang_Class__java_lang_Class@java.lang.Class (call $function.no.side.effects.$getString_|jsenum.Main_...|__java_lang_String (ref.func $$getString_|jsenum.Main_...|__java_lang_String@jsenum.Main.$LambdaImplementor$1) )(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@java.lang.Object) ))) + ) + ) + (return (global.get $f_$class__jsenum_Main_$LambdaImplementor$1)) + ) +) + +;;; Class implements Supplier.$getClassImpl() +(func $$getClassImpl__java_lang_Class@jsenum.Main.$LambdaImplementor$1 + (type $function.$getClassImpl__java_lang_Class) + (param $this.untyped (ref $java.lang.Object)) + (result (ref null $java.lang.Class)) + (local $this (ref null $jsenum.Main.$LambdaImplementor$1)) + (local.set $this (ref.cast (ref $jsenum.Main.$LambdaImplementor$1) (local.get $this.untyped))) + (block + (return (call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.$LambdaImplementor$1) )) + ) +) +(elem declare func $$getClassImpl__java_lang_Class@jsenum.Main.$LambdaImplementor$1) + +;;; String implements Supplier.$getString_|jsenum.Main_...|() +(func $$getString_|jsenum.Main_...|__java_lang_String@jsenum.Main.$LambdaImplementor$1 + (result (ref null $java.lang.String)) + (block + (if (ref.is_null (global.get $f_$string_|jsenum.Main_...|__jsenum_Main_$LambdaImplementor$1)) + (then + (global.set $f_$string_|jsenum.Main_...|__jsenum_Main_$LambdaImplementor$1 (call $m_fromJsString__java_lang_String_NativeString__java_lang_String@java.lang.String (string.const "jsenum.Main$$LambdaImplementor$1"))) + ) + ) + (return (global.get $f_$string_|jsenum.Main_...|__jsenum_Main_$LambdaImplementor$1)) + ) +) + +;;; Code for jsenum.Main.$LambdaImplementor$2 [methods] + +;;; implements Consumer implements Consumer.$create() +(func $$create__@jsenum.Main.$LambdaImplementor$2 + (result (ref null $jsenum.Main.$LambdaImplementor$2)) + ;;@ jsenum/Main.java:140:43 + (local $$instance (ref null $jsenum.Main.$LambdaImplementor$2)) + (block + ;;@ jsenum/Main.java:140:43 + (call $$clinit__void@jsenum.Main.$LambdaImplementor$2 ) + ;;@ jsenum/Main.java:140:43 + (local.set $$instance (struct.new $jsenum.Main.$LambdaImplementor$2 (ref.as_non_null (global.get $jsenum.Main.$LambdaImplementor$2.vtable)) (ref.as_non_null (global.get $jsenum.Main.$LambdaImplementor$2.itable)) (i32.const 0))) + ;;@ jsenum/Main.java:140:43 + (call $$ctor__void_$p_jsenum_Main_$LambdaImplementor$2@jsenum.Main.$LambdaImplementor$2 (ref.as_non_null (local.get $$instance))) + ;;@ jsenum/Main.java:140:43 + (return (local.get $$instance)) + ) +) + +;;; void implements Consumer.$ctor() +(func $$ctor__void_$p_jsenum_Main_$LambdaImplementor$2@jsenum.Main.$LambdaImplementor$2 + (param $this (ref null $jsenum.Main.$LambdaImplementor$2)) + ;;@ jsenum/Main.java:140:43 + (block + ;;@ jsenum/Main.java:140:43 + (call $$ctor__void_$p_java_lang_Object@java.lang.Object (ref.as_non_null (local.get $this))) + ) +) + +;;; void implements Consumer.accept(T e) +(func $m_accept__java_lang_Object__void@jsenum.Main.$LambdaImplementor$2 + (type $function.m_accept__java_lang_Object__void) + (param $this.untyped (ref $java.lang.Object)) + (param $e (ref null $java.lang.Object)) + ;;@ jsenum/Main.java:140:43 + (local $e_1 i32) + (local $this (ref null $jsenum.Main.$LambdaImplementor$2)) + (local.set $this (ref.cast (ref $jsenum.Main.$LambdaImplementor$2) (local.get $this.untyped))) + (block + ;;@ jsenum/Main.java:140:43 + (local.set $e_1 (call $m_unboxInteger__java_lang_Object__java_lang_Class__int@javaemul.internal.Enums (local.get $e)(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.ComparableJsEnum.$Overlay) ))) + ) +) +(elem declare func $m_accept__java_lang_Object__void@jsenum.Main.$LambdaImplementor$2) + +;;; void implements Consumer.$clinit() +(func $$clinit__void@jsenum.Main.$LambdaImplementor$2 + ;;@ jsenum/Main.java:140:43 + (block + ;;@ jsenum/Main.java:140:43 + (if (global.get $f_$initialized__jsenum_Main_$LambdaImplementor$2) + (then + ;;@ jsenum/Main.java:140:43 + (return ) + ) + ) + ;;@ jsenum/Main.java:140:43 + (global.set $f_$initialized__jsenum_Main_$LambdaImplementor$2 (i32.const 1)) + ;;@ jsenum/Main.java:140:43 + (call $$clinit__void@java.lang.Object ) + ) +) + +;;; Class implements Consumer.$getClassMetadata() +(func $$getClassMetadata__java_lang_Class@jsenum.Main.$LambdaImplementor$2 + (result (ref null $java.lang.Class)) + (block + (if (ref.is_null (global.get $f_$class__jsenum_Main_$LambdaImplementor$2)) + (then + (global.set $f_$class__jsenum_Main_$LambdaImplementor$2 (call $m_createForClass__java_lang_String__java_lang_Class__java_lang_Class@java.lang.Class (call $function.no.side.effects.$getString_|jsenum.Main_...|__java_lang_String (ref.func $$getString_|jsenum.Main_...|__java_lang_String@jsenum.Main.$LambdaImplementor$2) )(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@java.lang.Object) ))) + ) + ) + (return (global.get $f_$class__jsenum_Main_$LambdaImplementor$2)) + ) +) + +;;; Class implements Consumer.$getClassImpl() +(func $$getClassImpl__java_lang_Class@jsenum.Main.$LambdaImplementor$2 + (type $function.$getClassImpl__java_lang_Class) + (param $this.untyped (ref $java.lang.Object)) + (result (ref null $java.lang.Class)) + (local $this (ref null $jsenum.Main.$LambdaImplementor$2)) + (local.set $this (ref.cast (ref $jsenum.Main.$LambdaImplementor$2) (local.get $this.untyped))) + (block + (return (call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.$LambdaImplementor$2) )) + ) +) +(elem declare func $$getClassImpl__java_lang_Class@jsenum.Main.$LambdaImplementor$2) + +;;; String implements Consumer.$getString_|jsenum.Main_...|() +(func $$getString_|jsenum.Main_...|__java_lang_String@jsenum.Main.$LambdaImplementor$2 + (result (ref null $java.lang.String)) + (block + (if (ref.is_null (global.get $f_$string_|jsenum.Main_...|__jsenum_Main_$LambdaImplementor$2)) + (then + (global.set $f_$string_|jsenum.Main_...|__jsenum_Main_$LambdaImplementor$2 (call $m_fromJsString__java_lang_String_NativeString__java_lang_String@java.lang.String (string.const "jsenum.Main$$LambdaImplementor$2"))) + ) + ) + (return (global.get $f_$string_|jsenum.Main_...|__jsenum_Main_$LambdaImplementor$2)) + ) +) + +;;; Code for jsenum.Main.$LambdaImplementor$3 [methods] + +;;; implements JsFunctionSuppiler implements JsFunctionSuppiler.$create() +(func $$create__@jsenum.Main.$LambdaImplementor$3 + (result (ref null $jsenum.Main.$LambdaImplementor$3)) + ;;@ jsenum/Main.java:142:30 + (local $$instance (ref null $jsenum.Main.$LambdaImplementor$3)) + (block + ;;@ jsenum/Main.java:142:30 + (call $$clinit__void@jsenum.Main.$LambdaImplementor$3 ) + ;;@ jsenum/Main.java:142:30 + (local.set $$instance (struct.new $jsenum.Main.$LambdaImplementor$3 (ref.as_non_null (global.get $jsenum.Main.$LambdaImplementor$3.vtable)) (ref.as_non_null (global.get $jsenum.Main.$LambdaImplementor$3.itable)) (i32.const 0))) + ;;@ jsenum/Main.java:142:30 + (call $$ctor__void_$p_jsenum_Main_$LambdaImplementor$3@jsenum.Main.$LambdaImplementor$3 (ref.as_non_null (local.get $$instance))) + ;;@ jsenum/Main.java:142:30 + (return (local.get $$instance)) + ) +) + +;;; void implements JsFunctionSuppiler.$ctor() +(func $$ctor__void_$p_jsenum_Main_$LambdaImplementor$3@jsenum.Main.$LambdaImplementor$3 + (param $this (ref null $jsenum.Main.$LambdaImplementor$3)) + ;;@ jsenum/Main.java:142:30 + (block + ;;@ jsenum/Main.java:142:30 + (call $$ctor__void_$p_java_lang_Object@java.lang.Object (ref.as_non_null (local.get $this))) + ) +) + +;;; T implements JsFunctionSuppiler.get() +(func $m_get__java_lang_Object@jsenum.Main.$LambdaImplementor$3 + (type $function.m_get__java_lang_Object) + (param $this.untyped (ref $java.lang.Object)) + (result (ref null $java.lang.Object)) + ;;@ jsenum/Main.java:142:30 + (local $this (ref null $jsenum.Main.$LambdaImplementor$3)) + (local.set $this (ref.cast (ref $jsenum.Main.$LambdaImplementor$3) (local.get $this.untyped))) + (block + ;;@ jsenum/Main.java:142:36 + (return (call $m_boxComparableInteger__int__java_lang_Class__javaemul_internal_Enums_BoxedComparableIntegerEnum@javaemul.internal.Enums (i32.const 1)(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.ComparableJsEnum.$Overlay) ))) + ) +) +(elem declare func $m_get__java_lang_Object@jsenum.Main.$LambdaImplementor$3) + +;;; void implements JsFunctionSuppiler.$clinit() +(func $$clinit__void@jsenum.Main.$LambdaImplementor$3 + ;;@ jsenum/Main.java:142:30 + (block + ;;@ jsenum/Main.java:142:30 + (if (global.get $f_$initialized__jsenum_Main_$LambdaImplementor$3) + (then + ;;@ jsenum/Main.java:142:30 + (return ) + ) + ) + ;;@ jsenum/Main.java:142:30 + (global.set $f_$initialized__jsenum_Main_$LambdaImplementor$3 (i32.const 1)) + ;;@ jsenum/Main.java:142:30 + (call $$clinit__void@java.lang.Object ) + ) +) + +;;; Class implements JsFunctionSuppiler.$getClassMetadata() +(func $$getClassMetadata__java_lang_Class@jsenum.Main.$LambdaImplementor$3 + (result (ref null $java.lang.Class)) + (block + (if (ref.is_null (global.get $f_$class__jsenum_Main_$LambdaImplementor$3)) + (then + (global.set $f_$class__jsenum_Main_$LambdaImplementor$3 (call $m_createForClass__java_lang_String__java_lang_Class__java_lang_Class@java.lang.Class (call $function.no.side.effects.$getString_|jsenum.Main_...|__java_lang_String (ref.func $$getString_|jsenum.Main_...|__java_lang_String@jsenum.Main.$LambdaImplementor$3) )(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@java.lang.Object) ))) + ) + ) + (return (global.get $f_$class__jsenum_Main_$LambdaImplementor$3)) + ) +) + +;;; Class implements JsFunctionSuppiler.$getClassImpl() +(func $$getClassImpl__java_lang_Class@jsenum.Main.$LambdaImplementor$3 + (type $function.$getClassImpl__java_lang_Class) + (param $this.untyped (ref $java.lang.Object)) + (result (ref null $java.lang.Class)) + (local $this (ref null $jsenum.Main.$LambdaImplementor$3)) + (local.set $this (ref.cast (ref $jsenum.Main.$LambdaImplementor$3) (local.get $this.untyped))) + (block + (return (call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.$LambdaImplementor$3) )) + ) +) +(elem declare func $$getClassImpl__java_lang_Class@jsenum.Main.$LambdaImplementor$3) + +;;; String implements JsFunctionSuppiler.$getString_|jsenum.Main_...|() +(func $$getString_|jsenum.Main_...|__java_lang_String@jsenum.Main.$LambdaImplementor$3 + (result (ref null $java.lang.String)) + (block + (if (ref.is_null (global.get $f_$string_|jsenum.Main_...|__jsenum_Main_$LambdaImplementor$3)) + (then + (global.set $f_$string_|jsenum.Main_...|__jsenum_Main_$LambdaImplementor$3 (call $m_fromJsString__java_lang_String_NativeString__java_lang_String@java.lang.String (string.const "jsenum.Main$$LambdaImplementor$3"))) + ) + ) + (return (global.get $f_$string_|jsenum.Main_...|__jsenum_Main_$LambdaImplementor$3)) + ) +) + +;;; Code for jsenum.Main.$LambdaImplementor$4 [methods] + +;;; implements Supplier implements Supplier.$create() +(func $$create__@jsenum.Main.$LambdaImplementor$4 + (result (ref null $jsenum.Main.$LambdaImplementor$4)) + ;;@ jsenum/Main.java:143:37 + (local $$instance (ref null $jsenum.Main.$LambdaImplementor$4)) + (block + ;;@ jsenum/Main.java:143:37 + (call $$clinit__void@jsenum.Main.$LambdaImplementor$4 ) + ;;@ jsenum/Main.java:143:37 + (local.set $$instance (struct.new $jsenum.Main.$LambdaImplementor$4 (ref.as_non_null (global.get $jsenum.Main.$LambdaImplementor$4.vtable)) (ref.as_non_null (global.get $jsenum.Main.$LambdaImplementor$4.itable)) (i32.const 0))) + ;;@ jsenum/Main.java:143:37 + (call $$ctor__void_$p_jsenum_Main_$LambdaImplementor$4@jsenum.Main.$LambdaImplementor$4 (ref.as_non_null (local.get $$instance))) + ;;@ jsenum/Main.java:143:37 + (return (local.get $$instance)) + ) +) + +;;; void implements Supplier.$ctor() +(func $$ctor__void_$p_jsenum_Main_$LambdaImplementor$4@jsenum.Main.$LambdaImplementor$4 + (param $this (ref null $jsenum.Main.$LambdaImplementor$4)) + ;;@ jsenum/Main.java:143:37 + (block + ;;@ jsenum/Main.java:143:37 + (call $$ctor__void_$p_java_lang_Object@java.lang.Object (ref.as_non_null (local.get $this))) + ) +) + +;;; T implements Supplier.get() +(func $m_get__java_lang_Object@jsenum.Main.$LambdaImplementor$4 + (type $function.m_get__java_lang_Object) + (param $this.untyped (ref $java.lang.Object)) + (result (ref null $java.lang.Object)) + ;;@ jsenum/Main.java:143:37 + (local $this (ref null $jsenum.Main.$LambdaImplementor$4)) + (local.set $this (ref.cast (ref $jsenum.Main.$LambdaImplementor$4) (local.get $this.untyped))) + (block + ;;@ jsenum/Main.java:143:43 + (return (call $m_boxComparableInteger__int__java_lang_Class__javaemul_internal_Enums_BoxedComparableIntegerEnum@javaemul.internal.Enums (i32.const 1)(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.ComparableJsEnum.$Overlay) ))) + ) +) +(elem declare func $m_get__java_lang_Object@jsenum.Main.$LambdaImplementor$4) + +;;; void implements Supplier.$clinit() +(func $$clinit__void@jsenum.Main.$LambdaImplementor$4 + ;;@ jsenum/Main.java:143:37 + (block + ;;@ jsenum/Main.java:143:37 + (if (global.get $f_$initialized__jsenum_Main_$LambdaImplementor$4) + (then + ;;@ jsenum/Main.java:143:37 + (return ) + ) + ) + ;;@ jsenum/Main.java:143:37 + (global.set $f_$initialized__jsenum_Main_$LambdaImplementor$4 (i32.const 1)) + ;;@ jsenum/Main.java:143:37 + (call $$clinit__void@java.lang.Object ) + ) +) + +;;; Class implements Supplier.$getClassMetadata() +(func $$getClassMetadata__java_lang_Class@jsenum.Main.$LambdaImplementor$4 + (result (ref null $java.lang.Class)) + (block + (if (ref.is_null (global.get $f_$class__jsenum_Main_$LambdaImplementor$4)) + (then + (global.set $f_$class__jsenum_Main_$LambdaImplementor$4 (call $m_createForClass__java_lang_String__java_lang_Class__java_lang_Class@java.lang.Class (call $function.no.side.effects.$getString_|jsenum.Main_...|__java_lang_String (ref.func $$getString_|jsenum.Main_...|__java_lang_String@jsenum.Main.$LambdaImplementor$4) )(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@java.lang.Object) ))) + ) + ) + (return (global.get $f_$class__jsenum_Main_$LambdaImplementor$4)) + ) +) + +;;; Class implements Supplier.$getClassImpl() +(func $$getClassImpl__java_lang_Class@jsenum.Main.$LambdaImplementor$4 + (type $function.$getClassImpl__java_lang_Class) + (param $this.untyped (ref $java.lang.Object)) + (result (ref null $java.lang.Class)) + (local $this (ref null $jsenum.Main.$LambdaImplementor$4)) + (local.set $this (ref.cast (ref $jsenum.Main.$LambdaImplementor$4) (local.get $this.untyped))) + (block + (return (call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.$LambdaImplementor$4) )) + ) +) +(elem declare func $$getClassImpl__java_lang_Class@jsenum.Main.$LambdaImplementor$4) + +;;; String implements Supplier.$getString_|jsenum.Main_...|() +(func $$getString_|jsenum.Main_...|__java_lang_String@jsenum.Main.$LambdaImplementor$4 + (result (ref null $java.lang.String)) + (block + (if (ref.is_null (global.get $f_$string_|jsenum.Main_...|__jsenum_Main_$LambdaImplementor$4)) + (then + (global.set $f_$string_|jsenum.Main_...|__jsenum_Main_$LambdaImplementor$4 (call $m_fromJsString__java_lang_String_NativeString__java_lang_String@java.lang.String (string.const "jsenum.Main$$LambdaImplementor$4"))) + ) + ) + (return (global.get $f_$string_|jsenum.Main_...|__jsenum_Main_$LambdaImplementor$4)) + ) +) + +;;; Code for jsenum.Main.$LambdaImplementor$5 [methods] + +;;; implements Supplier implements Supplier.$create() +(func $$create__@jsenum.Main.$LambdaImplementor$5 + (result (ref null $jsenum.Main.$LambdaImplementor$5)) + ;;@ jsenum/Main.java:143:30 + (local $$instance (ref null $jsenum.Main.$LambdaImplementor$5)) + (block + ;;@ jsenum/Main.java:143:30 + (call $$clinit__void@jsenum.Main.$LambdaImplementor$5 ) + ;;@ jsenum/Main.java:143:30 + (local.set $$instance (struct.new $jsenum.Main.$LambdaImplementor$5 (ref.as_non_null (global.get $jsenum.Main.$LambdaImplementor$5.vtable)) (ref.as_non_null (global.get $jsenum.Main.$LambdaImplementor$5.itable)) (i32.const 0))) + ;;@ jsenum/Main.java:143:30 + (call $$ctor__void_$p_jsenum_Main_$LambdaImplementor$5@jsenum.Main.$LambdaImplementor$5 (ref.as_non_null (local.get $$instance))) + ;;@ jsenum/Main.java:143:30 + (return (local.get $$instance)) + ) +) + +;;; void implements Supplier.$ctor() +(func $$ctor__void_$p_jsenum_Main_$LambdaImplementor$5@jsenum.Main.$LambdaImplementor$5 + (param $this (ref null $jsenum.Main.$LambdaImplementor$5)) + ;;@ jsenum/Main.java:143:30 + (block + ;;@ jsenum/Main.java:143:30 + (call $$ctor__void_$p_java_lang_Object@java.lang.Object (ref.as_non_null (local.get $this))) + ) +) + +;;; T implements Supplier.get() +(func $m_get__java_lang_Object@jsenum.Main.$LambdaImplementor$5 + (type $function.m_get__java_lang_Object) + (param $this.untyped (ref $java.lang.Object)) + (result (ref null $java.lang.Object)) + ;;@ jsenum/Main.java:143:30 + (local $this (ref null $jsenum.Main.$LambdaImplementor$5)) + (local.set $this (ref.cast (ref $jsenum.Main.$LambdaImplementor$5) (local.get $this.untyped))) + (block + ;;@ jsenum/Main.java:143:36 + (return (call $$create__@jsenum.Main.$LambdaImplementor$4 )) + ) +) +(elem declare func $m_get__java_lang_Object@jsenum.Main.$LambdaImplementor$5) + +;;; void implements Supplier.$clinit() +(func $$clinit__void@jsenum.Main.$LambdaImplementor$5 + ;;@ jsenum/Main.java:143:30 + (block + ;;@ jsenum/Main.java:143:30 + (if (global.get $f_$initialized__jsenum_Main_$LambdaImplementor$5) + (then + ;;@ jsenum/Main.java:143:30 + (return ) + ) + ) + ;;@ jsenum/Main.java:143:30 + (global.set $f_$initialized__jsenum_Main_$LambdaImplementor$5 (i32.const 1)) + ;;@ jsenum/Main.java:143:30 + (call $$clinit__void@java.lang.Object ) + ) +) + +;;; Class implements Supplier.$getClassMetadata() +(func $$getClassMetadata__java_lang_Class@jsenum.Main.$LambdaImplementor$5 + (result (ref null $java.lang.Class)) + (block + (if (ref.is_null (global.get $f_$class__jsenum_Main_$LambdaImplementor$5)) + (then + (global.set $f_$class__jsenum_Main_$LambdaImplementor$5 (call $m_createForClass__java_lang_String__java_lang_Class__java_lang_Class@java.lang.Class (call $function.no.side.effects.$getString_|jsenum.Main_...|__java_lang_String (ref.func $$getString_|jsenum.Main_...|__java_lang_String@jsenum.Main.$LambdaImplementor$5) )(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@java.lang.Object) ))) + ) + ) + (return (global.get $f_$class__jsenum_Main_$LambdaImplementor$5)) + ) +) + +;;; Class implements Supplier.$getClassImpl() +(func $$getClassImpl__java_lang_Class@jsenum.Main.$LambdaImplementor$5 + (type $function.$getClassImpl__java_lang_Class) + (param $this.untyped (ref $java.lang.Object)) + (result (ref null $java.lang.Class)) + (local $this (ref null $jsenum.Main.$LambdaImplementor$5)) + (local.set $this (ref.cast (ref $jsenum.Main.$LambdaImplementor$5) (local.get $this.untyped))) + (block + (return (call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.$LambdaImplementor$5) )) + ) +) +(elem declare func $$getClassImpl__java_lang_Class@jsenum.Main.$LambdaImplementor$5) + +;;; String implements Supplier.$getString_|jsenum.Main_...|() +(func $$getString_|jsenum.Main_...|__java_lang_String@jsenum.Main.$LambdaImplementor$5 + (result (ref null $java.lang.String)) + (block + (if (ref.is_null (global.get $f_$string_|jsenum.Main_...|__jsenum_Main_$LambdaImplementor$5)) + (then + (global.set $f_$string_|jsenum.Main_...|__jsenum_Main_$LambdaImplementor$5 (call $m_fromJsString__java_lang_String_NativeString__java_lang_String@java.lang.String (string.const "jsenum.Main$$LambdaImplementor$5"))) + ) + ) + (return (global.get $f_$string_|jsenum.Main_...|__jsenum_Main_$LambdaImplementor$5)) + ) +) + +;;; Code for jsenum.Main.ComparableJsEnum [methods] + +;;; Code for jsenum.Main.IntJsEnum [methods] + +;;; Code for jsenum.Main.StringJsEnum [methods] + +;;; Code for jsenum.Main.NonNullableStringJsEnum [methods] + +;;; Code for jsenum.Main.TemplatedField [methods] + +;;; TemplatedField TemplatedField.$create(T value) +(func $$create__java_lang_Object@jsenum.Main.TemplatedField + (param $value (ref null $java.lang.Object)) + (result (ref null $jsenum.Main.TemplatedField)) + ;;@ jsenum/Main.java:215:4 + (local $$instance (ref null $jsenum.Main.TemplatedField)) + (block + ;;@ jsenum/Main.java:215:4 + (call $$clinit__void@jsenum.Main.TemplatedField ) + ;;@ jsenum/Main.java:215:4 + (local.set $$instance (struct.new $jsenum.Main.TemplatedField (ref.as_non_null (global.get $jsenum.Main.TemplatedField.vtable)) (ref.as_non_null (global.get $itable.empty)) (i32.const 0) (ref.null $java.lang.Object))) + ;;@ jsenum/Main.java:215:4 + (call $$ctor__java_lang_Object__void_$p_jsenum_Main_TemplatedField@jsenum.Main.TemplatedField (ref.as_non_null (local.get $$instance))(local.get $value)) + ;;@ jsenum/Main.java:215:4 + (return (local.get $$instance)) + ) +) + +;;; void TemplatedField.$ctor(T value) +(func $$ctor__java_lang_Object__void_$p_jsenum_Main_TemplatedField@jsenum.Main.TemplatedField + (param $this (ref null $jsenum.Main.TemplatedField)) + (param $value (ref null $java.lang.Object)) + ;;@ jsenum/Main.java:215:4 + (block + ;;@ jsenum/Main.java:215:28 + (call $$ctor__void_$p_java_lang_Object@java.lang.Object (ref.as_non_null (local.get $this))) + ;;@ jsenum/Main.java:216:6 + (struct.set $jsenum.Main.TemplatedField $f_value__jsenum_Main_TemplatedField (local.get $this) (local.get $value)) + ) +) + +;;; T TemplatedField.getValue() +(func $m_getValue__java_lang_Object_$pp_jsenum@jsenum.Main.TemplatedField + (type $function.m_getValue__java_lang_Object_$pp_jsenum) + (param $this.untyped (ref $java.lang.Object)) + (result (ref null $java.lang.Object)) + ;;@ jsenum/Main.java:219:6 + (local $this (ref null $jsenum.Main.TemplatedField)) + (local.set $this (ref.cast (ref $jsenum.Main.TemplatedField) (local.get $this.untyped))) + (block + ;;@ jsenum/Main.java:220:6 + (return (struct.get $jsenum.Main.TemplatedField $f_value__jsenum_Main_TemplatedField (local.get $this))) + ) +) +(elem declare func $m_getValue__java_lang_Object_$pp_jsenum@jsenum.Main.TemplatedField) + +;;; void TemplatedField.$clinit() +(func $$clinit__void@jsenum.Main.TemplatedField + ;;@ jsenum/Main.java:212:23 + (block + ;;@ jsenum/Main.java:212:23 + (if (global.get $f_$initialized__jsenum_Main_TemplatedField) + (then + ;;@ jsenum/Main.java:212:23 + (return ) + ) + ) + ;;@ jsenum/Main.java:212:23 + (global.set $f_$initialized__jsenum_Main_TemplatedField (i32.const 1)) + ;;@ jsenum/Main.java:212:23 + (call $$clinit__void@java.lang.Object ) + ) +) + +;;; Class TemplatedField.$getClassMetadata() +(func $$getClassMetadata__java_lang_Class@jsenum.Main.TemplatedField + (result (ref null $java.lang.Class)) + (block + (if (ref.is_null (global.get $f_$class__jsenum_Main_TemplatedField)) + (then + (global.set $f_$class__jsenum_Main_TemplatedField (call $m_createForClass__java_lang_String__java_lang_Class__java_lang_Class@java.lang.Class (call $function.no.side.effects.$getString_|jsenum.Main_...|__java_lang_String (ref.func $$getString_|jsenum.Main_...|__java_lang_String@jsenum.Main.TemplatedField) )(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@java.lang.Object) ))) + ) + ) + (return (global.get $f_$class__jsenum_Main_TemplatedField)) + ) +) + +;;; Class TemplatedField.$getClassImpl() +(func $$getClassImpl__java_lang_Class@jsenum.Main.TemplatedField + (type $function.$getClassImpl__java_lang_Class) + (param $this.untyped (ref $java.lang.Object)) + (result (ref null $java.lang.Class)) + (local $this (ref null $jsenum.Main.TemplatedField)) + (local.set $this (ref.cast (ref $jsenum.Main.TemplatedField) (local.get $this.untyped))) + (block + (return (call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.TemplatedField) )) + ) +) +(elem declare func $$getClassImpl__java_lang_Class@jsenum.Main.TemplatedField) + +;;; String TemplatedField.$getString_|jsenum.Main_...|() +(func $$getString_|jsenum.Main_...|__java_lang_String@jsenum.Main.TemplatedField + (result (ref null $java.lang.String)) + (block + (if (ref.is_null (global.get $f_$string_|jsenum.Main_...|__jsenum_Main_TemplatedField)) + (then + (global.set $f_$string_|jsenum.Main_...|__jsenum_Main_TemplatedField (call $m_fromJsString__java_lang_String_NativeString__java_lang_String@java.lang.String (string.const "jsenum.Main$TemplatedField"))) + ) + ) + (return (global.get $f_$string_|jsenum.Main_...|__jsenum_Main_TemplatedField)) + ) +) + +;;; Code for jsenum.Main.Foo [methods] + +;;; Foo Foo.$create(Optional c) +(func $$create__java_util_Optional@jsenum.Main.Foo + (param $c (ref null $java.util.Optional)) + (result (ref null $jsenum.Main.Foo)) + ;;@ jsenum/Main.java:233:4 + (local $$instance (ref null $jsenum.Main.Foo)) + (block + ;;@ jsenum/Main.java:233:4 + (call $$clinit__void@jsenum.Main.Foo ) + ;;@ jsenum/Main.java:233:4 + (local.set $$instance (struct.new $jsenum.Main.Foo (ref.as_non_null (global.get $jsenum.Main.Foo.vtable)) (ref.as_non_null (global.get $itable.empty)) (i32.const 0))) + ;;@ jsenum/Main.java:233:4 + (call $$ctor__java_util_Optional__void_$p_jsenum_Main_Foo@jsenum.Main.Foo (ref.as_non_null (local.get $$instance))(local.get $c)) + ;;@ jsenum/Main.java:233:4 + (return (local.get $$instance)) + ) +) + +;;; void Foo.$ctor(Optional c) +(func $$ctor__java_util_Optional__void_$p_jsenum_Main_Foo@jsenum.Main.Foo + (param $this (ref null $jsenum.Main.Foo)) + (param $c (ref null $java.util.Optional)) + ;;@ jsenum/Main.java:233:4 + (block + ;;@ jsenum/Main.java:233:31 + (call $$ctor__void_$p_java_lang_Object@java.lang.Object (ref.as_non_null (local.get $this))) + ) +) + +;;; void Foo.$clinit() +(func $$clinit__void@jsenum.Main.Foo + ;;@ jsenum/Main.java:232:15 + (block + ;;@ jsenum/Main.java:232:15 + (if (global.get $f_$initialized__jsenum_Main_Foo) + (then + ;;@ jsenum/Main.java:232:15 + (return ) + ) + ) + ;;@ jsenum/Main.java:232:15 + (global.set $f_$initialized__jsenum_Main_Foo (i32.const 1)) + ;;@ jsenum/Main.java:232:15 + (call $$clinit__void@java.lang.Object ) + ) +) + +;;; Class Foo.$getClassMetadata() +(func $$getClassMetadata__java_lang_Class@jsenum.Main.Foo + (result (ref null $java.lang.Class)) + (block + (if (ref.is_null (global.get $f_$class__jsenum_Main_Foo)) + (then + (global.set $f_$class__jsenum_Main_Foo (call $m_createForClass__java_lang_String__java_lang_Class__java_lang_Class@java.lang.Class (call $function.no.side.effects.$getString_|jsenum.Main_Foo|__java_lang_String (ref.func $$getString_|jsenum.Main_Foo|__java_lang_String@jsenum.Main.Foo) )(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@java.lang.Object) ))) + ) + ) + (return (global.get $f_$class__jsenum_Main_Foo)) + ) +) + +;;; Class Foo.$getClassImpl() +(func $$getClassImpl__java_lang_Class@jsenum.Main.Foo + (type $function.$getClassImpl__java_lang_Class) + (param $this.untyped (ref $java.lang.Object)) + (result (ref null $java.lang.Class)) + (local $this (ref null $jsenum.Main.Foo)) + (local.set $this (ref.cast (ref $jsenum.Main.Foo) (local.get $this.untyped))) + (block + (return (call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.Foo) )) + ) +) +(elem declare func $$getClassImpl__java_lang_Class@jsenum.Main.Foo) + +;;; String Foo.$getString_|jsenum.Main_Foo|() +(func $$getString_|jsenum.Main_Foo|__java_lang_String@jsenum.Main.Foo + (result (ref null $java.lang.String)) + (block + (if (ref.is_null (global.get $f_$string_|jsenum.Main_Foo|__jsenum_Main_Foo)) + (then + (global.set $f_$string_|jsenum.Main_Foo|__jsenum_Main_Foo (call $m_fromJsString__java_lang_String_NativeString__java_lang_String@java.lang.String (string.const "jsenum.Main$Foo"))) + ) + ) + (return (global.get $f_$string_|jsenum.Main_Foo|__jsenum_Main_Foo)) + ) +) + +;;; Code for jsenum.Main.JsEnumWithRenamedProperties [methods] + +;;; Code for jsenum.Main.SupplierConsumerImpl [methods] + +;;; SupplierConsumerImpl SupplierConsumerImpl.$create() +(func $$create__@jsenum.Main.SupplierConsumerImpl + (result (ref null $jsenum.Main.SupplierConsumerImpl)) + ;;@ jsenum/Main.java:248:15 + (local $$instance (ref null $jsenum.Main.SupplierConsumerImpl)) + (block + ;;@ jsenum/Main.java:248:15 + (call $$clinit__void@jsenum.Main.SupplierConsumerImpl ) + ;;@ jsenum/Main.java:248:15 + (local.set $$instance (struct.new $jsenum.Main.SupplierConsumerImpl (ref.as_non_null (global.get $jsenum.Main.SupplierConsumerImpl.vtable)) (ref.as_non_null (global.get $jsenum.Main.SupplierConsumerImpl.itable)) (i32.const 0))) + ;;@ jsenum/Main.java:248:15 + (call $$ctor__void_$p_jsenum_Main_SupplierConsumerImpl@jsenum.Main.SupplierConsumerImpl (ref.as_non_null (local.get $$instance))) + ;;@ jsenum/Main.java:248:15 + (return (local.get $$instance)) + ) +) + +;;; void SupplierConsumerImpl.$ctor() +(func $$ctor__void_$p_jsenum_Main_SupplierConsumerImpl@jsenum.Main.SupplierConsumerImpl + (param $this (ref null $jsenum.Main.SupplierConsumerImpl)) + ;;@ jsenum/Main.java:248:15 + (block + ;;@ jsenum/Main.java:248:15 + (call $$ctor__void_$p_java_lang_Object@java.lang.Object (ref.as_non_null (local.get $this))) + ) +) + +;;; void SupplierConsumerImpl.accept(T t) +(func $m_accept__java_lang_Object__void@jsenum.Main.SupplierConsumerImpl + (type $function.m_accept__java_lang_Object__void) + (param $this.untyped (ref $java.lang.Object)) + (param $t (ref null $java.lang.Object)) + ;;@ jsenum/Main.java:251:16 + (local $this (ref null $jsenum.Main.SupplierConsumerImpl)) + (local.set $this (ref.cast (ref $jsenum.Main.SupplierConsumerImpl) (local.get $this.untyped))) + (block + ) +) +(elem declare func $m_accept__java_lang_Object__void@jsenum.Main.SupplierConsumerImpl) + +;;; T SupplierConsumerImpl.get() +(func $m_get__java_lang_Object@jsenum.Main.SupplierConsumerImpl + (type $function.m_get__java_lang_Object) + (param $this.untyped (ref $java.lang.Object)) + (result (ref null $java.lang.Object)) + ;;@ jsenum/Main.java:254:13 + (local $this (ref null $jsenum.Main.SupplierConsumerImpl)) + (local.set $this (ref.cast (ref $jsenum.Main.SupplierConsumerImpl) (local.get $this.untyped))) + (block + ;;@ jsenum/Main.java:255:6 + (return (ref.null $java.lang.Object)) + ) +) +(elem declare func $m_get__java_lang_Object@jsenum.Main.SupplierConsumerImpl) + +;;; void SupplierConsumerImpl.$clinit() +(func $$clinit__void@jsenum.Main.SupplierConsumerImpl + ;;@ jsenum/Main.java:248:15 + (block + ;;@ jsenum/Main.java:248:15 + (if (global.get $f_$initialized__jsenum_Main_SupplierConsumerImpl) + (then + ;;@ jsenum/Main.java:248:15 + (return ) + ) + ) + ;;@ jsenum/Main.java:248:15 + (global.set $f_$initialized__jsenum_Main_SupplierConsumerImpl (i32.const 1)) + ;;@ jsenum/Main.java:248:15 + (call $$clinit__void@java.lang.Object ) + ) +) + +;;; Class SupplierConsumerImpl.$getClassMetadata() +(func $$getClassMetadata__java_lang_Class@jsenum.Main.SupplierConsumerImpl + (result (ref null $java.lang.Class)) + (block + (if (ref.is_null (global.get $f_$class__jsenum_Main_SupplierConsumerImpl)) + (then + (global.set $f_$class__jsenum_Main_SupplierConsumerImpl (call $m_createForClass__java_lang_String__java_lang_Class__java_lang_Class@java.lang.Class (call $function.no.side.effects.$getString_|jsenum.Main_...|__java_lang_String (ref.func $$getString_|jsenum.Main_...|__java_lang_String@jsenum.Main.SupplierConsumerImpl) )(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@java.lang.Object) ))) + ) + ) + (return (global.get $f_$class__jsenum_Main_SupplierConsumerImpl)) + ) +) + +;;; Class SupplierConsumerImpl.$getClassImpl() +(func $$getClassImpl__java_lang_Class@jsenum.Main.SupplierConsumerImpl + (type $function.$getClassImpl__java_lang_Class) + (param $this.untyped (ref $java.lang.Object)) + (result (ref null $java.lang.Class)) + (local $this (ref null $jsenum.Main.SupplierConsumerImpl)) + (local.set $this (ref.cast (ref $jsenum.Main.SupplierConsumerImpl) (local.get $this.untyped))) + (block + (return (call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.SupplierConsumerImpl) )) + ) +) +(elem declare func $$getClassImpl__java_lang_Class@jsenum.Main.SupplierConsumerImpl) + +;;; String SupplierConsumerImpl.$getString_|jsenum.Main_...|() +(func $$getString_|jsenum.Main_...|__java_lang_String@jsenum.Main.SupplierConsumerImpl + (result (ref null $java.lang.String)) + (block + (if (ref.is_null (global.get $f_$string_|jsenum.Main_...|__jsenum_Main_SupplierConsumerImpl)) + (then + (global.set $f_$string_|jsenum.Main_...|__jsenum_Main_SupplierConsumerImpl (call $m_fromJsString__java_lang_String_NativeString__java_lang_String@java.lang.String (string.const "jsenum.Main$SupplierConsumerImpl"))) + ) + ) + (return (global.get $f_$string_|jsenum.Main_...|__jsenum_Main_SupplierConsumerImpl)) + ) +) + +;;; Code for jsenum.Main.NativeStringEnum [methods] + +;;; NativeStringEnum NativeStringEnum.$create(String $name, int $ordinal) +(func $$create__java_lang_String__int@jsenum.Main.NativeStringEnum + (param $$name (ref null $java.lang.String)) + (param $$ordinal i32) + (result (ref null $jsenum.Main.NativeStringEnum)) + ;;@ jsenum/Main.java:96:7 + (local $$instance (ref null $jsenum.Main.NativeStringEnum)) + (block + ;;@ jsenum/Main.java:96:7 + (local.set $$instance (struct.new $jsenum.Main.NativeStringEnum (ref.as_non_null (global.get $jsenum.Main.NativeStringEnum.vtable)) (ref.as_non_null (global.get $jsenum.Main.NativeStringEnum.itable)) (i32.const 0) (ref.null $java.lang.String) (i32.const 0))) + ;;@ jsenum/Main.java:96:7 + (call $$ctor__java_lang_String__int__void_$p_jsenum_Main_NativeStringEnum@jsenum.Main.NativeStringEnum (ref.as_non_null (local.get $$instance))(local.get $$name)(local.get $$ordinal)) + ;;@ jsenum/Main.java:96:7 + (return (local.get $$instance)) + ) +) + +;;; void NativeStringEnum.$ctor(String $name, int $ordinal) +(func $$ctor__java_lang_String__int__void_$p_jsenum_Main_NativeStringEnum@jsenum.Main.NativeStringEnum + (param $this (ref null $jsenum.Main.NativeStringEnum)) + (param $$name (ref null $java.lang.String)) + (param $$ordinal i32) + ;;@ jsenum/Main.java:96:7 + (block + ;;@ jsenum/Main.java:96:7 + (struct.set $java.lang.Enum $f_name__java_lang_Enum_ (local.get $this) (local.get $$name)) + ;;@ jsenum/Main.java:96:7 + (struct.set $java.lang.Enum $f_ordinal__java_lang_Enum_ (local.get $this) (local.get $$ordinal)) + ;;@ jsenum/Main.java:96:7 + (call $$ctor__java_lang_String__int__void_$p_java_lang_Enum@java.lang.Enum (ref.as_non_null (local.get $this))(local.get $$name)(local.get $$ordinal)) + ) +) + +;;; NativeStringEnum NativeStringEnum.valueOf(String name) +(func $m_valueOf__java_lang_String__jsenum_Main_NativeStringEnum@jsenum.Main.NativeStringEnum + (param $name (ref null $java.lang.String)) + (result (ref null $jsenum.Main.NativeStringEnum)) + ;;@ jsenum/Main.java:96:7 + (block + ;;@ jsenum/Main.java:96:7 + (call $$clinit__void@jsenum.Main.NativeStringEnum ) + ;;@ jsenum/Main.java:96:7 + (if (ref.is_null (global.get $f_namesToValuesMap__jsenum_Main_NativeStringEnum_)) + (then + (block + ;;@ jsenum/Main.java:96:7 + (global.set $f_namesToValuesMap__jsenum_Main_NativeStringEnum_ (call $m_createMapFromValues__arrayOf_java_lang_Enum__java_util_Map@javaemul.internal.Enums (call $m_values__arrayOf_jsenum_Main_NativeStringEnum@jsenum.Main.NativeStringEnum ))) + ) + ) + ) + ;;@ jsenum/Main.java:96:7 + (return (ref.cast (ref null $jsenum.Main.NativeStringEnum) (call $m_getValueFromNameAndMap__java_lang_String__java_util_Map__java_lang_Object@javaemul.internal.Enums (local.get $name)(global.get $f_namesToValuesMap__jsenum_Main_NativeStringEnum_)))) + ) +) + +;;; NativeStringEnum[] NativeStringEnum.values() +(func $m_values__arrayOf_jsenum_Main_NativeStringEnum@jsenum.Main.NativeStringEnum + (result (ref null $javaemul.internal.WasmArray.OfObject)) + ;;@ jsenum/Main.java:96:7 + (block + ;;@ jsenum/Main.java:96:7 + (call $$clinit__void@jsenum.Main.NativeStringEnum ) + ;;@ jsenum/Main.java:96:7 + (return (call $m_newWithLiteral__arrayOf_java_lang_Object__javaemul_internal_WasmArray_OfObject@javaemul.internal.WasmArray.OfObject (array.new_fixed $java.lang.Object.array (global.get $f_ONE__jsenum_Main_NativeStringEnum)(global.get $f_THREE__jsenum_Main_NativeStringEnum)))) + ) +) + +;;; void NativeStringEnum.$clinit() +(func $$clinit__void@jsenum.Main.NativeStringEnum + ;;@ jsenum/Main.java:96:7 + (block + ;;@ jsenum/Main.java:96:7 + (if (global.get $f_$initialized__jsenum_Main_NativeStringEnum) + (then + ;;@ jsenum/Main.java:96:7 + (return ) + ) + ) + ;;@ jsenum/Main.java:96:7 + (global.set $f_$initialized__jsenum_Main_NativeStringEnum (i32.const 1)) + ;;@ jsenum/Main.java:96:7 + (call $$clinit__void@java.lang.Enum ) + ;;@ jsenum/Main.java:97:4 + (global.set $f_ONE__jsenum_Main_NativeStringEnum (call $$create__java_lang_String__int@jsenum.Main.NativeStringEnum (call $function.no.side.effects.$getString_|ONE|__java_lang_String (ref.func $$getString_|ONE|__java_lang_String@jsenum.Main) )(i32.const 0))) + ;;@ jsenum/Main.java:98:4 + (global.set $f_THREE__jsenum_Main_NativeStringEnum (call $$create__java_lang_String__int@jsenum.Main.NativeStringEnum (call $function.no.side.effects.$getString_|THREE|__java_lang_String (ref.func $$getString_|THREE|__java_lang_String@jsenum.Main) )(i32.const 1))) + ) +) + +;;; Class NativeStringEnum.$getClassMetadata() +(func $$getClassMetadata__java_lang_Class@jsenum.Main.NativeStringEnum + (result (ref null $java.lang.Class)) + (block + (if (ref.is_null (global.get $f_$class__jsenum_Main_NativeStringEnum)) + (then + (global.set $f_$class__jsenum_Main_NativeStringEnum (call $m_createForEnum__java_lang_String__java_lang_Class@java.lang.Class (call $function.no.side.effects.$getString_|jsenum.Main_...|__java_lang_String (ref.func $$getString_|jsenum.Main_...|__java_lang_String@jsenum.Main.NativeStringEnum) ))) + ) + ) + (return (global.get $f_$class__jsenum_Main_NativeStringEnum)) + ) +) + +;;; Class NativeStringEnum.$getClassImpl() +(func $$getClassImpl__java_lang_Class@jsenum.Main.NativeStringEnum + (type $function.$getClassImpl__java_lang_Class) + (param $this.untyped (ref $java.lang.Object)) + (result (ref null $java.lang.Class)) + (local $this (ref null $jsenum.Main.NativeStringEnum)) + (local.set $this (ref.cast (ref $jsenum.Main.NativeStringEnum) (local.get $this.untyped))) + (block + (return (call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.NativeStringEnum) )) + ) +) +(elem declare func $$getClassImpl__java_lang_Class@jsenum.Main.NativeStringEnum) + +;;; String NativeStringEnum.$getString_|jsenum.Main_...|() +(func $$getString_|jsenum.Main_...|__java_lang_String@jsenum.Main.NativeStringEnum + (result (ref null $java.lang.String)) + (block + (if (ref.is_null (global.get $f_$string_|jsenum.Main_...|__jsenum_Main_NativeStringEnum)) + (then + (global.set $f_$string_|jsenum.Main_...|__jsenum_Main_NativeStringEnum (call $m_fromJsString__java_lang_String_NativeString__java_lang_String@java.lang.String (string.const "jsenum.Main$NativeStringEnum"))) + ) + ) + (return (global.get $f_$string_|jsenum.Main_...|__jsenum_Main_NativeStringEnum)) + ) +) + +;;; Code for jsenum.Main.ComparableJsEnumSupplierConsumerImpl [methods] + +;;; ComparableJsEnumSupplierConsumerImpl ComparableJsEnumSupplierConsumerImpl.$create() +(func $$create__@jsenum.Main.ComparableJsEnumSupplierConsumerImpl + (result (ref null $jsenum.Main.ComparableJsEnumSupplierConsumerImpl)) + ;;@ jsenum/Main.java:267:15 + (local $$instance (ref null $jsenum.Main.ComparableJsEnumSupplierConsumerImpl)) + (block + ;;@ jsenum/Main.java:267:15 + (call $$clinit__void@jsenum.Main.ComparableJsEnumSupplierConsumerImpl ) + ;;@ jsenum/Main.java:267:15 + (local.set $$instance (struct.new $jsenum.Main.ComparableJsEnumSupplierConsumerImpl (ref.as_non_null (global.get $jsenum.Main.ComparableJsEnumSupplierConsumerImpl.vtable)) (ref.as_non_null (global.get $jsenum.Main.ComparableJsEnumSupplierConsumerImpl.itable)) (i32.const 0))) + ;;@ jsenum/Main.java:267:15 + (call $$ctor__void_$p_jsenum_Main_ComparableJsEnumSupplierConsumerImpl@jsenum.Main.ComparableJsEnumSupplierConsumerImpl (ref.as_non_null (local.get $$instance))) + ;;@ jsenum/Main.java:267:15 + (return (local.get $$instance)) + ) +) + +;;; void ComparableJsEnumSupplierConsumerImpl.$ctor() +(func $$ctor__void_$p_jsenum_Main_ComparableJsEnumSupplierConsumerImpl@jsenum.Main.ComparableJsEnumSupplierConsumerImpl + (param $this (ref null $jsenum.Main.ComparableJsEnumSupplierConsumerImpl)) + ;;@ jsenum/Main.java:267:15 + (block + ;;@ jsenum/Main.java:267:15 + (call $$ctor__void_$p_jsenum_Main_SupplierConsumerImpl@jsenum.Main.SupplierConsumerImpl (ref.as_non_null (local.get $this))) + ) +) + +;;; void ComparableJsEnumSupplierConsumerImpl.accept(ComparableJsEnum arg0) +(func $m_accept__jsenum_Main_ComparableJsEnum__void@jsenum.Main.ComparableJsEnumSupplierConsumerImpl + (type $function.m_accept__jsenum_Main_ComparableJsEnum__void) + (param $this.untyped (ref $java.lang.Object)) + (param $arg0 i32) + ;;@ jsenum/Main.java:267:15 + (local $this (ref null $jsenum.Main.ComparableJsEnumSupplierConsumerImpl)) + (local.set $this (ref.cast (ref $jsenum.Main.ComparableJsEnumSupplierConsumerImpl) (local.get $this.untyped))) + (block + ;;@ jsenum/Main.java:267:15 + (call $m_accept__java_lang_Object__void@jsenum.Main.SupplierConsumerImpl (ref.as_non_null (local.get $this))(call $m_boxComparableInteger__int__java_lang_Class__javaemul_internal_Enums_BoxedComparableIntegerEnum@javaemul.internal.Enums (local.get $arg0)(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.ComparableJsEnum.$Overlay) ))) + ) +) +(elem declare func $m_accept__jsenum_Main_ComparableJsEnum__void@jsenum.Main.ComparableJsEnumSupplierConsumerImpl) + +;;; ComparableJsEnum ComparableJsEnumSupplierConsumerImpl.get() +(func $m_get__jsenum_Main_ComparableJsEnum@jsenum.Main.ComparableJsEnumSupplierConsumerImpl + (type $function.m_get__jsenum_Main_ComparableJsEnum) + (param $this.untyped (ref $java.lang.Object)) + (result i32) + ;;@ jsenum/Main.java:267:15 + (local $this (ref null $jsenum.Main.ComparableJsEnumSupplierConsumerImpl)) + (local.set $this (ref.cast (ref $jsenum.Main.ComparableJsEnumSupplierConsumerImpl) (local.get $this.untyped))) + (block + ;;@ jsenum/Main.java:267:15 + (return (call $m_unboxInteger__java_lang_Object__java_lang_Class__int@javaemul.internal.Enums (call_ref $function.m_get__java_lang_Object (ref.as_non_null (local.get $this))(struct.get $jsenum.Main.SupplierConsumerImpl.vtable $m_get__java_lang_Object (struct.get $jsenum.Main.SupplierConsumerImpl $vtable(local.get $this))))(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.ComparableJsEnum.$Overlay) ))) + ) +) +(elem declare func $m_get__jsenum_Main_ComparableJsEnum@jsenum.Main.ComparableJsEnumSupplierConsumerImpl) + +;;; void ComparableJsEnumSupplierConsumerImpl.$clinit() +(func $$clinit__void@jsenum.Main.ComparableJsEnumSupplierConsumerImpl + ;;@ jsenum/Main.java:267:15 + (block + ;;@ jsenum/Main.java:267:15 + (if (global.get $f_$initialized__jsenum_Main_ComparableJsEnumSupplierConsumerImpl) + (then + ;;@ jsenum/Main.java:267:15 + (return ) + ) + ) + ;;@ jsenum/Main.java:267:15 + (global.set $f_$initialized__jsenum_Main_ComparableJsEnumSupplierConsumerImpl (i32.const 1)) + ;;@ jsenum/Main.java:267:15 + (call $$clinit__void@jsenum.Main.SupplierConsumerImpl ) + ) +) + +;;; Class ComparableJsEnumSupplierConsumerImpl.$getClassMetadata() +(func $$getClassMetadata__java_lang_Class@jsenum.Main.ComparableJsEnumSupplierConsumerImpl + (result (ref null $java.lang.Class)) + (block + (if (ref.is_null (global.get $f_$class__jsenum_Main_ComparableJsEnumSupplierConsumerImpl)) + (then + (global.set $f_$class__jsenum_Main_ComparableJsEnumSupplierConsumerImpl (call $m_createForClass__java_lang_String__java_lang_Class__java_lang_Class@java.lang.Class (call $function.no.side.effects.$getString_|jsenum.Main_...|__java_lang_String (ref.func $$getString_|jsenum.Main_...|__java_lang_String@jsenum.Main.ComparableJsEnumSupplierConsumerImpl) )(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.SupplierConsumerImpl) ))) + ) + ) + (return (global.get $f_$class__jsenum_Main_ComparableJsEnumSupplierConsumerImpl)) + ) +) + +;;; Class ComparableJsEnumSupplierConsumerImpl.$getClassImpl() +(func $$getClassImpl__java_lang_Class@jsenum.Main.ComparableJsEnumSupplierConsumerImpl + (type $function.$getClassImpl__java_lang_Class) + (param $this.untyped (ref $java.lang.Object)) + (result (ref null $java.lang.Class)) + (local $this (ref null $jsenum.Main.ComparableJsEnumSupplierConsumerImpl)) + (local.set $this (ref.cast (ref $jsenum.Main.ComparableJsEnumSupplierConsumerImpl) (local.get $this.untyped))) + (block + (return (call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.ComparableJsEnumSupplierConsumerImpl) )) + ) +) +(elem declare func $$getClassImpl__java_lang_Class@jsenum.Main.ComparableJsEnumSupplierConsumerImpl) + +;;; String ComparableJsEnumSupplierConsumerImpl.$getString_|jsenum.Main_...|() +(func $$getString_|jsenum.Main_...|__java_lang_String@jsenum.Main.ComparableJsEnumSupplierConsumerImpl + (result (ref null $java.lang.String)) + (block + (if (ref.is_null (global.get $f_$string_|jsenum.Main_...|__jsenum_Main_ComparableJsEnumSupplierConsumerImpl)) + (then + (global.set $f_$string_|jsenum.Main_...|__jsenum_Main_ComparableJsEnumSupplierConsumerImpl (call $m_fromJsString__java_lang_String_NativeString__java_lang_String@java.lang.String (string.const "jsenum.Main$ComparableJsEnumSupplierConsumerImpl"))) + ) + ) + (return (global.get $f_$string_|jsenum.Main_...|__jsenum_Main_ComparableJsEnumSupplierConsumerImpl)) + ) +) + +;;; Code for jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides [methods] + +;;; ComparableJsEnumSupplierConsumerImplWithOverrides ComparableJsEnumSupplierConsumerImplWithOverrides.$create() +(func $$create__@jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides + (result (ref null $jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides)) + ;;@ jsenum/Main.java:270:15 + (local $$instance (ref null $jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides)) + (block + ;;@ jsenum/Main.java:270:15 + (call $$clinit__void@jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides ) + ;;@ jsenum/Main.java:270:15 + (local.set $$instance (struct.new $jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides (ref.as_non_null (global.get $jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides.vtable)) (ref.as_non_null (global.get $jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides.itable)) (i32.const 0))) + ;;@ jsenum/Main.java:270:15 + (call $$ctor__void_$p_jsenum_Main_ComparableJsEnumSupplierConsumerImplWithOverrides@jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides (ref.as_non_null (local.get $$instance))) + ;;@ jsenum/Main.java:270:15 + (return (local.get $$instance)) + ) +) + +;;; void ComparableJsEnumSupplierConsumerImplWithOverrides.$ctor() +(func $$ctor__void_$p_jsenum_Main_ComparableJsEnumSupplierConsumerImplWithOverrides@jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides + (param $this (ref null $jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides)) + ;;@ jsenum/Main.java:270:15 + (block + ;;@ jsenum/Main.java:270:15 + (call $$ctor__void_$p_jsenum_Main_SupplierConsumerImpl@jsenum.Main.SupplierConsumerImpl (ref.as_non_null (local.get $this))) + ) +) + +;;; void ComparableJsEnumSupplierConsumerImplWithOverrides.accept(ComparableJsEnum t) +(func $m_accept__jsenum_Main_ComparableJsEnum__void@jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides + (type $function.m_accept__jsenum_Main_ComparableJsEnum__void) + (param $this.untyped (ref $java.lang.Object)) + (param $t i32) + ;;@ jsenum/Main.java:273:16 + (local $this (ref null $jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides)) + (local.set $this (ref.cast (ref $jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides) (local.get $this.untyped))) + (block + ) +) +(elem declare func $m_accept__jsenum_Main_ComparableJsEnum__void@jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides) + +;;; ComparableJsEnum ComparableJsEnumSupplierConsumerImplWithOverrides.get() +(func $m_get__jsenum_Main_ComparableJsEnum@jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides + (type $function.m_get__jsenum_Main_ComparableJsEnum) + (param $this.untyped (ref $java.lang.Object)) + (result i32) + ;;@ jsenum/Main.java:276:28 + (local $this (ref null $jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides)) + (local.set $this (ref.cast (ref $jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides) (local.get $this.untyped))) + (block + ;;@ jsenum/Main.java:277:6 + (return (call $m_unboxInteger__java_lang_Object__java_lang_Class__int@javaemul.internal.Enums (ref.null $java.lang.Object)(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.ComparableJsEnum.$Overlay) ))) + ) +) +(elem declare func $m_get__jsenum_Main_ComparableJsEnum@jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides) + +;;; BoxedComparableIntegerEnum ComparableJsEnumSupplierConsumerImplWithOverrides.get() +(func $m_get__java_lang_Object@jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides + (type $function.m_get__java_lang_Object) + (param $this.untyped (ref $java.lang.Object)) + (result (ref null $java.lang.Object)) + ;;@ jsenum/Main.java:270:15 + (local $this (ref null $jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides)) + (local.set $this (ref.cast (ref $jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides) (local.get $this.untyped))) + (block + ;;@ jsenum/Main.java:270:15 + (return (call $m_boxComparableInteger__int__java_lang_Class__javaemul_internal_Enums_BoxedComparableIntegerEnum@javaemul.internal.Enums (call_ref $function.m_get__jsenum_Main_ComparableJsEnum (ref.as_non_null (local.get $this))(struct.get $jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides.vtable $m_get__jsenum_Main_ComparableJsEnum (struct.get $jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides $vtable(local.get $this))))(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.ComparableJsEnum.$Overlay) ))) + ) +) +(elem declare func $m_get__java_lang_Object@jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides) + +;;; void ComparableJsEnumSupplierConsumerImplWithOverrides.accept(T arg0) +(func $m_accept__java_lang_Object__void@jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides + (type $function.m_accept__java_lang_Object__void) + (param $this.untyped (ref $java.lang.Object)) + (param $arg0 (ref null $java.lang.Object)) + ;;@ jsenum/Main.java:270:15 + (local $this (ref null $jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides)) + (local.set $this (ref.cast (ref $jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides) (local.get $this.untyped))) + (block + ;;@ jsenum/Main.java:270:15 + (call_ref $function.m_accept__jsenum_Main_ComparableJsEnum__void (ref.as_non_null (local.get $this))(call $m_unboxInteger__java_lang_Object__java_lang_Class__int@javaemul.internal.Enums (local.get $arg0)(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.ComparableJsEnum.$Overlay) ))(struct.get $jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides.vtable $m_accept__jsenum_Main_ComparableJsEnum__void (struct.get $jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides $vtable(local.get $this)))) + ) +) +(elem declare func $m_accept__java_lang_Object__void@jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides) + +;;; void ComparableJsEnumSupplierConsumerImplWithOverrides.$clinit() +(func $$clinit__void@jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides + ;;@ jsenum/Main.java:270:15 + (block + ;;@ jsenum/Main.java:270:15 + (if (global.get $f_$initialized__jsenum_Main_ComparableJsEnumSupplierConsumerImplWithOverrides) + (then + ;;@ jsenum/Main.java:270:15 + (return ) + ) + ) + ;;@ jsenum/Main.java:270:15 + (global.set $f_$initialized__jsenum_Main_ComparableJsEnumSupplierConsumerImplWithOverrides (i32.const 1)) + ;;@ jsenum/Main.java:270:15 + (call $$clinit__void@jsenum.Main.SupplierConsumerImpl ) + ) +) + +;;; Class ComparableJsEnumSupplierConsumerImplWithOverrides.$getClassMetadata() +(func $$getClassMetadata__java_lang_Class@jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides + (result (ref null $java.lang.Class)) + (block + (if (ref.is_null (global.get $f_$class__jsenum_Main_ComparableJsEnumSupplierConsumerImplWithOverrides)) + (then + (global.set $f_$class__jsenum_Main_ComparableJsEnumSupplierConsumerImplWithOverrides (call $m_createForClass__java_lang_String__java_lang_Class__java_lang_Class@java.lang.Class (call $function.no.side.effects.$getString_|jsenum.Main_...|__java_lang_String (ref.func $$getString_|jsenum.Main_...|__java_lang_String@jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides) )(call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.SupplierConsumerImpl) ))) + ) + ) + (return (global.get $f_$class__jsenum_Main_ComparableJsEnumSupplierConsumerImplWithOverrides)) + ) +) + +;;; Class ComparableJsEnumSupplierConsumerImplWithOverrides.$getClassImpl() +(func $$getClassImpl__java_lang_Class@jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides + (type $function.$getClassImpl__java_lang_Class) + (param $this.untyped (ref $java.lang.Object)) + (result (ref null $java.lang.Class)) + (local $this (ref null $jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides)) + (local.set $this (ref.cast (ref $jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides) (local.get $this.untyped))) + (block + (return (call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides) )) + ) +) +(elem declare func $$getClassImpl__java_lang_Class@jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides) + +;;; String ComparableJsEnumSupplierConsumerImplWithOverrides.$getString_|jsenum.Main_...|() +(func $$getString_|jsenum.Main_...|__java_lang_String@jsenum.Main.ComparableJsEnumSupplierConsumerImplWithOverrides + (result (ref null $java.lang.String)) + (block + (if (ref.is_null (global.get $f_$string_|jsenum.Main_...|__jsenum_Main_ComparableJsEnumSupplierConsumerImplWithOverrides)) + (then + (global.set $f_$string_|jsenum.Main_...|__jsenum_Main_ComparableJsEnumSupplierConsumerImplWithOverrides (call $m_fromJsString__java_lang_String_NativeString__java_lang_String@java.lang.String (string.const "jsenum.Main$ComparableJsEnumSupplierConsumerImplWithOverrides"))) + ) + ) + (return (global.get $f_$string_|jsenum.Main_...|__jsenum_Main_ComparableJsEnumSupplierConsumerImplWithOverrides)) + ) +) diff --git a/transpiler/javatests/com/google/j2cl/readable/java/libraryinfo/output_wasm/module.wat.txt b/transpiler/javatests/com/google/j2cl/readable/java/libraryinfo/output_wasm/module.wat.txt index 420e8fd15e..fb4e3c0eff 100644 --- a/transpiler/javatests/com/google/j2cl/readable/java/libraryinfo/output_wasm/module.wat.txt +++ b/transpiler/javatests/com/google/j2cl/readable/java/libraryinfo/output_wasm/module.wat.txt @@ -23,6 +23,17 @@ )) ) + ;;; Code for libraryinfo.Main.MyJsEnum.$Overlay [type definition] + (type $libraryinfo.Main.MyJsEnum.$Overlay (sub (struct + (field $vtable (ref $libraryinfo.Main.MyJsEnum.$Overlay.vtable)) + (field $itable (ref $itable)) + )) + ) + (type $libraryinfo.Main.MyJsEnum.$Overlay.vtable (sub (struct + (field $$getClassImpl__java_lang_Class (ref $function.$getClassImpl__java_lang_Class)) + )) + ) + ;;; Code for libraryinfo.Main [type definition] (type $libraryinfo.Main (sub $java.lang.Object (struct (field $vtable (ref $libraryinfo.Main.vtable)) @@ -108,6 +119,8 @@ (field $slot6 (ref null struct)) ))) + ;;; Code for libraryinfo.Main.MyJsEnum [type definition] + ;;; Code for libraryinfo.Main.MyJsType [type definition] (type $libraryinfo.Main.MyJsType (sub $java.lang.Object (struct (field $vtable (ref $libraryinfo.Main.MyJsType.vtable)) @@ -143,38 +156,6 @@ )) ) - ;;; Code for libraryinfo.Main.MyJsEnum [type definition] - (type $libraryinfo.Main.MyJsEnum (sub $java.lang.Enum (struct - (field $vtable (ref $libraryinfo.Main.MyJsEnum.vtable)) - (field $itable (ref $libraryinfo.Main.MyJsEnum.itable)) - (field $f_$systemIdentityHashCode__java_lang_Object (mut i32)) - (field $f_name__java_lang_Enum_ (mut (ref null $java.lang.String))) - (field $f_ordinal__java_lang_Enum_ (mut i32)) - )) - ) - (type $libraryinfo.Main.MyJsEnum.vtable (sub $java.lang.Enum.vtable (struct - (field $$getClassImpl__java_lang_Class (ref $function.$getClassImpl__java_lang_Class)) - (field $m_equals__java_lang_Object__boolean (ref $function.m_equals__java_lang_Object__boolean)) - (field $m_getClass__java_lang_Class (ref $function.m_getClass__java_lang_Class)) - (field $m_hashCode__int (ref $function.m_hashCode__int)) - (field $m_toString__java_lang_String (ref $function.m_toString__java_lang_String)) - (field $m_compareTo__java_lang_Object__int (ref $function.m_compareTo__java_lang_Object__int)) - (field $m_compareTo__java_lang_Enum__int (ref $function.m_compareTo__java_lang_Enum__int)) - (field $m_getDeclaringClass__java_lang_Class (ref $function.m_getDeclaringClass__java_lang_Class)) - (field $m_name__java_lang_String (ref $function.m_name__java_lang_String)) - (field $m_ordinal__int (ref $function.m_ordinal__int)) - )) - ) - (type $libraryinfo.Main.MyJsEnum.itable (sub $java.lang.Enum.itable (struct - (field $slot0 (ref $java.io.Serializable.vtable)) - (field $slot1 (ref $java.lang.Comparable.vtable)) - (field $slot2 (ref null struct)) - (field $slot3 (ref null struct)) - (field $slot4 (ref null struct)) - (field $slot5 (ref null struct)) - (field $slot6 (ref null struct)) - ))) - ;;; Code for libraryinfo.Main.MyEnum [type definition] (type $libraryinfo.Main.MyEnum (sub $java.lang.Enum (struct (field $vtable (ref $libraryinfo.Main.MyEnum.vtable)) @@ -292,45 +273,6 @@ ) ) -;;; Code for libraryinfo.Main.MyJsEnum [vtable.init] -(global $libraryinfo.Main.MyJsEnum.vtable (ref $libraryinfo.Main.MyJsEnum.vtable) - (struct.new $libraryinfo.Main.MyJsEnum.vtable - (ref.func $$getClassImpl__java_lang_Class@libraryinfo.Main.MyJsEnum) - (ref.func $m_equals__java_lang_Object__boolean@java.lang.Enum) - (ref.func $m_getClass__java_lang_Class@java.lang.Object) - (ref.func $m_hashCode__int@java.lang.Enum) - (ref.func $m_toString__java_lang_String@java.lang.Enum) - (ref.func $m_compareTo__java_lang_Object__int@java.lang.Enum) - (ref.func $m_compareTo__java_lang_Enum__int@java.lang.Enum) - (ref.func $m_getDeclaringClass__java_lang_Class@java.lang.Enum) - (ref.func $m_name__java_lang_String@java.lang.Enum) - (ref.func $m_ordinal__int@java.lang.Enum) - ) -) - -;;; Code for libraryinfo.Main.MyJsEnum [itable.init] - -(global $java.io.Serializable.vtable@$libraryinfo.Main.MyJsEnum (ref $java.io.Serializable.vtable) - (struct.new $java.io.Serializable.vtable - ) -) -(global $java.lang.Comparable.vtable@$libraryinfo.Main.MyJsEnum (ref $java.lang.Comparable.vtable) - (struct.new $java.lang.Comparable.vtable - (ref.func $m_compareTo__java_lang_Object__int@java.lang.Enum) - ) -) -(global $libraryinfo.Main.MyJsEnum.itable (ref $libraryinfo.Main.MyJsEnum.itable) - (struct.new $libraryinfo.Main.MyJsEnum.itable - (global.get $java.io.Serializable.vtable@$libraryinfo.Main.MyJsEnum) - (global.get $java.lang.Comparable.vtable@$libraryinfo.Main.MyJsEnum) - (ref.null struct) - (ref.null struct) - (ref.null struct) - (ref.null struct) - (ref.null struct) - ) -) - ;;; Code for libraryinfo.Main.MyEnum [vtable.init] (global $libraryinfo.Main.MyEnum.vtable (ref $libraryinfo.Main.MyEnum.vtable) (struct.new $libraryinfo.Main.MyEnum.vtable @@ -393,6 +335,13 @@ ) ) +;;; Code for libraryinfo.Main.MyJsEnum.$Overlay [vtable.init] +(global $libraryinfo.Main.MyJsEnum.$Overlay.vtable (ref $libraryinfo.Main.MyJsEnum.$Overlay.vtable) + (struct.new $libraryinfo.Main.MyJsEnum.$Overlay.vtable + (ref.func $$getClassImpl__java_lang_Class@libraryinfo.Main.MyJsEnum.$Overlay) + ) +) + ;;; Code for libraryinfo.Main [static fields] (global $f_STATIC_FIELD__libraryinfo_Main (mut (ref null $java.lang.String)) (ref.null $java.lang.String) @@ -490,32 +439,6 @@ (ref.null $java.lang.String) ) -;;; Code for libraryinfo.Main.MyJsEnum [static fields] -(global $f_A__libraryinfo_Main_MyJsEnum (mut (ref null $libraryinfo.Main.MyJsEnum)) - (ref.null $libraryinfo.Main.MyJsEnum) -) -(global $f_B__libraryinfo_Main_MyJsEnum (mut (ref null $libraryinfo.Main.MyJsEnum)) - (ref.null $libraryinfo.Main.MyJsEnum) -) -(global $f_C__libraryinfo_Main_MyJsEnum (mut (ref null $libraryinfo.Main.MyJsEnum)) - (ref.null $libraryinfo.Main.MyJsEnum) -) -(global $f_namesToValuesMap__libraryinfo_Main_MyJsEnum_ (mut (ref null $java.lang.Object)) - (ref.null $java.lang.Object) -) -(global $f_$initialized__libraryinfo_Main_MyJsEnum (mut i32) - (i32.const 0) -) -(global $f_$class__libraryinfo_Main_MyJsEnum (mut (ref null $java.lang.Class)) - (ref.null $java.lang.Class) -) -(global $f_$string_|A|__libraryinfo_Main_MyJsEnum (mut (ref null $java.lang.String)) - (ref.null $java.lang.String) -) -(global $f_$string_|libraryinfo....|__libraryinfo_Main_MyJsEnum (mut (ref null $java.lang.String)) - (ref.null $java.lang.String) -) - ;;; Code for libraryinfo.Main.MyEnum [static fields] (global $f_FOO__libraryinfo_Main_MyEnum (mut (ref null $libraryinfo.Main.MyEnum)) (ref.null $libraryinfo.Main.MyEnum) @@ -564,6 +487,17 @@ (ref.null $java.lang.String) ) +;;; Code for libraryinfo.Main.MyJsEnum.$Overlay [static fields] +(global $f_$initialized__libraryinfo_Main_MyJsEnum_$Overlay (mut i32) + (i32.const 0) +) +(global $f_$class__libraryinfo_Main_MyJsEnum_$Overlay (mut (ref null $java.lang.Class)) + (ref.null $java.lang.Class) +) +(global $f_$string_|libraryinfo....|__libraryinfo_Main_MyJsEnum_$Overlay (mut (ref null $java.lang.String)) + (ref.null $java.lang.String) +) + ;;; Code for libraryinfo.Main.JsTypeInterface [methods] ;;; void JsTypeInterface.$clinit() @@ -740,6 +674,63 @@ ) ) +;;; Code for libraryinfo.Main.MyJsEnum.$Overlay [methods] + +;;; void $Overlay.$clinit() +(func $$clinit__void@libraryinfo.Main.MyJsEnum.$Overlay + ;;@ libraryinfo/Main.java:59:7 + (block + ;;@ libraryinfo/Main.java:59:7 + (if (global.get $f_$initialized__libraryinfo_Main_MyJsEnum_$Overlay) + (then + ;;@ libraryinfo/Main.java:59:7 + (return ) + ) + ) + ;;@ libraryinfo/Main.java:59:7 + (global.set $f_$initialized__libraryinfo_Main_MyJsEnum_$Overlay (i32.const 1)) + ) +) + +;;; Class $Overlay.$getClassMetadata() +(func $$getClassMetadata__java_lang_Class@libraryinfo.Main.MyJsEnum.$Overlay + (result (ref null $java.lang.Class)) + (block + (if (ref.is_null (global.get $f_$class__libraryinfo_Main_MyJsEnum_$Overlay)) + (then + (global.set $f_$class__libraryinfo_Main_MyJsEnum_$Overlay (call $m_createForEnum__java_lang_String__java_lang_Class@java.lang.Class (call $function.no.side.effects.$getString_|libraryinfo....|__java_lang_String (ref.func $$getString_|libraryinfo....|__java_lang_String@libraryinfo.Main.MyJsEnum.$Overlay) ))) + ) + ) + (return (global.get $f_$class__libraryinfo_Main_MyJsEnum_$Overlay)) + ) +) + +;;; Class $Overlay.$getClassImpl() +(func $$getClassImpl__java_lang_Class@libraryinfo.Main.MyJsEnum.$Overlay + (type $function.$getClassImpl__java_lang_Class) + (param $this.untyped (ref $java.lang.Object)) + (result (ref null $java.lang.Class)) + (local $this (ref null $libraryinfo.Main.MyJsEnum.$Overlay)) + (local.set $this (ref.cast (ref $libraryinfo.Main.MyJsEnum.$Overlay) (local.get $this.untyped))) + (block + (return (call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@libraryinfo.Main.MyJsEnum.$Overlay) )) + ) +) +(elem declare func $$getClassImpl__java_lang_Class@libraryinfo.Main.MyJsEnum.$Overlay) + +;;; String $Overlay.$getString_|libraryinfo....|() +(func $$getString_|libraryinfo....|__java_lang_String@libraryinfo.Main.MyJsEnum.$Overlay + (result (ref null $java.lang.String)) + (block + (if (ref.is_null (global.get $f_$string_|libraryinfo....|__libraryinfo_Main_MyJsEnum_$Overlay)) + (then + (global.set $f_$string_|libraryinfo....|__libraryinfo_Main_MyJsEnum_$Overlay (call $m_fromJsString__java_lang_String_NativeString__java_lang_String@java.lang.String (string.const "libraryinfo.Main$MyJsEnum$$Overlay"))) + ) + ) + (return (global.get $f_$string_|libraryinfo....|__libraryinfo_Main_MyJsEnum_$Overlay)) + ) +) + ;;; Code for libraryinfo.Main [methods] ;;; Main Main.$create() @@ -1221,6 +1212,8 @@ ) ) +;;; Code for libraryinfo.Main.MyJsEnum [methods] + ;;; Code for libraryinfo.Main.MyJsType [methods] ;;; MyJsType MyJsType.$create() @@ -1411,151 +1404,6 @@ ) ) -;;; Code for libraryinfo.Main.MyJsEnum [methods] - -;;; MyJsEnum MyJsEnum.$create(String $name, int $ordinal) -(func $$create__java_lang_String__int@libraryinfo.Main.MyJsEnum - (param $$name (ref null $java.lang.String)) - (param $$ordinal i32) - (result (ref null $libraryinfo.Main.MyJsEnum)) - ;;@ libraryinfo/Main.java:59:7 - (local $$instance (ref null $libraryinfo.Main.MyJsEnum)) - (block - ;;@ libraryinfo/Main.java:59:7 - (local.set $$instance (struct.new $libraryinfo.Main.MyJsEnum (ref.as_non_null (global.get $libraryinfo.Main.MyJsEnum.vtable)) (ref.as_non_null (global.get $libraryinfo.Main.MyJsEnum.itable)) (i32.const 0) (ref.null $java.lang.String) (i32.const 0))) - ;;@ libraryinfo/Main.java:59:7 - (call $$ctor__java_lang_String__int__void_$p_libraryinfo_Main_MyJsEnum@libraryinfo.Main.MyJsEnum (ref.as_non_null (local.get $$instance))(local.get $$name)(local.get $$ordinal)) - ;;@ libraryinfo/Main.java:59:7 - (return (local.get $$instance)) - ) -) - -;;; void MyJsEnum.$ctor(String $name, int $ordinal) -(func $$ctor__java_lang_String__int__void_$p_libraryinfo_Main_MyJsEnum@libraryinfo.Main.MyJsEnum - (param $this (ref null $libraryinfo.Main.MyJsEnum)) - (param $$name (ref null $java.lang.String)) - (param $$ordinal i32) - ;;@ libraryinfo/Main.java:59:7 - (block - ;;@ libraryinfo/Main.java:59:7 - (struct.set $java.lang.Enum $f_name__java_lang_Enum_ (local.get $this) (local.get $$name)) - ;;@ libraryinfo/Main.java:59:7 - (struct.set $java.lang.Enum $f_ordinal__java_lang_Enum_ (local.get $this) (local.get $$ordinal)) - ;;@ libraryinfo/Main.java:59:7 - (call $$ctor__java_lang_String__int__void_$p_java_lang_Enum@java.lang.Enum (ref.as_non_null (local.get $this))(local.get $$name)(local.get $$ordinal)) - ) -) - -;;; MyJsEnum MyJsEnum.valueOf(String name) -(func $m_valueOf__java_lang_String__libraryinfo_Main_MyJsEnum@libraryinfo.Main.MyJsEnum - (param $name (ref null $java.lang.String)) - (result (ref null $libraryinfo.Main.MyJsEnum)) - ;;@ libraryinfo/Main.java:59:7 - (block - ;;@ libraryinfo/Main.java:59:7 - (call $$clinit__void@libraryinfo.Main.MyJsEnum ) - ;;@ libraryinfo/Main.java:59:7 - (if (ref.is_null (global.get $f_namesToValuesMap__libraryinfo_Main_MyJsEnum_)) - (then - (block - ;;@ libraryinfo/Main.java:59:7 - (global.set $f_namesToValuesMap__libraryinfo_Main_MyJsEnum_ (call $m_createMapFromValues__arrayOf_java_lang_Enum__java_util_Map@javaemul.internal.Enums (call $m_values__arrayOf_libraryinfo_Main_MyJsEnum@libraryinfo.Main.MyJsEnum ))) - ) - ) - ) - ;;@ libraryinfo/Main.java:59:7 - (return (ref.cast (ref null $libraryinfo.Main.MyJsEnum) (call $m_getValueFromNameAndMap__java_lang_String__java_util_Map__java_lang_Object@javaemul.internal.Enums (local.get $name)(global.get $f_namesToValuesMap__libraryinfo_Main_MyJsEnum_)))) - ) -) - -;;; MyJsEnum[] MyJsEnum.values() -(func $m_values__arrayOf_libraryinfo_Main_MyJsEnum@libraryinfo.Main.MyJsEnum - (result (ref null $javaemul.internal.WasmArray.OfObject)) - ;;@ libraryinfo/Main.java:59:7 - (block - ;;@ libraryinfo/Main.java:59:7 - (call $$clinit__void@libraryinfo.Main.MyJsEnum ) - ;;@ libraryinfo/Main.java:59:7 - (return (call $m_newWithLiteral__arrayOf_java_lang_Object__javaemul_internal_WasmArray_OfObject@javaemul.internal.WasmArray.OfObject (array.new_fixed $java.lang.Object.array (global.get $f_A__libraryinfo_Main_MyJsEnum)(global.get $f_B__libraryinfo_Main_MyJsEnum)(global.get $f_C__libraryinfo_Main_MyJsEnum)))) - ) -) - -;;; void MyJsEnum.$clinit() -(func $$clinit__void@libraryinfo.Main.MyJsEnum - ;;@ libraryinfo/Main.java:59:7 - (block - ;;@ libraryinfo/Main.java:59:7 - (if (global.get $f_$initialized__libraryinfo_Main_MyJsEnum) - (then - ;;@ libraryinfo/Main.java:59:7 - (return ) - ) - ) - ;;@ libraryinfo/Main.java:59:7 - (global.set $f_$initialized__libraryinfo_Main_MyJsEnum (i32.const 1)) - ;;@ libraryinfo/Main.java:59:7 - (call $$clinit__void@java.lang.Enum ) - ;;@ libraryinfo/Main.java:60:4 - (global.set $f_A__libraryinfo_Main_MyJsEnum (call $$create__java_lang_String__int@libraryinfo.Main.MyJsEnum (call $function.no.side.effects.$getString_|A|__java_lang_String (ref.func $$getString_|A|__java_lang_String@libraryinfo.Main.MyJsEnum) )(i32.const 0))) - ;;@ libraryinfo/Main.java:61:4 - (global.set $f_B__libraryinfo_Main_MyJsEnum (call $$create__java_lang_String__int@libraryinfo.Main.MyJsEnum (call $function.no.side.effects.$getString_|B|__java_lang_String (ref.func $$getString_|B|__java_lang_String@java.lang.Byte) )(i32.const 1))) - ;;@ libraryinfo/Main.java:62:4 - (global.set $f_C__libraryinfo_Main_MyJsEnum (call $$create__java_lang_String__int@libraryinfo.Main.MyJsEnum (call $function.no.side.effects.$getString_|C|__java_lang_String (ref.func $$getString_|C|__java_lang_String@java.lang.Character) )(i32.const 2))) - ) -) - -;;; Class MyJsEnum.$getClassMetadata() -(func $$getClassMetadata__java_lang_Class@libraryinfo.Main.MyJsEnum - (result (ref null $java.lang.Class)) - (block - (if (ref.is_null (global.get $f_$class__libraryinfo_Main_MyJsEnum)) - (then - (global.set $f_$class__libraryinfo_Main_MyJsEnum (call $m_createForEnum__java_lang_String__java_lang_Class@java.lang.Class (call $function.no.side.effects.$getString_|libraryinfo....|__java_lang_String (ref.func $$getString_|libraryinfo....|__java_lang_String@libraryinfo.Main.MyJsEnum) ))) - ) - ) - (return (global.get $f_$class__libraryinfo_Main_MyJsEnum)) - ) -) - -;;; Class MyJsEnum.$getClassImpl() -(func $$getClassImpl__java_lang_Class@libraryinfo.Main.MyJsEnum - (type $function.$getClassImpl__java_lang_Class) - (param $this.untyped (ref $java.lang.Object)) - (result (ref null $java.lang.Class)) - (local $this (ref null $libraryinfo.Main.MyJsEnum)) - (local.set $this (ref.cast (ref $libraryinfo.Main.MyJsEnum) (local.get $this.untyped))) - (block - (return (call $function.no.side.effects.$getClassMetadata__java_lang_Class (ref.func $$getClassMetadata__java_lang_Class@libraryinfo.Main.MyJsEnum) )) - ) -) -(elem declare func $$getClassImpl__java_lang_Class@libraryinfo.Main.MyJsEnum) - -;;; String MyJsEnum.$getString_|A|() -(func $$getString_|A|__java_lang_String@libraryinfo.Main.MyJsEnum - (result (ref null $java.lang.String)) - (block - (if (ref.is_null (global.get $f_$string_|A|__libraryinfo_Main_MyJsEnum)) - (then - (global.set $f_$string_|A|__libraryinfo_Main_MyJsEnum (call $m_fromJsString__java_lang_String_NativeString__java_lang_String@java.lang.String (string.const "A"))) - ) - ) - (return (global.get $f_$string_|A|__libraryinfo_Main_MyJsEnum)) - ) -) - -;;; String MyJsEnum.$getString_|libraryinfo....|() -(func $$getString_|libraryinfo....|__java_lang_String@libraryinfo.Main.MyJsEnum - (result (ref null $java.lang.String)) - (block - (if (ref.is_null (global.get $f_$string_|libraryinfo....|__libraryinfo_Main_MyJsEnum)) - (then - (global.set $f_$string_|libraryinfo....|__libraryinfo_Main_MyJsEnum (call $m_fromJsString__java_lang_String_NativeString__java_lang_String@java.lang.String (string.const "libraryinfo.Main$MyJsEnum"))) - ) - ) - (return (global.get $f_$string_|libraryinfo....|__libraryinfo_Main_MyJsEnum)) - ) -) - ;;; Code for libraryinfo.Main.MyEnum [methods] ;;; MyEnum MyEnum.$create(String $name, int $ordinal) diff --git a/transpiler/javatests/com/google/j2cl/readable/readable_example.bzl b/transpiler/javatests/com/google/j2cl/readable/readable_example.bzl index 678db08b72..b867007505 100644 --- a/transpiler/javatests/com/google/j2cl/readable/readable_example.bzl +++ b/transpiler/javatests/com/google/j2cl/readable/readable_example.bzl @@ -106,6 +106,7 @@ def readable_example( name = "readable_wasm", deps = [":readable-j2wasm"], entry_points = wasm_entry_points, + internal_transpiler_args = ["-experimentalWasmEnableNonNativeJsEnum"], ) _readable_diff_test(