Skip to content

Commit

Permalink
8294982: Implementation of Classfile API
Browse files Browse the repository at this point in the history
Reviewed-by: ihse, psandoz, mcimadamore
  • Loading branch information
asotona committed Mar 9, 2023
1 parent 1e9942a commit 4655b79
Show file tree
Hide file tree
Showing 322 changed files with 52,932 additions and 4 deletions.
11 changes: 10 additions & 1 deletion make/RunTests.gmk
Expand Up @@ -592,7 +592,16 @@ define SetupRunMicroTestBody
endif

# Set library path for native dependencies
$1_JMH_JVM_ARGS := -Djava.library.path=$$(TEST_IMAGE_DIR)/micro/native
$1_JMH_JVM_ARGS := -Djava.library.path=$$(TEST_IMAGE_DIR)/micro/native \
--add-exports java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED \
--add-exports java.base/jdk.internal.org.objectweb.asm.tree=ALL-UNNAMED \
--add-exports java.base/jdk.internal.classfile=ALL-UNNAMED \
--add-exports java.base/jdk.internal.classfile.attribute=ALL-UNNAMED \
--add-exports java.base/jdk.internal.classfile.constantpool=ALL-UNNAMED \
--add-exports java.base/jdk.internal.classfile.instruction=ALL-UNNAMED \
--add-exports java.base/jdk.internal.classfile.java.lang.constant=ALL-UNNAMED \
--add-exports java.base/jdk.internal.classfile.components=ALL-UNNAMED \
--add-exports java.base/jdk.internal.classfile.impl=ALL-UNNAMED

ifneq ($$(MICRO_VM_OPTIONS)$$(MICRO_JAVA_OPTIONS), )
$1_JMH_JVM_ARGS += $$(MICRO_VM_OPTIONS) $$(MICRO_JAVA_OPTIONS)
Expand Down
8 changes: 6 additions & 2 deletions make/modules/java.base/Java.gmk
Expand Up @@ -25,15 +25,19 @@

DOCLINT += -Xdoclint:all/protected \
'-Xdoclint/package:java.*,javax.*'
JAVAC_FLAGS += -XDstringConcat=inline
JAVAC_FLAGS += -XDstringConcat=inline \
--enable-preview
DISABLED_WARNINGS_java += preview
COPY += .icu .dat .spp .nrm content-types.properties \
hijrah-config-Hijrah-umalqura_islamic-umalqura.properties
CLEAN += intrinsic.properties

EXCLUDE_FILES += \
$(TOPDIR)/src/java.base/share/classes/jdk/internal/module/ModuleLoaderMap.java

EXCLUDES += java/lang/doc-files
EXCLUDES += java/lang/doc-files \
jdk/internal/classfile/snippet-files \
jdk/internal/classfile/components/snippet-files

