diff mx.graal/mx_graal.py @ 22041:56c50504d60d

mx: removed JVMCI code from Distribution.make_archive
author Doug Simon <doug.simon@oracle.com>
date Sat, 20 Jun 2015 12:37:01 +0200
parents 434fbaaf53d7
children db48a62aba36 1ccd66f5890c
line wrap: on
line diff
--- a/mx.graal/mx_graal.py	Sat Jun 20 09:00:58 2015 +0200
+++ b/mx.graal/mx_graal.py	Sat Jun 20 12:37:01 2015 +0200
@@ -2343,6 +2343,47 @@
 
     mx.update_commands(suite, commands)
 
+class JVMCIArchiveParticipant:
+    def __init__(self, dist):
+        self.dist = dist
+        self.jvmciServices = {}
+
+    def __opened__(self, arc, srcArc, services):
+        self.services = services
+        self.arc = arc
+        self.expectedOptionsProviders = set()
+
+    def __add__(self, arcname, contents):
+        if arcname.startswith('META-INF/jvmci.services/'):
+            service = arcname[len('META-INF/jvmci.services/'):]
+            self.jvmciServices.setdefault(service, []).extend([provider for provider in contents.split('\n')])
+            return True
+        if arcname.startswith('META-INF/jvmci.providers/'):
+            provider = arcname[len('META-INF/jvmci.providers/'):]
+            for service in contents.split('\n'):
+                self.jvmciServices.setdefault(service, []).append(provider)
+            return True
+        elif arcname.startswith('META-INF/jvmci.options/'):
+            # Need to create service files for the providers of the
+            # com.oracle.jvmci.options.Options service created by
+            # com.oracle.jvmci.options.processor.OptionProcessor.
+            optionsOwner = arcname[len('META-INF/jvmci.options/'):]
+            provider = optionsOwner + '_Options'
+            self.expectedOptionsProviders.add(provider.replace('.', '/') + '.class')
+            #assert exists(providerClassfile), 'missing generated Options provider ' + providerClassfile
+            self.services.setdefault('com.oracle.jvmci.options.Options', []).append(provider)
+        return False
+
+    def __addsrc__(self, arcname, contents):
+        return False
+
+    def __closing__(self):
+        self.expectedOptionsProviders -= set(self.arc.zf.namelist())
+        assert len(self.expectedOptionsProviders) == 0, 'missing generated Options providers:\n  ' + '\n  '.join(self.expectedOptionsProviders)
+        for service, providers in self.jvmciServices.iteritems():
+            arcname = 'META-INF/jvmci.services/' + service
+            self.arc.zf.writestr(arcname, '\n'.join(providers))
+
 def mx_post_parse_cmd_line(opts):  #
     # TODO _minVersion check could probably be part of a Suite in mx?
     def _versionCheck(version):
@@ -2377,4 +2418,8 @@
                 if not jdkDist.partOfHotSpot:
                     _installDistInJdks(jdkDeployable)
             return _install
-        mx.distribution(jdkDist.name).add_update_listener(_close(jdkDist))
+        dist = mx.distribution(jdkDist.name)
+        dist.add_update_listener(_close(jdkDist))
+        if jdkDist.usesJVMCIClassLoader:
+            dist.set_archiveparticipant(JVMCIArchiveParticipant(dist))
+