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 17:46:00 GMT
I'm typing to much (correction).

The CmcJSEmitter is used to "Generate an ABC file equivalent to the  
input syntax tree."

NOT

traverse. The CmcJSEmitter traverses the AST and creates the SWF that  
is then used to create the JS output.

Mike


Quoting Michael Schmalle <apache@teotigraphix.com>:

> 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
>>
>>
>
> -- 
> Michael Schmalle - Teoti Graphix, LLC
> http://www.teotigraphix.com
> http://blog.teotigraphix.com
>
>

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


Mime
View raw message