SAM interface/class figures [Re: Preparing for the 0.2 draft]
Mark Mahieu
markmahieu at googlemail.com
Wed Feb 3 13:21:35 PST 2010
I may be wrong, but I seem to recall that openjdk mailing lists strip attachments by default. Might be worthwhile requesting that's changed for lambda-dev if so.
Mark
On 3 Feb 2010, at 21:06, Alex Buckley wrote:
> Sorry, unclear wording. In your mail about OpenJDK 6 stats, there was no
> mention of a utility to gather stats. The mail about OpenJDK 6 stats,
> which you repeated below, got through fine the first time.
>
> Neal Gafter wrote:
>> On Wed, Feb 3, 2010 at 12:55 PM, Alex Buckley <Alex.Buckley at sun.com> wrote:
>>> What code are you talking about? There was nothing in your mail about
>>> OpenJDK 6 stats.
>>
>> Perhaps I'm having moderation problems. Enclosed are the stats I
>> thought I had sent.
>>
>> ---------- Forwarded message ----------
>> From: Neal Gafter <neal at gafter.com>
>> Date: Mon, Feb 1, 2010 at 12:58 AM
>> Subject: Re: Preparing for the 0.2 draft
>> To: Alex Buckley <Alex.Buckley at sun.com>
>> Cc: "lambda-dev at openjdk.java.net" <lambda-dev at openjdk.java.net>
>>
>>
>> I ran the stats for openjdk6 sources, but not quite as you asked. I
>> started answering questions that filter out those anons that couldn't
>> possibly be lambdas for one reason or another, and then answered the
>> rest of the interesting questions from among those. It isn't
>> interesting to know which anonymous inner classes use "this" if they
>> couldn't be lambdas because there are, for example, constructor
>> arguments.
>>
>> So here are the stats:
>>
>> Total anonymous classes: 1155
>> But with no constructor args: 1068
>> And defining only one method: 883
>> And where the type is a SAM type: 811
>> Those that are recursive: 0
>> Those that reference 'this': 2 (see below)
>> Those that reference an enclosing 'this': 48
>> Those that are interfaces: 752
>> Those that are classes: 59
>> Total distinct interfaces: 50 (see below)
>> Total distinct classes: 13 (see below)
>>
>> A couple of interesting things about the use cases exposed by this analysis:
>>
>> There is virtually no utility to making "this" refer to the function
>> itself. In the two cases where "this" appears, one does not actually
>> use the value (null would work as well), and the other could be
>> trivially rewritten using the proposed definite-assignment rule for a
>> lambda appearing in a variable initializer. None of the anonymous
>> SAMs are recursive. On the other hand, there are a fair number of
>> explicit references to the instance of the enclosing class, which
>> would benefit from lexical scoping.
>>
>> I also note that the use cases involving classes do not suffer from
>> lexically scoped lambdas because they can continue to be written
>> exactly as they are today. Even the proposed lambda spec does not
>> provide typesafe access to the underlying SAM type, so I can't see
>> anywhere this code base would benefit from lambdas in which "this"
>> references the function object rather than the lexically enclosing
>> instance.
>>
>> Since Josh hadn't seen any use cases that benefit from lexical scoping
>> of "this", I've also enclosed pointers to 48 locations in the openjdk6
>> source base.
>>
>> ====================================
>> Below are shown the two places where "this" appears.
>>
>> The first would be easily solved by a rule treating a variable as
>> definitely assigned in the right-hand-side of its declaration if the
>> initializing expression is a delegate.
>>
>> In the second, "null" would work just as well as "this", because the
>> value is discarded by the caller (on the next line).
>>
>> in src/share/classes/sun/java2d/StateTrackableDelegate.java:
>> public synchronized StateTracker getStateTracker() {
>> StateTracker st = theTracker;
>> if (st == null) {
>> switch (theState) {
>> case IMMUTABLE:
>> st = StateTracker.ALWAYS_CURRENT;
>> break;
>> case STABLE:
>> st = new StateTracker() {
>> public boolean isCurrent() {
>> return (theTracker == this);
>> }
>> };
>> break;
>> ....
>>
>> in src/share/classes/javax/imageio/spi/IIORegistry.java
>> PrivilegedAction doRegistration =
>> new PrivilegedAction() {
>> public Object run() {
>> Iterator categories = getCategories();
>> while (categories.hasNext()) {
>> Class<IIOServiceProvider> c = (Class)categories.next();
>> for (IIOServiceProvider p :
>> ServiceLoader.loadInstalled(c)) {
>> registerServiceProvider(p);
>> }
>> }
>> return this;
>> }
>> };
>> AccessController.doPrivileged(doRegistration);
>>
>> ====================================
>> Below are all the distinct classes
>>
>> com.sun.tools.example.debug.tty.Commands.AsyncExecution
>> com.sun.tools.hat.internal.model.AbstractJavaHeapObjectVisitor
>> com.sun.tools.hat.internal.util.Comparer
>> java.awt.font.TextLine.Function
>> java.io.InputStream
>> java.io.OutputStream
>> java.lang.Thread
>> java.nio.charset.CoderResult.Cache
>> java.util.TimerTask
>> java.util.regex.Pattern.CharProperty
>> java.util.regex.Pattern.CharPropertyNames.CharPropertyFactory
>> java.util.regex.Pattern.CharPropertyNames.CloneableProperty
>> javax.swing.AbstractAction
>>
>>
>> ====================================
>> Below are all the distinct interfaces
>>
>> com.sun.java.util.jar.pack.Histogram.BitMetric
>> com.sun.jdi.connect.Transport
>> com.sun.jmx.remote.internal.NotificationBufferFilter
>> com.sun.media.sound.ModelTransform
>> com.sun.net.ssl.HostnameVerifier
>> com.sun.security.auth.callback.DialogCallbackHandler.Action
>> com.sun.tools.example.debug.bdi.InputListener
>> com.sun.tools.example.debug.bdi.OutputListener
>> com.sun.tools.example.debug.expr.ExpressionParser.GetFrame
>> com.sun.tools.hat.internal.oql.ObjectVisitor
>> com.sun.tools.jdi.CommandSender
>> com.sun.tools.script.shell.Main.Command
>> java.awt.Conditional
>> java.awt.KeyEventPostProcessor
>> java.awt.event.ActionListener
>> java.awt.event.HierarchyListener
>> java.beans.ExceptionListener
>> java.beans.PropertyChangeListener
>> java.beans.VetoableChangeListener
>> java.io.FilenameFilter
>> java.io.ObjectInputValidation
>> java.lang.Runnable
>> java.net.CookiePolicy
>> java.net.HttpCookie.CookieAttributeAssignor
>> java.security.PrivilegedAction
>> java.security.PrivilegedExceptionAction
>> java.util.Comparator
>> java.util.Enumeration
>> java.util.concurrent.Callable
>> java.util.concurrent.Executor
>> java.util.concurrent.ThreadFactory
>> javax.imageio.event.IIOReadWarningListener
>> javax.imageio.event.IIOWriteWarningListener
>> javax.management.NotificationListener
>> javax.swing.UIDefaults.ActiveValue
>> javax.swing.UIDefaults.LazyValue
>> javax.swing.event.CaretListener
>> javax.swing.event.ChangeListener
>> javax.swing.event.HyperlinkListener
>> javax.xml.crypto.KeySelectorResult
>> javax.xml.crypto.NodeSetData
>> sun.awt.RequestFocusController
>> sun.java2d.StateTracker
>> sun.java2d.cmm.ProfileActivator
>> sun.java2d.loops.ProcessPath.EndSubPathHandler
>> sun.misc.JavaIODeleteOnExitAccess
>> sun.misc.JavaLangAccess
>> sun.misc.JavaNetAccess
>> sun.nio.ch.FileChannelImpl.FileLockTable.Releaser
>> sun.nio.ch.Interruptible
>>
>>
>> ====================================
>>
>> Locations in openjdk6 where lexically-scoped "this" would be helpful:
>>
>> src/share/classes/com/sun/java/util/jar/pack/Histogram.java:187
>> src/share/classes/com/sun/media/sound/SoftJitterCorrector.java:126
>> src/share/classes/com/sun/security/auth/PolicyFile.java:849
>> src/share/classes/com/sun/tools/example/debug/bdi/JDIEventSource.java:80
>> src/share/classes/com/sun/tools/jdi/ClassTypeImpl.java:167
>> src/share/classes/com/sun/tools/jdi/ClassTypeImpl.java:189
>> src/share/classes/com/sun/tools/jdi/ObjectReferenceImpl.java:341
>> src/share/classes/java/awt/Container.java:2744
>> src/share/classes/java/awt/Container.java:4268
>> src/share/classes/java/awt/Container.java:4283
>> src/share/classes/java/awt/EventQueue.java:823
>> src/share/classes/java/awt/SequencedEvent.java:92
>> src/share/classes/java/awt/datatransfer/Clipboard.java:128
>> src/share/classes/java/awt/datatransfer/Clipboard.java:326
>> src/share/classes/java/beans/beancontext/BeanContextSupport.java:1296
>> src/share/classes/java/beans/beancontext/BeanContextSupport.java:1310
>> src/share/classes/java/lang/Class.java:1306
>> src/share/classes/java/nio/channels/spi/AbstractSelector.java:208
>> src/share/classes/java/security/ProtectionDomain.java:317
>> src/share/classes/java/util/regex/Pattern.java:3352
>> src/share/classes/javax/management/monitor/Monitor.java:1609
>> src/share/classes/javax/swing/BufferStrategyPaintManager.java:213
>> src/share/classes/javax/swing/JComponent.java:4804
>> src/share/classes/javax/swing/JOptionPane.java:1011
>> src/share/classes/javax/swing/JOptionPane.java:1524
>> src/share/classes/javax/swing/ProgressMonitor.java:214
>> src/share/classes/javax/swing/SwingWorker.java:902
>> src/share/classes/javax/swing/TimerQueue.java:95
>> src/share/classes/javax/swing/plaf/basic/BasicLookAndFeel.java:2123
>> src/share/classes/javax/swing/plaf/basic/BasicPopupMenuUI.java:745
>> src/share/classes/javax/swing/plaf/basic/BasicPopupMenuUI.java:778
>> src/share/classes/javax/swing/text/JTextComponent.java:4932
>> src/share/classes/sun/applet/AppletClassLoader.java:631
>> src/share/classes/sun/applet/AppletViewer.java:641
>> src/share/classes/sun/awt/datatransfer/SunClipboard.java:113
>> src/share/classes/sun/awt/datatransfer/SunClipboard.java:287
>> src/share/classes/sun/awt/im/InputContext.java:648
>> src/share/classes/sun/security/jca/ProviderConfig.java:244
>> src/share/classes/sun/security/provider/SeedGenerator.java:255
>> src/share/classes/sun/tools/jconsole/inspector/XSheet.java:181
>> src/share/classes/sun/tools/jconsole/inspector/XSheet.java:216
>> src/share/classes/sun/tools/jconsole/inspector/XSheet.java:329
>> src/share/classes/sun/tools/jconsole/inspector/XSheet.java:371
>> src/share/classes/sun/tools/jconsole/inspector/XSheet.java:411
>> src/share/classes/sun/tools/jconsole/inspector/XSheet.java:668
>> src/share/classes/sun/tools/jconsole/inspector/XSheet.java:686
>> src/share/classes/sun/tools/jconsole/inspector/XTree.java:159
>> src/share/classes/sun/tools/jconsole/inspector/XTree.java:261
>>
>
More information about the lambda-dev
mailing list