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
> >> >>>
> >
> >
>
>

Reply via email to