On Mon, Oct 6, 2014 at 2:57 PM, Alex Harui <aha...@adobe.com> wrote: > Hi Fred, > > I have no idea what the right answer is, but I was wondering if you could > try to describe (in AS code) what scenarios you want to support and not > support. Is this just for Singletons or are there other use cases? And > what edge cases are allowed, if any? > > For example, if you have code like: > > var c:Class = MySingleton; > var instance:MySingleton = new c(); > > what would you want to have happen? I¹d guess the compiler cannot check > it. > > Similarly, are there any AS Singleton patterns that are sufficient? Such > as: > > public class MySingleton > { > public function MySingleton(secretToken:SecretToken) > { > } > } > internal class SecretToken > { > } >
This partially works. I can still do: var instance:MySingleton = new MySingleton(null); I now need to add a null check in MySingleton's constructor and throw a runtime error if secretToken is null. Whereas, if private constructor is supported, this would be caught in compile time. Thanks, Om > > Maybe some metadata can cause the compiler to generate different AS that > is sufficient for your needs. You could even change any call to the > constructor from within the Singleton source code to some other function > that initializes the single instance. > > Thanks, > -Alex > > > On 10/6/14, 2:33 PM, "Frédéric THOMAS" <webdoubl...@hotmail.com> wrote: > > > > > > > > >Hi Gordon, Darrell, Alex, > > > >I've been able to work on it a bit tonight and realized that I was wrong, > >actually, I can get the right NS infos parsed and emitted but can't get > >it back thru the ABCParser. > >I've been confused because I didn't check the Qualifier NS but instead > >its kind which was 5 (private) as I wanted but it was actually the one of > >the CMImplicitNS (aka, invalid NS) and wasn,'t able to find in the chain > >where it has been forced as I thought having removed all the one > >implicated in defining a ctor NS, I wonder now if the fact that the ctor > >is not part of a trait is the cause ? > > > >Any way, I started to explore other possibilities, one of them is to pass > >the NS info via MetaTag as done for go_to_definition and use this info in > >the semantic checker as I can't at the time of the ABC Parsing, set the > >NS because the Metadata are checked after the methodbody and in more, > >I've got no info at this point about the super class except its name > >coming from InstanceInfo (or indirectly via IReference) but would like to > >think I can manage to use the MetaTag (like > >"[constructor(ns:'protected')] in the semantic checker, do you see any > >problem in doing so or if there's a better place and moment to do it > >except it could be erased by the optimiser ? > > > >The last possibility as I didn't see any drawback yet in debugging it in > >the emitter, is to pass the info directly in the name at FunctionNode > >construction time and either set the NS accordingly or use this info in > >the semantic checker, as far as I've debugged it (didn't to the test yet > >but followed all the emitter chain), I didn't see any problem that could > >be to emit it and don't think there are any in reading it either thru the > >ABCParser, I would pass for example pass "protected:MyConstructorName", > >tweak the FunctionNode:isConstructor accordingly and remove the > >CMImplitNS checks as I did until now, what do you think, do you see any > >problem with this approach ? > > > >More over if the latter appears to be a valid option, it could be used > >for the method overloading. > > > >Thanks, > >Frédéric THOMAS > > > >> Subject: Re: AW: [Falcon] Constructor NS (was: [Falcon] starting up) > >> From: gsmit...@hotmail.com > >> Date: Sun, 5 Oct 2014 09:24:14 -0700 > >> To: dev@flex.apache.org > >> > >> It's a bit different in that the AVM is strict about access modifiers; > >>you cannot use reflection to call a private method from outside its > >>class. However I know developers have wanted non-public constructors for > >>a long time and most won't care if they're not enforced at runtime, so I > >>don't object to the compiler enhancement. I just wanted to mention > >>something that folks should be aware of. > >> > >> Another thing to be aware of is that this mean there will be source > >>code that compiles under a Falcon that doesn't compile under the old > >>compiler. Would we change the old compiler as we'll or not bother? I'd > >>say don't bother. > >> > >> - Gordon > >> > >> > On Oct 5, 2014, at 8:09 AM, "Christofer Dutz" > >><christofer.d...@c-ware.de> wrote: > >> > > >> > But in java this is not much different. Unless you explicitly tell > >>your Java VM to be strict, you can get a private constructor via > >>Reflection, make this accesslible at runtime and instantiate it, no > >>matter what the source-code says. Same with the type of generics. > >> > > >> > So I guess it would be a great addition to Flex to at least have > >>features checked by the compiler, even if the runtime doesn't enforce it. > >> > > >> > Chris > >> > > >> > > >> > -----Ursprüngliche Nachricht----- > >> > Von: Gordon Smith [mailto:gsmit...@hotmail.com] > >> > Gesendet: Sonntag, 5. Oktober 2014 04:36 > >> > An: dev@flex.apache.org > >> > Betreff: Re: [Falcon] Constructor NS (was: [Falcon] starting up) > >> > > >> > In general the ActionScript Virtual Machine enforces access modifiers > >>(so that, for example, something marked private is truly inaccessible by > >>any means outside the class) but I don't think the AVM enforces > >>non-public constructors. I'm guessing that a constructor in the ABC is > >>public regardless of what the source code says, which would mean that > >>the constructor could be invoked by any code via reflection. If this is > >>the case, I'm not convinced we should pretend that constructors can be > >>non-public. > >> > > >> > - Gordon > >> > > >> > Sent from my iPad > >> > > >> >>> On Oct 4, 2014, at 4:14 PM, "OmPrakash Muppirala" > >><bigosma...@gmail.com> wrote: > >> >>> > >> >>> On Oct 4, 2014 12:55 PM, "Frédéric THOMAS" > >><webdoubl...@hotmail.com> wrote: > >> >>> > >> >>> Hi, > >> >>> > >> >>> I started to check if it was possible to have private and protected > >> >> constructor in Falcon and I have to admit it was tricky especially > >> >> because I never seen a compiler from inside before but it is > >> >> apparently possible, I've been able to compile successfully: > >> >>> package myLib { > >> >>> public class CTORTest { > >> >>> private var _p:int; > >> >>> > >> >>> private function CTORTest(p:int) { > >> >>> _p = p; > >> >>> } > >> >>> > >> >>> private function anotherFct():CTORTest { > >> >>> return new CTORTest(10); > >> >>> } > >> >>> } > >> >>> } > >> >>> and using the compiled lib: > >> >>> > >> >>> <?xml version="1.0"?> > >> >>> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" > >> >> xmlns:s="library://ns.adobe.com/flex/spark" > >> >> creationComplete="creationCompleteHandler(event)"> > >> >>> <fx:Script><![CDATA[ > >> >>> import mx.events.FlexEvent; > >> >>> > >> >>> import myLib.CTORTest; > >> >>> > >> >>> private function > >>creationCompleteHandler(event:FlexEvent):void { > >> >>> var a:CTORTest = new CTORTest(1); > >> >>> } > >> >>> ]]></fx:Script> > >> >>> </s:Application> > >> >>> > >> >>> gives: > >> >>> [Fault] exception, information=VerifyError: Error #1014: La classe > >> >> myLib:CTORTest::CTORTest est introuvable. (not found) with the > >>legacy > >> >> compiler > >> >>> and: > >> >>> F:\sources\falconTestDrive\shell\src\Main.mxml:9 > >> >>> Erreur: Appel d'une méthode qui ne semble pas définie CTORTest. > >>(Call > >> >>> to > >> >> a undefined method) > >> >>> var a:CTORTest = new CTORTest(1); > >> >>> > >> >>> (I will customize the error message later) > >> >>> > >> >>> I still need to check it works in the 3 possible ways to > >>instantiate > >> >>> a > >> >> Class [1] (at the moment it works only with 1st one), check that > >>works > >> >> with is / instanceOf, revisit the cast function accordingly and > >>maybe > >> >> other things not yet in my mind and especially check FP won't > >>complain using it. > >> >>> > >> >>> /* expression = FunctionCallID(KeywordNewID(void), new_type_name, > >> >> ContainerID(expression*)) */ > >> >>> /* expression = FunctionCallID(KeywordNewID(void), expression, > >> >> ContainerID(expression*)) */ > >> >>> /* expression = FunctionCallID(KeywordNewID(void), vector_literal, > >> >> ContainerID(void)) */ > >> >>> > >> >>> In case all this works and I'm far to know it at the moment, I will > >> >>> have > >> >> to think about implement "method overloading" otherwise I can't see > >> >> any usage of a protected constructor and therefore will probably > >> >> require some help for the best way to implement it. > >> >> > >> >> Exciting to see these kind of experiments. A really good usecase > >>for > >> >> private constructor would be to create a Singleton class, I.e a > >>class > >> >> that cannot be instantiated outside of itself. Would that be > >> >> something you can test for? > >> >> > >> >> Thanks, > >> >> Om > >> >> > >> >>> > >> >>> Thanks, > >> >>> Frédéric THOMAS > >> >>> > >> >>>> From: webdoubl...@hotmail.com > >> >>>> To: dev@flex.apache.org > >> >>>> Subject: RE: [Falcon] starting up > >> >>>> Date: Wed, 1 Oct 2014 16:57:28 +0100 > >> >>>> > >> >>>> Ah ok, thanks Gordon, I was tearing my hair out :-) > >> >>>> > >> >>>> Frédéric THOMAS > >> >>>> > >> >>>>> Subject: Re: [Falcon] starting up > >> >>>>> From: gsmit...@hotmail.com > >> >>>>> Date: Wed, 1 Oct 2014 08:51:16 -0700 > >> >>>>> To: dev@flex.apache.org > >> >>>>> > >> >>>>> That comment is out of date. Code Model was the part of pre-Falcon > >> >> Flash Builder that built an abstract syntax tree to support > >> >> intelligent editing. We used it as the beginning of Falcon's lexer > >>and > >> >> parser. The code is just looking at the AST to see if the > >>constructor > >> >> has a non-public namespace. > >> >>>>> > >> >>>>> - Gordon > >> >>>>> > >> >>>>>> On Oct 1, 2014, at 8:33 AM, "Frédéric THOMAS" < > >> >> webdoubl...@hotmail.com> wrote: > >> >>>>>> > >> >>>>>> > >> >>>>>> > >> >>>>>> > >> >>>>>> > >> >>>>>> > >> >>>>>> > >> >>>>>> I updated it to v17.0 and check in > >> >> falcon\compiler\generated\dist\sdk\lib\external, is there. > >> >>>>>> > >> >>>>>> oops, looking better, it has both, just removed the bad one, it > >> >> runs. > >> >>>>>> > >> >>>>>> Now, looking at > >>internal\as\codegen\ClassDirectiveProcessor.java, > >> >>>>>> I > >> >> see that: > >> >>>>>> > >> >>>>>> // If a constructor has a namespace as part of it's declaration, > >> >>>>>> it > >> >> must be declared public. > >> >>>>>> // It is ok to omit the namespace > >> >>>>>> // We must check the AST, as CM treats all ctors as public no > >> >> matter what the user typed in > >> >>>>>> // so the FunctionDefinition will always be in the public > >> >>>>>> namespace if( node.getActualNamespaceNode() != null && > >> >>>>>> node.getActualNamespaceNode().getName() != > >> >> IASKeywordConstants.PUBLIC) > >> >>>>>> problems.add(new > >> >> ConstructorMustBePublicProblem(node.getActualNamespaceNode())); > >> >>>>>> > >> >>>>>> What is the CM or Code Model ? > >> >>>>>> > >> >>>>>> Thanks, > >> >>>>>> Frédéric THOMAS > >> >>>>>> > >> >>>>>>> From: aha...@adobe.com > >> >>>>>>> To: dev@flex.apache.org > >> >>>>>>> Subject: Re: [Falcon] starting up > >> >>>>>>> Date: Wed, 1 Oct 2014 13:36:50 +0000 > >> >>>>>>> > >> >>>>>>> Could you have an old guava.jar? > >> >>>>>>> > >> >>>>>>>> On 10/1/14 4:32 AM, "Frédéric THOMAS" <webdoubl...@hotmail.com > > > >> >> wrote: > >> >>>>>>>> > >> >>>>>>>> Hi, > >> >>>>>>>> > >> >>>>>>>> I built it with ANT an ran Falcon compc.bat from the > >> >> generated/dist/sdk, > >> >>>>>>>> does anyone knows why I get that ? > >> >>>>>>>> > >> >>>>>>>> Exception in thread "main" java.lang.NoClassDefFoundError: > >> >>>>>>>> com/google/common/cache/CacheLoader > >> >>>>>>>> at > >> >>>>>>>> org.apache.flex.compiler.clients.MXMLC.<init>(MXMLC.java:379) > >> >>>>>>>> at org.apache.flex.compiler.clients.COMPC.<init>(COMPC.java:54) > >> >>>>>>>> at > >> >> > >>org.apache.flex.compiler.clients.COMPC.staticMainNoExit(COMPC.java:75) > >> >>>>>>>> at org.apache.flex.compiler.clients.COMPC.main(COMPC.java:63) > >> >>>>>>>> Caused by: java.lang.ClassNotFoundException: > >> >>>>>>>> com.google.common.cache.CacheLoader > >> >>>>>>>> at java.net.URLClassLoader$1.run(URLClassLoader.java:366) > >> >>>>>>>> at java.net.URLClassLoader$1.run(URLClassLoader.java:355) > >> >>>>>>>> at java.security.AccessController.doPrivileged(Native Method) > >> >>>>>>>> at java.net.URLClassLoader.findClass(URLClassLoader.java:354) > >> >>>>>>>> at java.lang.ClassLoader.loadClass(ClassLoader.java:424) > >> >>>>>>>> at > >> >>>>>>>> sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) > >> >>>>>>>> at java.lang.ClassLoader.loadClass(ClassLoader.java:357) > >> >>>>>>>> ... 4 more > >> >>>>>>>> > >> >>>>>>>> Thanks, > >> >>>>>>>> Frédéric THOMAS > >> >>> > > > > > >