incubator-flex-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Alex Harui <aha...@adobe.com>
Subject Re: [FlaconJS] pseudo emitter algorithm
Date Thu, 29 Nov 2012 18:15:22 GMT
OK, I think I get it now.  Sounds like it is worth exploring.


On 11/29/12 10:02 AM, "Michael Schmalle" <apache@teotigraphix.com> wrote:

> Quoting Alex Harui <aharui@adobe.com>:
> 
>> So if I understand you, the notion of traits is a SWF thing?  The AST has
>> different representations maybe like member, variable, function?
> 
> Well yes and no.
> 
> Traits IS an SWF thing. The AST is represented by like IClassNode,
> IPackageNode etc.
> 
> Than we have an even more fun framework in the IDefinition like
> IClassDefinition which basically wraps the INode ast.
> 
> We also have the IScopeNode which then blocks our code into the scope chunks.
> 
> If we eliminate the SWF traits stuff and use IASNode or IDefinition
> API we would be solid and developers could easily get involved down
> the road.
> 
> PS i know there might be things I am over looking but Jangroo uses
> this method, we just have to have some analyzers and such I would
> imagine.
> 
> Theoretically using the IDefinition interfaces I could create that
> same MainCode.js output, which I am going to try and to.
> 
> The IDefinition API is were you get your supers, resolving classes,
> getting super class members etc.
> 
> Mike
> 
> 
> 
>> 
>> On 11/29/12 9:42 AM, "Michael Schmalle" <apache@teotigraphix.com> wrote:
>> 
>>> Quoting Alex Harui <aharui@adobe.com>:
>>> 
>>>> Very nice.  Have you figured out the role of the generated CMCEmitter in
>>>> this process?
>>> 
>>> Yes,
>>> 
>>> The CmcJSEmitter (autogenerated by cmc-js.jbg) is used to traverse the
>>> ISWF that is created.
>>> 
>>> The CmcJSEmitter and JSGeneratingReducer are created in the
>>> JSGenerator constructor.
>>> 
>>> The actual CmcJSEmitter is used during the
>>> JSClassDirectiveProcessor.delcareVariable() etc. methods.
>>> 
>>> Basically the processor is using the emitter to create SWF
>>> instructions that ultimately end up creating class traits. Once the
>>> tratis are created, they just keep getting recursively visited and
>>> more instructions created.
>>> 
>>> So it's like
>>> 
>>> - JSCompilationUnit.processABCBytesRequest()
>>>    - handleABCBytesRequest()
>>>    - JSGenerator.generate()
>>>      - then see below ....
>>> 
>>> When it gets to methods called declarePackage() for instance, block
>>> code instructions are created using the cmc emitter. Traits are then
>>> created based of them.
>>> 
>>> For FalconJS this process is totally bound to SWF format.
>>> 
>>> This was my point. For any developer to fix bugs here they have to
>>> know the SWF format. Which I don't.
>>> 
>>> This is why I propsed another solution using pure AST like Jangaroo does.
>>> 
>>> I am not skilled enough to understand the trade offs currently. But I
>>> am going to try and see if I can create the same JS code using a
>>> different algorithm.
>>> 
>>> Mike
>>> 
>>> 
>>> 
>>>> 
>>>> On 11/29/12 7:30 AM, "Michael Schmalle" <apache@teotigraphix.com> wrote:
>>>> 
>>>>> Hi,
>>>>> 
>>>>> For those asking question about "where to alter" code, it's not pretty
>>>>> but I think I know exactly what is going on now.
>>>>> 
>>>>> If you can understand below, you will now have some insight to where
>>>>> and how the JS code actually gets created.
>>>>> 
>>>>> 
>>>>> ! Call the compiler load config compile().
>>>>> 
>>>>> 
>>>>> JSGenerator.generate() - creates the package, class, member traits
>>>>> 
>>>>>   - DirectiveProcessor.processNode(IFileNode)
>>>>>     - recusrsivly fill traits
>>>>> 
>>>>> -----------------------------------------------------
>>>>> 
>>>>> Basically a snippet of the recursion;
>>>>> 
>>>>> DirectiveProcessor.processNode(IFileNode)
>>>>>    - declarePackage(PackageNode)
>>>>>      - emitter.visitPackage(packageName)
>>>>>      - data.registerPackage(packageName)
>>>>>      - super.declarePackage(PackageNode)
>>>>>        - DirectiveProcessor.traverse(p.getScopedNode()) <-
>>>>> ClassNode (class
>>>>> {})
>>>>>          - for each ClassNode.getChild(i)
>>>>>            - processNode(ScopedBlockNode)
>>>>>              - JSGlobalDirectiveProcessor.declareClass(ClassNode)
>>>>>                - verifyClassModifiers(ClassNode)
>>>>>                - skins
>>>>>                - JSClassDirectiveProcessor cp =
>>>>> backend.createClassDirectiveProcessor()
>>>>>                - cp.traverse(ClassNode.getScopedNode()) <- TypeScope
>>>>>                  - for each TypeScope.getChild(i)
>>>>>                    - processNode(TypeScope)
>>>>>                      -
>>>>> JSGlobalDirectiveProcessor.declareFunction(FunctionNode)
>>>>> 
>>>>> 
>>>>> --------------------------------------------------------
>>>>> 
>>>>> !!!!
>>>>> JavaScript source code creation after class traits have been traversed
>>>>> and created;
>>>>> 
>>>>> 
>>>>> JSEmiter.emit()
>>>>>    - emitClass(EmitterClassVisitor)
>>>>>      - IClassDefinition = getDefinition(ii.name)
>>>>>      - write class JSDoc
>>>>> 
>>>>> 
>>>>> 
>>>>> - JSEmitter.emitClass()
>>>>>    - Line: 3267 - 3269 is What creates a class
>>>>>      - "MainCode=adobe.extend("MainCode",Object,{ ... });"
>>>>> 
>>>>> 
>>>>> 
>>>>> - JSEmitter.emitInstanceTraits() is then called to write out the
>>>>> class traits
>>>>>    - emitTraits() is then called to do the specific if the closure
>>>>> compiler flag is not set
>>>>>      1. emitCtor() emit constructor
>>>>>       - emit comma
>>>>>      2. emit all variables before methods
>>>>>        - assembles the code "MainCode.foo"
>>>>>          - warns if there is a private namespace collision
>>>>>        -
>>>>>      3. emit all methods other than constructor
>>>>>        - emit ",\n"
>>>>>          - emitMethod()
>>>>>            - emitJSDocForMethod()
>>>>>            - write("\tget_baz")
>>>>>            - write(" : ") <- assignmentOp
>>>>>            - write("function(")
>>>>>              - emitParameters(methodInfo)
>>>>>                - write("baz")
>>>>>            - write(")")
>>>>>            - if (returnType != null)
>>>>>              - write(JSDoc for return type)
>>>>>            - if interface method
>>>>>              - write(" {};\n")
>>>>>            - else
>>>>>              - write("\n")
>>>>>              - write("  {")
>>>>>              - write("\n")
>>>>>              - emitMethodBody()
>>>>>                ... you get the drift
>>>>>              - write("  }")
>>>>> 
>>>>> - After all traits are written, control flow goes back to
>>>>> JSEmitter.emitClass() line 3269
>>>>>    - write("\n});\n\n") // end class
>>>>> - add _CLASS member to instance
>>>>>    - add JSDoc for prototype._CLASS
>>>>>    - write("MainCode.prototype._CLASS = MainCode;\n")
>>>>> 
>>>>> It will then go onto
>>>>>    - emitClassInfo()
>>>>>    - emitNamespaceInfo()
>>>>>    - emitJSONInfo()
>>>>> 
>>>>> if (JSSharedData.JS_FRAMEWORK_NAME)
>>>>>    - emitFrameworkInit();
>>>>> 
>>>>> It will then finally emit register class
>>>>>    - "adobe.classes.MainCode=MainCode;"
>>>>> 
>>>>> ---------------
>>>>> MainCode._PACKAGE=adobe.globals;MainCode._NAME="MainCode";
>>>>> MainCode._FULLNAME="MainCode";
>>>>> MainCode._SUPER=Object;
>>>>> MainCode._NAMESPACES={"foo::2":!0,"bar::7:MainCode":!0,"baz::2":!0,"baz::2
>>>>> ":
>>>>> !0
>>>>> };
>>>>> adobe.classes.MainCode=MainCode;
>>>>> ---------------
>>>>> 
>>>>> Mike
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>> 
>>>> --
>>>> Alex Harui
>>>> Flex SDK Team
>>>> Adobe Systems, Inc.
>>>> http://blogs.adobe.com/aharui
>>>> 
>>>> 
>> 
>> --
>> Alex Harui
>> Flex SDK Team
>> Adobe Systems, Inc.
>> http://blogs.adobe.com/aharui
>> 
>> 

-- 
Alex Harui
Flex SDK Team
Adobe Systems, Inc.
http://blogs.adobe.com/aharui


Mime
View raw message