incubator-flex-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Michael Schmalle <apa...@teotigraphix.com>
Subject Re: [FlaconJS] pseudo emitter algorithm
Date Thu, 29 Nov 2012 18:02:12 GMT
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
>
>

-- 
Michael Schmalle - Teoti Graphix, LLC
http://www.teotigraphix.com
http://blog.teotigraphix.com


Mime
View raw message