# Exclude BreakIterator classes that are just used in compile process to generate
# data files and shouldn't go in the product
Expand Down
9 changes: 9 additions & 0 deletions make/test/BuildMicrobenchmark.gmk
Expand Up @@ -96,6 +96,15 @@ $(eval $(call SetupJavaCompilation, BUILD_JDK_MICROBENCHMARK, \
BIN := $(MICROBENCHMARK_CLASSES), \
JAVAC_FLAGS := --add-exports java.base/sun.security.util=ALL-UNNAMED \
--add-exports java.base/sun.invoke.util=ALL-UNNAMED \
--add-exports java.base/jdk.internal.classfile=ALL-UNNAMED \
--add-exports java.base/jdk.internal.classfile.attribute=ALL-UNNAMED \
--add-exports java.base/jdk.internal.classfile.constantpool=ALL-UNNAMED \
--add-exports java.base/jdk.internal.classfile.instruction=ALL-UNNAMED \
--add-exports java.base/jdk.internal.classfile.java.lang.constant=ALL-UNNAMED \
--add-exports java.base/jdk.internal.classfile.components=ALL-UNNAMED \
--add-exports java.base/jdk.internal.classfile.impl=ALL-UNNAMED \
--add-exports java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED \
--add-exports java.base/jdk.internal.org.objectweb.asm.tree=ALL-UNNAMED \
--add-exports java.base/jdk.internal.vm=ALL-UNNAMED \
--enable-preview, \
JAVA_FLAGS := --add-modules jdk.unsupported --limit-modules java.management \
Expand Down
112 changes: 112 additions & 0 deletions src/java.base/share/classes/jdk/internal/classfile/AccessFlags.java
@@ -0,0 +1,112 @@
/*
* Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package jdk.internal.classfile;

import java.util.Set;
import jdk.internal.classfile.impl.AccessFlagsImpl;
import java.lang.reflect.AccessFlag;

/**
* Models the access flags for a class, method, or field. Delivered as a
* {@link jdk.internal.classfile.ClassElement}, {@link jdk.internal.classfile.FieldElement}, or
* {@link jdk.internal.classfile.MethodElement} when traversing
* the corresponding model type.
*/
public sealed interface AccessFlags
extends ClassElement, MethodElement, FieldElement
permits AccessFlagsImpl {

/**
* {@return the access flags, as a bit mask}
*/
int flagsMask();

/**
* {@return the access flags}
*/
Set<AccessFlag> flags();

/**
* {@return whether the specified flag is present} The specified flag
* should be a valid flag for the classfile location associated with this
* element otherwise false is returned.
* @param flag the flag to test
*/
boolean has(AccessFlag flag);

/**
* {@return the classfile location for this element, which is either class,
* method, or field}
*/
AccessFlag.Location location();

/**
* {@return an {@linkplain AccessFlags} for a class}
* @param mask the flags to be set, as a bit mask
*/
static AccessFlags ofClass(int mask) {
return new AccessFlagsImpl(AccessFlag.Location.CLASS, mask);
}

/**
* {@return an {@linkplain AccessFlags} for a class}
* @param flags the flags to be set
*/
static AccessFlags ofClass(AccessFlag... flags) {
return new AccessFlagsImpl(AccessFlag.Location.CLASS, flags);
}

/**
* {@return an {@linkplain AccessFlags} for a field}
* @param mask the flags to be set, as a bit mask
*/
static AccessFlags ofField(int mask) {
return new AccessFlagsImpl(AccessFlag.Location.FIELD, mask);
}

/**
* {@return an {@linkplain AccessFlags} for a field}
* @param flags the flags to be set
*/
static AccessFlags ofField(AccessFlag... flags) {
return new AccessFlagsImpl(AccessFlag.Location.FIELD, flags);
}

/**
* {@return an {@linkplain AccessFlags} for a method}
* @param mask the flags to be set, as a bit mask
*/
static AccessFlags ofMethod(int mask) {
return new AccessFlagsImpl(AccessFlag.Location.METHOD, mask);
}

/**
* {@return an {@linkplain AccessFlags} for a method}
* @param flags the flags to be set
*/
static AccessFlags ofMethod(AccessFlag... flags) {
return new AccessFlagsImpl(AccessFlag.Location.METHOD, flags);
}
}
108 changes: 108 additions & 0 deletions src/java.base/share/classes/jdk/internal/classfile/Annotation.java
@@ -0,0 +1,108 @@
/*
* Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package jdk.internal.classfile;

import jdk.internal.classfile.attribute.RuntimeInvisibleAnnotationsAttribute;
import jdk.internal.classfile.attribute.RuntimeInvisibleParameterAnnotationsAttribute;
import jdk.internal.classfile.attribute.RuntimeVisibleAnnotationsAttribute;
import jdk.internal.classfile.attribute.RuntimeVisibleParameterAnnotationsAttribute;
import jdk.internal.classfile.constantpool.Utf8Entry;
import jdk.internal.classfile.impl.AnnotationImpl;
import jdk.internal.classfile.impl.TemporaryConstantPool;

import java.lang.constant.ClassDesc;
import java.util.List;

/**
* Models an annotation on a declaration.
*
* @see AnnotationElement
* @see AnnotationValue
* @see RuntimeVisibleAnnotationsAttribute
* @see RuntimeInvisibleAnnotationsAttribute
* @see RuntimeVisibleParameterAnnotationsAttribute
* @see RuntimeInvisibleParameterAnnotationsAttribute
*/
public sealed interface Annotation
extends WritableElement<Annotation>
permits TypeAnnotation, AnnotationImpl {

/**
* {@return the class of the annotation}
*/
Utf8Entry className();

/**
* {@return the class of the annotation, as a symbolic descriptor}
*/
default ClassDesc classSymbol() {
return ClassDesc.ofDescriptor(className().stringValue());
}

/**
* {@return the elements of the annotation}
*/
List<AnnotationElement> elements();

/**
* {@return an annotation}
* @param annotationClass the class of the annotation
* @param elements the elements of the annotation
*/
static Annotation of(Utf8Entry annotationClass,
List<AnnotationElement> elements) {
return new AnnotationImpl(annotationClass, elements);
}

/**
* {@return an annotation}
* @param annotationClass the class of the annotation
* @param elements the elements of the annotation
*/
static Annotation of(Utf8Entry annotationClass,
AnnotationElement... elements) {
return of(annotationClass, List.of(elements));
}

/**
* {@return an annotation}
* @param annotationClass the class of the annotation
* @param elements the elements of the annotation
*/
static Annotation of(ClassDesc annotationClass,
List<AnnotationElement> elements) {
return of(TemporaryConstantPool.INSTANCE.utf8Entry(annotationClass.descriptorString()), elements);
}

/**
* {@return an annotation}
* @param annotationClass the class of the annotation
* @param elements the elements of the annotation
*/
static Annotation of(ClassDesc annotationClass,
AnnotationElement... elements) {
return of(TemporaryConstantPool.INSTANCE.utf8Entry(annotationClass.descriptorString()), elements);
}
}

1 comment on commit 4655b79

@openjdk-notifier
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.