def _unittest_config_participant(config): vmArgs, mainClass, mainClassArgs = config cpIndex, cp = mx.find_classpath_arg(vmArgs) if cp: cp = _uniqify(cp.split(os.pathsep)) if isJDK8: # Remove entries from class path that are in Graal or on the boot class path redundantClasspathEntries = set() for dist in [entry.dist() for entry in _jvmci_classpath]: redundantClasspathEntries.update((d.output_dir() for d in dist.archived_deps() if d.isJavaProject())) redundantClasspathEntries.add(dist.path) cp = os.pathsep.join([e for e in cp if e not in redundantClasspathEntries]) vmArgs[cpIndex] = cp else: redundantClasspathEntries = set() for dist in [entry.dist() for entry in _jvmci_classpath] + _bootclasspath_appends: redundantClasspathEntries.update(mx.classpath(dist, preferProjects=False, jdk=jdk).split(os.pathsep)) redundantClasspathEntries.update(mx.classpath(dist, preferProjects=True, jdk=jdk).split(os.pathsep)) if hasattr(dist, 'overlaps'): for o in dist.overlaps: path = mx.distribution(o).classpath_repr() if path: redundantClasspathEntries.add(path) # Remove entries from the class path that are in the deployed modules cp = [classpathEntry for classpathEntry in cp if classpathEntry not in redundantClasspathEntries] vmArgs[cpIndex] = os.pathsep.join(cp) if isJDK8: # Run the VM in a mode where application/test classes can # access JVMCI loaded classes. vmArgs.append('-XX:-UseJVMCIClassLoader') return (vmArgs, mainClass, mainClassArgs)
def parseVmArgs(self, args, addDefaultArgs=True): args = mx.expand_project_in_args(args, insitu=False) jacocoArgs = mx_gate.get_jacoco_agent_args() if jacocoArgs: args = jacocoArgs + args args = ['-Xbootclasspath/p:' + dep.classpath_repr() for dep in _jvmci_bootclasspath_prepends] + args # Remove JVMCI jars from class path. They are only necessary when # compiling with a javac from JDK8 or earlier. cpIndex, cp = mx.find_classpath_arg(args) if cp: excluded = frozenset([dist.path for dist in _suite.dists]) cp = os.pathsep.join([e for e in cp.split(os.pathsep) if e not in excluded]) args[cpIndex] = cp jvmciModeArgs = _jvmciModes[_vm.jvmciMode] if jvmciModeArgs: bcpDeps = [jdkDist.dist() for jdkDist in jdkDeployedDists] if bcpDeps: args = ['-Xbootclasspath/p:' + os.pathsep.join([d.classpath_repr() for d in bcpDeps])] + args # Set the default JVMCI compiler for jdkDist in reversed(jdkDeployedDists): assert isinstance(jdkDist, JvmciJDKDeployedDist), jdkDist if jdkDist._compilers: jvmciCompiler = jdkDist._compilers[-1] args = ['-Djvmci.compiler=' + jvmciCompiler] + args break if '-version' in args: ignoredArgs = args[args.index('-version') + 1:] if len(ignoredArgs) > 0: mx.log("Warning: The following options will be ignored by the vm because they come after the '-version' argument: " + ' '.join(ignoredArgs)) return self.processArgs(args, addDefaultArgs=addDefaultArgs)
def _unittest_config_participant(config): """modifies the classpath to use the Sulong distribution jars instead of the classfiles to enable the use of Java's ServiceLoader""" (vmArgs, mainClass, mainClassArgs) = config cpIndex, _ = mx.find_classpath_arg(vmArgs) junitCp = mx.classpath("com.oracle.mxtool.junit") sulongCp = ':'.join([mx.classpath(mx.distribution(distr), jdk=mx.get_jdk(tag='jvmci')) for distr in sulongDistributions]) vmArgs[cpIndex] = junitCp + ":" + sulongCp return (vmArgs, mainClass, mainClassArgs)
def unittest_use_distribution_jars(config): """use the distribution jars instead of the class files""" vmArgs, mainClass, mainClassArgs = config cpIndex, _ = mx.find_classpath_arg(vmArgs) junitCP = [mx.classpath("com.oracle.mxtool.junit")] rubyCP = [mx.classpath(mx.distribution(distr)) for distr in rubyDists] vmArgs[cpIndex] = ":".join(junitCP + rubyCP) return (vmArgs, mainClass, mainClassArgs)
def _parseVmArgs(jdk, args, addDefaultArgs=True): args = mx.expand_project_in_args(args, insitu=False) jacocoArgs = mx_gate.get_jacoco_agent_args() if jacocoArgs: args = jacocoArgs + args # Support for -G: options def translateGOption(arg): if arg.startswith("-G:+"): if "=" in arg: mx.abort("Mixing + and = in -G: option specification: " + arg) arg = "-Dgraal." + arg[len("-G:+") :] + "=true" elif arg.startswith("-G:-"): if "=" in arg: mx.abort("Mixing - and = in -G: option specification: " + arg) arg = "-Dgraal." + arg[len("-G:+") :] + "=false" elif arg.startswith("-G:"): if "=" not in arg: mx.abort('Missing "=" in non-boolean -G: option specification: ' + arg) arg = "-Dgraal." + arg[len("-G:") :] return arg args = map(translateGOption, args) if "-G:+PrintFlags" in args and "-Xcomp" not in args: mx.warn("Using -G:+PrintFlags may have no effect without -Xcomp as Graal initialization is lazy") bcp = [mx.distribution("truffle:TRUFFLE_API").classpath_repr()] if _jvmciModes[_vm.jvmciMode]: bcp.extend([d.get_classpath_repr() for d in _bootClasspathDists]) args = ["-Xbootclasspath/p:" + os.pathsep.join(bcp)] + args # Remove JVMCI from class path. It's only there to support compilation. cpIndex, cp = mx.find_classpath_arg(args) if cp: jvmciLib = mx.library("JVMCI").path cp = os.pathsep.join([e for e in cp.split(os.pathsep) if e != jvmciLib]) args[cpIndex] = cp # Set the default JVMCI compiler jvmciCompiler = _compilers[-1] args = ["-Djvmci.compiler=" + jvmciCompiler] + args if "-version" in args: ignoredArgs = args[args.index("-version") + 1 :] if len(ignoredArgs) > 0: mx.log( "Warning: The following options will be ignored by the vm because they come after the '-version' argument: " + " ".join(ignoredArgs) ) return jdk.processArgs(args, addDefaultArgs=addDefaultArgs)
def _parseVmArgs(jdk, args, addDefaultArgs=True): args = mx.expand_project_in_args(args, insitu=False) jacocoArgs = mx_gate.get_jacoco_agent_args() if jacocoArgs: args = jacocoArgs + args # Support for -G: options def translateGOption(arg): if arg.startswith('-G:+'): if '=' in arg: mx.abort('Mixing + and = in -G: option specification: ' + arg) arg = '-Dgraal.' + arg[len('-G:+'):] + '=true' elif arg.startswith('-G:-'): if '=' in arg: mx.abort('Mixing - and = in -G: option specification: ' + arg) arg = '-Dgraal.' + arg[len('-G:+'):] + '=false' elif arg.startswith('-G:'): if '=' not in arg: mx.abort('Missing "=" in non-boolean -G: option specification: ' + arg) arg = '-Dgraal.' + arg[len('-G:'):] return arg # add default graal.options.file and translate -G: options options_file = join(mx.primary_suite().dir, 'graal.options') options_file_arg = ['-Dgraal.options.file=' + options_file] if exists(options_file) else [] args = options_file_arg + map(translateGOption, args) if '-G:+PrintFlags' in args and '-Xcomp' not in args: mx.warn('Using -G:+PrintFlags may have no effect without -Xcomp as Graal initialization is lazy') bcp = [mx.distribution('truffle:TRUFFLE_API').classpath_repr()] if _jvmciModes[_vm.jvmciMode]: bcp.extend([d.get_classpath_repr() for d in _bootClasspathDists]) args = ['-Xbootclasspath/p:' + os.pathsep.join(bcp)] + args # Remove JVMCI from class path. It's only there to support compilation. cpIndex, cp = mx.find_classpath_arg(args) if cp: jvmciLib = mx.library('JVMCI').path cp = os.pathsep.join([e for e in cp.split(os.pathsep) if e != jvmciLib]) args[cpIndex] = cp # Set the default JVMCI compiler jvmciCompiler = _compilers[-1] args = ['-Djvmci.Compiler=' + jvmciCompiler] + args if '-version' in args: ignoredArgs = args[args.index('-version') + 1:] if len(ignoredArgs) > 0: mx.log("Warning: The following options will be ignored by the vm because they come after the '-version' argument: " + ' '.join(ignoredArgs)) return jdk.processArgs(args, addDefaultArgs=addDefaultArgs)
def parseVmArgs(self, args, addDefaultArgs=True): args = mx.expand_project_in_args(args, insitu=False) jacocoArgs = mx_gate.get_jacoco_agent_args() if jacocoArgs: args = jacocoArgs + args args = ['-Xbootclasspath/p:' + dep.classpath_repr() for dep in _jvmci_bootclasspath_prepends] + args # Remove JVMCI jars from class path. They are only necessary when # compiling with a javac from JDK8 or earlier. cpIndex, cp = mx.find_classpath_arg(args) if cp: excluded = frozenset([dist.path for dist in _suite.dists]) cp = os.pathsep.join([e for e in cp.split(os.pathsep) if e not in excluded]) args[cpIndex] = cp if '-version' in args: ignoredArgs = args[args.index('-version') + 1:] if len(ignoredArgs) > 0: mx.log("Warning: The following options will be ignored by the vm because they come after the '-version' argument: " + ' '.join(ignoredArgs)) return self.processArgs(args, addDefaultArgs=addDefaultArgs)
def _unittest_config_participant(config): vmArgs, mainClass, mainClassArgs = config cpIndex, cp = mx.find_classpath_arg(vmArgs) if cp: cp = _uniqify(cp.split(os.pathsep)) if isJDK8: # Remove entries from class path that are in Graal or on the boot class path redundantClasspathEntries = set() for dist in [entry.dist() for entry in _jvmci_classpath]: redundantClasspathEntries.update((d.output_dir() for d in dist.archived_deps() if d.isJavaProject())) redundantClasspathEntries.add(dist.path) cp = os.pathsep.join([e for e in cp if e not in redundantClasspathEntries]) vmArgs[cpIndex] = cp else: deployedModules = [] redundantClasspathEntries = set() for dist in [entry.dist() for entry in _jvmci_classpath] + _bootclasspath_appends: deployedModule = as_java_module(dist, jdk) deployedModules.append(deployedModule) redundantClasspathEntries.update(mx.classpath(dist, preferProjects=False, jdk=jdk).split(os.pathsep)) redundantClasspathEntries.update(mx.classpath(dist, preferProjects=True, jdk=jdk).split(os.pathsep)) # Remove entries from the class path that are in the deployed modules cp = [classpathEntry for classpathEntry in cp if classpathEntry not in redundantClasspathEntries] vmArgs[cpIndex] = os.pathsep.join(cp) # Junit libraries are made into automatic modules so that they are visible to tests # patched into modules. These automatic modules must be declared to be read by # Graal which means they must also be made root modules (i.e., ``-addmods``) # since ``-XaddReads`` can only be applied to root modules. junitCp = [e.classpath_repr() for e in mx.classpath_entries(['JUNIT'])] junitModules = [_automatic_module_name(e) for e in junitCp] vmArgs.extend(['-modulepath', os.pathsep.join(junitCp)]) vmArgs.extend(['-addmods', ','.join(junitModules + [m.name for m in deployedModules])]) for deployedModule in deployedModules: vmArgs.append('-XaddReads:' + deployedModule.name + '=' + ','.join(junitModules)) # Explicitly export concealed JVMCI packages required by Graal. Even though # normally exported via jdk.vm.ci.services.Services.exportJVMCITo(), the # Junit harness wants to access JVMCI classes (e.g., when loading classes # to find test methods) without going through that entry point. addedExports = {} for deployedModule in deployedModules: for concealingModule, packages in deployedModule.concealedRequires.iteritems(): if concealingModule == 'jdk.vm.ci': for package in packages: addedExports.setdefault(concealingModule + '/' + package, set()).add(deployedModule.name) patches = {} pathToProject = {p.output_dir() : p for p in mx.projects() if p.isJavaProject()} for classpathEntry in cp: # Export concealed packages used by the class path entry _add_exports_for_concealed_packages(classpathEntry, pathToProject, addedExports, 'ALL-UNNAMED', deployedModules) for deployedModule in deployedModules: assert deployedModule.dist.path != classpathEntry, deployedModule.dist.path + ' should no longer be on the class path' # Patch the class path entry into a module if it defines packages already defined by the module. # Packages definitions cannot be split between modules. classpathEntryPackages = frozenset(_defined_packages(classpathEntry)) if not classpathEntryPackages.isdisjoint(deployedModule.packages): patches.setdefault(deployedModule.name, []).append(classpathEntry) extraPackages = classpathEntryPackages - frozenset(deployedModule.exports.iterkeys()) if extraPackages: # From http://openjdk.java.net/jeps/261: # If a package found in a module definition on a patch path is not already exported # by that module then it will, still, not be exported. It can be exported explicitly # via either the reflection API or the -XaddExports option. for package in extraPackages: addedExports.setdefault(deployedModule.name + '/' + package, set()).update(junitModules + ['ALL-UNNAMED']) for moduleName, cpEntries in patches.iteritems(): vmArgs.append('-Xpatch:' + moduleName + '=' + os.pathsep.join(cpEntries)) vmArgs.extend(['-XaddExports:' + export + '=' + ','.join(sorted(targets)) for export, targets in addedExports.iteritems()]) if isJDK8: # Run the VM in a mode where application/test classes can # access JVMCI loaded classes. vmArgs.append('-XX:-UseJVMCIClassLoader') return (vmArgs, mainClass, mainClassArgs)
def _unittest_config_participant(config): vmArgs, mainClass, mainClassArgs = config cpIndex, cp = mx.find_classpath_arg(vmArgs) if cp: cp = _uniqify(cp.split(os.pathsep)) if isJDK8: # Remove entries from class path that are in Graal excluded = set() for entry in _jvmci_classpath: dist = entry.dist() excluded.update((d.output_dir() for d in dist.archived_deps() if d.isJavaProject())) excluded.add(dist.path) cp = os.pathsep.join([e for e in cp if e not in excluded]) vmArgs[cpIndex] = cp else: # Remove entries from class path that are in the Graal assert _graal_module_descriptor is not None module = as_java_module(_graal_module_descriptor.dist(), jdk) junitCp = [e.classpath_repr() for e in mx.classpath_entries(['JUNIT'])] excluded = frozenset([classpathEntry.classpath_repr() for classpathEntry in get_module_deps(module.dist)] + junitCp) cp = [classpathEntry for classpathEntry in cp if classpathEntry not in excluded] vmArgs[cpIndex] = os.pathsep.join(cp) # Junit libraries are made into automatic modules so that they are visible to tests # patched into Graal. These automatic modules must be declared to be read by # Graal which means they must also be made root modules (i.e., ``-addmods``) # since ``-XaddReads`` can only be applied to root modules. junitModules = [_automatic_module_name(e) for e in junitCp] vmArgs.extend(['-modulepath', os.pathsep.join(junitCp)]) vmArgs.extend(['-addmods', ','.join(junitModules)]) vmArgs.extend(['-XaddReads:' + module.name + '=' + ','.join(junitModules)]) # Explicitly export JVMCI to Graal addedExports = {} for concealingModule, packages in module.concealedRequires.iteritems(): if concealingModule == 'jdk.vm.ci': for package in packages: addedExports.setdefault(concealingModule + '/' + package, set()).add(module.name) patches = [] graalConcealedPackages = list(module.conceals) pathToProject = {p.output_dir() : p for p in mx.projects() if p.isJavaProject()} for classpathEntry in cp: # Export concealed JDK packages used by the class path entry _add_exports_for_concealed_packages(classpathEntry, pathToProject, addedExports, 'ALL-UNNAMED') # Patch the class path entry into Graal if it defines packages already defined by Graal. # Packages definitions cannot be split between modules. packages = frozenset(_defined_packages(classpathEntry)) if not packages.isdisjoint(module.packages): patches.append(classpathEntry) extraPackages = packages - module.packages if extraPackages: # From http://openjdk.java.net/jeps/261: # If a package found in a module definition on a patch path is not already exported # by that module then it will, still, not be exported. It can be exported explicitly # via either the reflection API or the -XaddExports option. graalConcealedPackages.extend(extraPackages) if patches: vmArgs.append('-Xpatch:' + module.name + '=' + os.pathsep.join(patches)) # Export all Graal packages to make them available to test classes for package in graalConcealedPackages: addedExports.setdefault(module.name + '/' + package, set()).update(junitModules + ['ALL-UNNAMED']) vmArgs.extend(['-XaddExports:' + export + '=' + ','.join(sorted(targets)) for export, targets in addedExports.iteritems()]) if isJDK8: # Run the VM in a mode where application/test classes can # access JVMCI loaded classes. vmArgs.append('-XX:-UseJVMCIClassLoader') return (vmArgs, mainClass, mainClassArgs)
def _unittest_config_participant(config): vmArgs, mainClass, mainClassArgs = config cpIndex, cp = mx.find_classpath_arg(vmArgs) if cp: cp = _uniqify(cp.split(os.pathsep)) if isJDK8: # Remove entries from class path that are in Graal or on the boot class path redundantClasspathEntries = set() for dist in [entry.dist() for entry in _jvmci_classpath]: redundantClasspathEntries.update((d.output_dir() for d in dist.archived_deps() if d.isJavaProject())) redundantClasspathEntries.add(dist.path) cp = os.pathsep.join([e for e in cp if e not in redundantClasspathEntries]) vmArgs[cpIndex] = cp else: deployedModules = [] redundantClasspathEntries = set() for dist in [entry.dist() for entry in _jvmci_classpath] + _bootclasspath_appends: deployedModule = as_java_module(dist, jdk) deployedModules.append(deployedModule) redundantClasspathEntries.update(mx.classpath(dist, preferProjects=False, jdk=jdk).split(os.pathsep)) redundantClasspathEntries.update(mx.classpath(dist, preferProjects=True, jdk=jdk).split(os.pathsep)) if hasattr(dist, 'overlaps'): for o in dist.overlaps: path = mx.distribution(o).classpath_repr() if path: redundantClasspathEntries.add(path) # Remove entries from the class path that are in the deployed modules cp = [classpathEntry for classpathEntry in cp if classpathEntry not in redundantClasspathEntries] vmArgs[cpIndex] = os.pathsep.join(cp) # Junit libraries are made into automatic modules so that they are visible to tests # patched into modules. These automatic modules must be declared to be read by # Graal which means they must also be made root modules (i.e., ``--add-modules``) # since ``--add-reads`` can only be applied to root modules. junitCp = [e.classpath_repr() for e in mx.classpath_entries(['JUNIT'])] junitModules = [_automatic_module_name(e) for e in junitCp] vmArgs.append('--module-path=' + os.pathsep.join(junitCp)) vmArgs.append('--add-modules=' + ','.join(junitModules + [m.name for m in deployedModules])) for deployedModule in deployedModules: vmArgs.append('--add-reads=' + deployedModule.name + '=' + ','.join(junitModules)) # Explicitly export concealed JVMCI packages required by Graal. Even though # normally exported via jdk.vm.ci.services.Services.exportJVMCITo(), the # Junit harness wants to access JVMCI classes (e.g., when loading classes # to find test methods) without going through that entry point. addedExports = {} for deployedModule in deployedModules: for concealingModule, packages in deployedModule.concealedRequires.iteritems(): if concealingModule == 'jdk.vm.ci': for package in packages: addedExports.setdefault(concealingModule + '/' + package, set()).add(deployedModule.name) pathToDep = {p.output_dir() if p.isJavaProject() else p.path: p for p in mx.dependencies() if p.isJavaProject() or p.isJARDistribution()} for classpathEntry in cp: # Export concealed packages used by the class path entry _add_exports_for_concealed_packages(classpathEntry, pathToDep, addedExports, 'ALL-UNNAMED', deployedModules) for deployedModule in deployedModules: assert deployedModule.dist.path != classpathEntry, deployedModule.dist.path + ' should no longer be on the class path' # Ensure the class path entry does not define packages already defined by the module. # Packages definitions cannot be split between modules. classpathEntryPackages = frozenset(_defined_packages(classpathEntry)) intersection = classpathEntryPackages.intersection(deployedModule.packages) if intersection: mx.abort(classpathEntry + ' cannot extend package(s) defined in the module ' + deployedModule.name + ': ' + ', '.join(intersection)) vmArgs.extend(['--add-exports=' + export + '=' + ','.join(sorted(targets)) for export, targets in addedExports.iteritems()]) if isJDK8: # Run the VM in a mode where application/test classes can # access JVMCI loaded classes. vmArgs.append('-XX:-UseJVMCIClassLoader') return (vmArgs, mainClass, mainClassArgs)
def _unittest_config_participant_tck(config): def find_path_arg(vmArgs, prefix): for index in reversed(range(len(vmArgs) - 1)): if prefix in vmArgs[index]: return index, vmArgs[index][len(prefix):] return None, None def create_filter(requiredResource): def has_resource(dist): if dist.isJARDistribution() and exists(dist.path): with zipfile.ZipFile(dist.path, "r") as zf: try: zf.getinfo(requiredResource) except KeyError: return False else: return True else: return False return has_resource def import_visitor(suite, suite_import, predicate, collector, javaProperties, seenSuites, **extra_args): suite_collector(mx.suite(suite_import.name), predicate, collector, javaProperties, seenSuites) def suite_collector(suite, predicate, collector, javaProperties, seenSuites): if suite.name in seenSuites: return seenSuites.add(suite.name) suite.visit_imports(import_visitor, predicate=predicate, collector=collector, javaProperties=javaProperties, seenSuites=seenSuites) for dist in suite.dists: if predicate(dist): for distCpEntry in mx.classpath_entries(dist): if hasattr(distCpEntry, "getJavaProperties"): for key, value in dist.getJavaProperties().items(): javaProperties[key] = value if distCpEntry.isJdkLibrary() or distCpEntry.isJreLibrary( ): cpPath = distCpEntry.classpath_repr(mx.get_jdk(), resolve=True) else: cpPath = distCpEntry.classpath_repr(resolve=True) if cpPath: collector[cpPath] = None javaPropertiesToAdd = OrderedDict() providers = OrderedDict() suite_collector( mx.primary_suite(), create_filter( "META-INF/services/org.graalvm.polyglot.tck.LanguageProvider"), providers, javaPropertiesToAdd, set()) languages = OrderedDict() suite_collector(mx.primary_suite(), create_filter("META-INF/truffle/language"), languages, javaPropertiesToAdd, set()) suite_collector( mx.primary_suite(), lambda dist: dist.isJARDistribution( ) and "TRUFFLE_TCK_INSTRUMENTATION" == dist.name and exists(dist.path), languages, javaPropertiesToAdd, set()) vmArgs, mainClass, mainClassArgs = config cpIndex, cpValue = mx.find_classpath_arg(vmArgs) cpBuilder = OrderedDict() if cpValue: for cpElement in cpValue.split(os.pathsep): cpBuilder[cpElement] = None for providerCpElement in providers: cpBuilder[providerCpElement] = None if _is_graalvm(mx.get_jdk()): common = OrderedDict() suite_collector( mx.primary_suite(), lambda dist: dist.isJARDistribution( ) and "TRUFFLE_TCK_COMMON" == dist.name and exists(dist.path), common, javaPropertiesToAdd, set()) tpIndex, tpValue = find_path_arg(vmArgs, '-Dtruffle.class.path.append=') tpBuilder = OrderedDict() if tpValue: for cpElement in tpValue.split(os.pathsep): tpBuilder[cpElement] = None for langCpElement in languages: tpBuilder[langCpElement] = None bpIndex, bpValue = find_path_arg(vmArgs, '-Xbootclasspath/a:') bpBuilder = OrderedDict() if bpValue: for cpElement in bpValue.split(os.pathsep): bpBuilder[cpElement] = None for bootCpElement in common: bpBuilder[bootCpElement] = None cpBuilder.pop(bootCpElement, None) tpBuilder.pop(bootCpElement, None) tpValue = '-Dtruffle.class.path.append=' + os.pathsep.join( (e for e in tpBuilder)) if tpIndex: vmArgs[tpIndex] = tpValue else: vmArgs.append(tpValue) bpValue = '-Xbootclasspath/a:' + os.pathsep.join( (e for e in bpBuilder)) if bpIndex: vmArgs[bpIndex] = bpValue else: vmArgs.append(bpValue) else: for langCpElement in languages: cpBuilder[langCpElement] = None cpValue = os.pathsep.join((e for e in cpBuilder)) if cpIndex: vmArgs[cpIndex] = cpValue else: vmArgs.append("-cp") vmArgs.append(cpValue) for key, value in javaPropertiesToAdd.items(): vmArgs.append("-D" + key + "=" + value) return (vmArgs, mainClass, mainClassArgs)
def _unittest_config_participant(config): vmArgs, mainClass, mainClassArgs = config cpIndex, cp = mx.find_classpath_arg(vmArgs) if cp: cp = _uniqify(cp.split(os.pathsep)) if isJDK8: # Remove entries from class path that are in Graal or on the boot class path redundantClasspathEntries = set() for dist in [entry.dist() for entry in _jvmci_classpath]: redundantClasspathEntries.update( (d.output_dir() for d in dist.archived_deps() if d.isJavaProject())) redundantClasspathEntries.add(dist.path) cp = os.pathsep.join( [e for e in cp if e not in redundantClasspathEntries]) vmArgs[cpIndex] = cp else: deployedModules = [] redundantClasspathEntries = set() for dist in [entry.dist() for entry in _jvmci_classpath ] + _bootclasspath_appends: deployedModule = as_java_module(dist, jdk) deployedModules.append(deployedModule) redundantClasspathEntries.update( mx.classpath(dist, preferProjects=False, jdk=jdk).split(os.pathsep)) redundantClasspathEntries.update( mx.classpath(dist, preferProjects=True, jdk=jdk).split(os.pathsep)) if hasattr(dist, 'overlaps'): for o in dist.overlaps: path = mx.distribution(o).classpath_repr() if path: redundantClasspathEntries.add(path) # Remove entries from the class path that are in the deployed modules cp = [ classpathEntry for classpathEntry in cp if classpathEntry not in redundantClasspathEntries ] vmArgs[cpIndex] = os.pathsep.join(cp) # Junit libraries are made into automatic modules so that they are visible to tests # patched into modules. These automatic modules must be declared to be read by # Graal which means they must also be made root modules (i.e., ``--add-modules``) # since ``--add-reads`` can only be applied to root modules. junitCp = [ e.classpath_repr() for e in mx.classpath_entries(['JUNIT']) ] junitModules = [_automatic_module_name(e) for e in junitCp] vmArgs.append('--module-path=' + os.pathsep.join(junitCp)) vmArgs.append('--add-modules=' + ','.join(junitModules + [m.name for m in deployedModules])) for deployedModule in deployedModules: vmArgs.append('--add-reads=' + deployedModule.name + '=' + ','.join(junitModules)) # Explicitly export concealed JVMCI packages required by Graal. Even though # normally exported via jdk.vm.ci.services.Services.exportJVMCITo(), the # Junit harness wants to access JVMCI classes (e.g., when loading classes # to find test methods) without going through that entry point. addedExports = {} for deployedModule in deployedModules: for concealingModule, packages in deployedModule.concealedRequires.iteritems( ): if concealingModule == 'jdk.vm.ci': for package in packages: addedExports.setdefault( concealingModule + '/' + package, set()).add(deployedModule.name) pathToDep = { p.output_dir() if p.isJavaProject() else p.path: p for p in mx.dependencies() if p.isJavaProject() or p.isJARDistribution() } for classpathEntry in cp: # Export concealed packages used by the class path entry _add_exports_for_concealed_packages(classpathEntry, pathToDep, addedExports, 'ALL-UNNAMED', deployedModules) for deployedModule in deployedModules: assert deployedModule.dist.path != classpathEntry, deployedModule.dist.path + ' should no longer be on the class path' # Ensure the class path entry does not define packages already defined by the module. # Packages definitions cannot be split between modules. classpathEntryPackages = frozenset( _defined_packages(classpathEntry)) intersection = classpathEntryPackages.intersection( deployedModule.packages) if intersection: mx.abort( classpathEntry + ' cannot extend package(s) defined in the module ' + deployedModule.name + ': ' + ', '.join(intersection)) vmArgs.extend([ '--add-exports=' + export + '=' + ','.join(sorted(targets)) for export, targets in addedExports.iteritems() ]) if isJDK8: # Run the VM in a mode where application/test classes can # access JVMCI loaded classes. vmArgs.append('-XX:-UseJVMCIClassLoader') return (vmArgs, mainClass, mainClassArgs)
def _unittest_config_participant_tck(config): def find_path_arg(vmArgs, prefix): for index in reversed(range(len(vmArgs) - 1)): if prefix in vmArgs[index]: return index, vmArgs[index][len(prefix):] return None, None javaPropertiesToAdd = OrderedDict() providers = OrderedDict() _collect_tck_providers(providers, javaPropertiesToAdd) languages = OrderedDict() _collect_languages(languages, javaPropertiesToAdd) _collect_class_path_entries_by_name("TRUFFLE_TCK_INSTRUMENTATION", languages, javaPropertiesToAdd) vmArgs, mainClass, mainClassArgs = config cpIndex, cpValue = mx.find_classpath_arg(vmArgs) cpBuilder = OrderedDict() if cpValue: for cpElement in cpValue.split(os.pathsep): cpBuilder[cpElement] = None for providerCpElement in providers: cpBuilder[providerCpElement] = None if _is_graalvm(mx.get_jdk()): boot_cp = OrderedDict() _collect_class_path_entries_by_name("TRUFFLE_TCK_COMMON", boot_cp, javaPropertiesToAdd) tpIndex, tpValue = find_path_arg(vmArgs, '-Dtruffle.class.path.append=') tpBuilder = OrderedDict() if tpValue: for cpElement in tpValue.split(os.pathsep): tpBuilder[cpElement] = None for langCpElement in languages: tpBuilder[langCpElement] = None bpIndex, bpValue = find_path_arg(vmArgs, '-Xbootclasspath/a:') bpBuilder = OrderedDict() if bpValue: for cpElement in bpValue.split(os.pathsep): bpBuilder[cpElement] = None for bootCpElement in boot_cp: bpBuilder[bootCpElement] = None cpBuilder.pop(bootCpElement, None) tpBuilder.pop(bootCpElement, None) tpValue = '-Dtruffle.class.path.append=' + os.pathsep.join( (e for e in tpBuilder)) if tpIndex: vmArgs[tpIndex] = tpValue else: vmArgs.append(tpValue) bpValue = '-Xbootclasspath/a:' + os.pathsep.join( (e for e in bpBuilder)) if bpIndex: vmArgs[bpIndex] = bpValue else: vmArgs.append(bpValue) else: for langCpElement in languages: cpBuilder[langCpElement] = None cpValue = os.pathsep.join((e for e in cpBuilder)) if cpIndex: vmArgs[cpIndex] = cpValue else: vmArgs.append("-cp") vmArgs.append(cpValue) for key, value in javaPropertiesToAdd.items(): vmArgs.append("-D" + key + "=" + value) return (vmArgs, mainClass, mainClassArgs)
def _unittest_config_participant_tck(config): def create_filter(requiredResource): def has_resource(jar): with zipfile.ZipFile(jar, "r") as zf: try: zf.getinfo(requiredResource) except KeyError: return False else: return True return has_resource def import_visitor(suite, suite_import, predicate, collector, javaProperties, seenSuites, **extra_args): suite_collector(mx.suite(suite_import.name), predicate, collector, javaProperties, seenSuites) def suite_collector(suite, predicate, collector, javaProperties, seenSuites): if suite.name in seenSuites: return seenSuites.add(suite.name) suite.visit_imports(import_visitor, predicate=predicate, collector=collector, javaProperties=javaProperties, seenSuites=seenSuites) for dist in suite.dists: if dist.isJARDistribution() and exists(dist.path) and predicate( dist.path): for distCpEntry in mx.classpath_entries(dist): if hasattr(distCpEntry, "getJavaProperties"): for key, value in dist.getJavaProperties().items(): javaProperties[key] = value if distCpEntry.isJdkLibrary() or distCpEntry.isJreLibrary( ): cpPath = distCpEntry.classpath_repr(mx.get_jdk(), resolve=True) else: cpPath = distCpEntry.classpath_repr(resolve=True) if cpPath: collector[cpPath] = None javaPropertiesToAdd = OrderedDict() providers = OrderedDict() suite_collector( mx.primary_suite(), create_filter( "META-INF/services/org.graalvm.polyglot.tck.LanguageProvider"), providers, javaPropertiesToAdd, set()) languages = OrderedDict() suite_collector(mx.primary_suite(), create_filter("META-INF/truffle/language"), languages, javaPropertiesToAdd, set()) vmArgs, mainClass, mainClassArgs = config cpIndex, cpValue = mx.find_classpath_arg(vmArgs) cpBuilder = OrderedDict() if cpValue: for cpElement in cpValue.split(os.pathsep): cpBuilder[cpElement] = None for langCpElement in languages: cpBuilder[langCpElement] = None for providerCpElement in providers: cpBuilder[providerCpElement] = None cpValue = os.pathsep.join((e for e in cpBuilder)) if cpIndex: vmArgs[cpIndex] = cpValue else: vmArgs.append("-cp") vmArgs.append(cpValue) for key, value in javaPropertiesToAdd.items(): vmArgs.append("-D" + key + "=" + value) return (vmArgs, mainClass, mainClassArgs)
def _unittest_config_participant_tck(config): def find_path_arg(vmArgs, prefix): for index in reversed(range(len(vmArgs) - 1)): if prefix in vmArgs[index]: return index, vmArgs[index][len(prefix):] return None, None def create_filter(requiredResource): def has_resource(dist): if dist.isJARDistribution() and exists(dist.path): with zipfile.ZipFile(dist.path, "r") as zf: try: zf.getinfo(requiredResource) except KeyError: return False else: return True else: return False return has_resource def import_visitor(suite, suite_import, predicate, collector, javaProperties, seenSuites, **extra_args): suite_collector(mx.suite(suite_import.name), predicate, collector, javaProperties, seenSuites) def suite_collector(suite, predicate, collector, javaProperties, seenSuites): if suite.name in seenSuites: return seenSuites.add(suite.name) suite.visit_imports(import_visitor, predicate=predicate, collector=collector, javaProperties=javaProperties, seenSuites=seenSuites) for dist in suite.dists: if predicate(dist): for distCpEntry in mx.classpath_entries(dist): if hasattr(distCpEntry, "getJavaProperties"): for key, value in dist.getJavaProperties().items(): javaProperties[key] = value if distCpEntry.isJdkLibrary() or distCpEntry.isJreLibrary(): cpPath = distCpEntry.classpath_repr(mx.get_jdk(), resolve=True) else: cpPath = distCpEntry.classpath_repr(resolve=True) if cpPath: collector[cpPath] = None javaPropertiesToAdd = OrderedDict() providers = OrderedDict() suite_collector(mx.primary_suite(), create_filter("META-INF/services/org.graalvm.polyglot.tck.LanguageProvider"), providers, javaPropertiesToAdd, set()) languages = OrderedDict() suite_collector(mx.primary_suite(), create_filter("META-INF/truffle/language"), languages, javaPropertiesToAdd, set()) suite_collector(mx.primary_suite(), lambda dist: dist.isJARDistribution() and "TRUFFLE_TCK_INSTRUMENTATION" == dist.name and exists(dist.path), languages, javaPropertiesToAdd, set()) vmArgs, mainClass, mainClassArgs = config cpIndex, cpValue = mx.find_classpath_arg(vmArgs) cpBuilder = OrderedDict() if cpValue: for cpElement in cpValue.split(os.pathsep): cpBuilder[cpElement] = None for providerCpElement in providers: cpBuilder[providerCpElement] = None if _is_graalvm(mx.get_jdk()): common = OrderedDict() suite_collector(mx.primary_suite(), lambda dist: dist.isJARDistribution() and "TRUFFLE_TCK_COMMON" == dist.name and exists(dist.path), common, javaPropertiesToAdd, set()) tpIndex, tpValue = find_path_arg(vmArgs, '-Dtruffle.class.path.append=') tpBuilder = OrderedDict() if tpValue: for cpElement in tpValue.split(os.pathsep): tpBuilder[cpElement] = None for langCpElement in languages: tpBuilder[langCpElement] = None bpIndex, bpValue = find_path_arg(vmArgs, '-Xbootclasspath/a:') bpBuilder = OrderedDict() if bpValue: for cpElement in bpValue.split(os.pathsep): bpBuilder[cpElement] = None for bootCpElement in common: bpBuilder[bootCpElement] = None cpBuilder.pop(bootCpElement, None) tpBuilder.pop(bootCpElement, None) tpValue = '-Dtruffle.class.path.append=' + os.pathsep.join((e for e in tpBuilder)) if tpIndex: vmArgs[tpIndex] = tpValue else: vmArgs.append(tpValue) bpValue = '-Xbootclasspath/a:' + os.pathsep.join((e for e in bpBuilder)) if bpIndex: vmArgs[bpIndex] = bpValue else: vmArgs.append(bpValue) else: for langCpElement in languages: cpBuilder[langCpElement] = None cpValue = os.pathsep.join((e for e in cpBuilder)) if cpIndex: vmArgs[cpIndex] = cpValue else: vmArgs.append("-cp") vmArgs.append(cpValue) for key, value in javaPropertiesToAdd.items(): vmArgs.append("-D" + key + "=" + value) return (vmArgs, mainClass, mainClassArgs)