protected final void codegenInfoMethod()

in compiler/src/main/java/org/apache/royale/compiler/internal/targets/RoyaleTarget.java [261:520]


    protected final void codegenInfoMethod(ClassGeneratorHelper classGen,
            Integer compatibilityVersion,
            String mainClassQName,
            IResolvedQualifiersReference preloaderReference,
            IResolvedQualifiersReference runtimeDPIProviderReference,
            FlexSplashScreenImage splashScreen,
            IASNode rootNode,
            ITargetAttributes targetAttributes,
            Collection<String> compiledLocales,
            RoyaleFrame1Info frame1Info,
            Set<String> accessibilityClassNames,
            String royaleInitClassName,
            String stylesClassName,
            List<String> rsls,
            FlexRSLInfo rslInfo,
            Collection<ICompilerProblem> problemCollection,
            boolean isAppFlexInfo,
            boolean isFlexSDKInfo, 
            Map<ClassDefinition, String> remoteClassAliasMap) 
            throws InterruptedException
    {
        IResolvedQualifiersReference applicationDomainRef = ReferenceFactory.packageQualifiedReference(royaleProject.getWorkspace(),
                IASLanguageConstants.ApplicationDomain);
        IResolvedQualifiersReference infoSlotReference;
        if (isAppFlexInfo)
        {
            NamespaceDefinition.IStaticProtectedNamespaceDefinition staticNSDef = NamespaceDefinition.createStaticProtectedNamespaceDefinition("");
            infoSlotReference = ReferenceFactory.resolvedQualifierQualifiedReference(royaleProject.getWorkspace(),
                    staticNSDef, "_info");            
        }
        else
        {
            NamespaceDefinition.IPrivateNamespaceDefinition privateNSDef = NamespaceDefinition.createPrivateNamespaceDefinition("");
            infoSlotReference = ReferenceFactory.resolvedQualifierQualifiedReference(royaleProject.getWorkspace(),
                    privateNSDef, "info");
        }
        Name infoSlotName = infoSlotReference.getMName();

        InstructionList info = new InstructionList();
        info.addInstruction(ABCConstants.OP_getlocal0);
        info.addInstruction(ABCConstants.OP_getproperty, infoSlotName);
        info.addInstruction(ABCConstants.OP_dup);
        Label infoL1 = new Label();
        info.addInstruction(ABCConstants.OP_iftrue, infoL1);

        int infoEntries = 0;
        
        // currentDomain:
        info.addInstruction(ABCConstants.OP_pop);
        info.addInstruction(ABCConstants.OP_pushstring, "currentDomain");
        info.addInstruction(ABCConstants.OP_getlex, applicationDomainRef.getMName());
        info.addInstruction(ABCConstants.OP_getproperty, new Name("currentDomain"));
        infoEntries++;

        // frames:
        if (targetSettings.getFrameLabels() != null && !targetSettings.getFrameLabels().isEmpty())
        {
            Collection<FrameInfo> frames = targetSettings.getFrameLabels();
            info.addInstruction(ABCConstants.OP_pushstring, "frames");
            for (FrameInfo frame : frames)
            {
                info.addInstruction(ABCConstants.OP_pushstring, frame.getLabel());
                info.addInstruction(ABCConstants.OP_convert_s);
                info.addInstruction(ABCConstants.OP_pushstring, frame.getFrameClasses().get(0));
            }
            info.addInstruction(ABCConstants.OP_newobject, frames.size());
            infoEntries++;
        }

        // royaleVersion:
        if (compatibilityVersion != null)
        {
            info.addInstruction(ABCConstants.OP_pushstring, "royaleVersion");
            info.addInstruction(ABCConstants.OP_pushstring, compatibilityVersion);
            infoEntries++;
        }
        
        // mark this SWF as being built with Royale
        info.addInstruction(ABCConstants.OP_pushstring, "isMXMLC");
        info.addInstruction(ABCConstants.OP_pushfalse);
        infoEntries++;
        
        // mainClassName:
        if (mainClassQName != null)
        {
            info.addInstruction(ABCConstants.OP_pushstring, "mainClassName");
            info.addInstruction(ABCConstants.OP_pushstring, mainClassQName);
            infoEntries++;
        }

        if (!isAppFlexInfo && isFlexSDKInfo)
        {
            // preloader:
            if (preloaderReference != null && preloaderReference.resolve(royaleProject) != null)
            {
                info.addInstruction(ABCConstants.OP_pushstring, ATTRIBUTE_PRELOADER);
                info.addInstruction(ABCConstants.OP_getlex, preloaderReference.getMName());
                infoEntries++;            
            }
            
            // runtimeDPIProvider:
            if (runtimeDPIProviderReference != null && runtimeDPIProviderReference.resolve(royaleProject) != null)
            {
                info.addInstruction(ABCConstants.OP_pushstring, ATTRIBUTE_RUNTIME_DPI_PROVIDER);
                info.addInstruction(ABCConstants.OP_getlex, runtimeDPIProviderReference.getMName());
                infoEntries++;            
            }
            
            // splashScreenImage:
            if (splashScreen.generatedEmbedClassReference != null)
            {
                info.addInstruction(ABCConstants.OP_pushstring, ATTRIBUTE_SPLASH_SCREEN_IMAGE);
                info.addInstruction(ABCConstants.OP_getlex, splashScreen.generatedEmbedClassReference.getMName());
                infoEntries++;            
            }
            
            // Add various root node attributes:
            infoEntries += codegenRootNodeAttributes(targetAttributes, info, rootNode, problemCollection);
            
            // compiledLocales:
            if (compiledLocales != null)
            {
                info.addInstruction(ABCConstants.OP_pushstring, "compiledLocales");
                for(String locale : compiledLocales)
                    info.addInstruction(ABCConstants.OP_pushstring, locale);
                info.addInstruction(ABCConstants.OP_newarray, compiledLocales.size());
                infoEntries++;            
            }
    
            // compiledResourceBundleNames:
            if (!frame1Info.compiledResourceBundleNames.isEmpty())
            {
                info.addInstruction(ABCConstants.OP_pushstring, "compiledResourceBundleNames");
                for(String bundleName : frame1Info.compiledResourceBundleNames)
                    info.addInstruction(ABCConstants.OP_pushstring, bundleName);
                info.addInstruction(ABCConstants.OP_newarray, frame1Info.compiledResourceBundleNames.size());
                infoEntries++;            
            }
        }
        
        // styleDataClassName
        if (stylesClassName != null)
        {
            info.addInstruction(ABCConstants.OP_pushstring, "styleDataClassName");
            info.addInstruction(ABCConstants.OP_pushstring, stylesClassName);            
            infoEntries++;            
        }
        
        // mixins:
        if (royaleInitClassName != null)
        {
            info.addInstruction(ABCConstants.OP_pushstring, "mixins");
            info.addInstruction(ABCConstants.OP_pushstring, royaleInitClassName);
            int mixinEntries = 1;
            final Set<String> mixinClassNames = frame1Info.getMixins();
            for (String className : frame1Info.getMixins())
                info.addInstruction(ABCConstants.OP_pushstring, className);
                
            mixinEntries += mixinClassNames.size();
            
            info.addInstruction(ABCConstants.OP_newarray, mixinEntries);
            infoEntries++;            
        }

        if (remoteClassAliasMap != null && !remoteClassAliasMap.isEmpty())
        {
            info.addInstruction(ABCConstants.OP_pushstring, "remoteClassAliases");
            for (Map.Entry<ClassDefinition, String> classAliasEntry : remoteClassAliasMap.entrySet())
            {
                info.addInstruction(ABCConstants.OP_pushstring, classAliasEntry.getKey().getQualifiedName());
                info.addInstruction(ABCConstants.OP_convert_s);
                String value = classAliasEntry.getValue();
                info.addInstruction(ABCConstants.OP_pushstring, value);
            }
            info.addInstruction(ABCConstants.OP_newobject, remoteClassAliasMap.size());
            infoEntries++;
        }
        
        // fonts:
        if (!frame1Info.embeddedFonts.isEmpty())
        {
            info.addInstruction(ABCConstants.OP_pushstring, "fonts");
            for (Entry<String, RoyaleFontInfo> entry : frame1Info.embeddedFonts.entrySet())
            {
                info.addInstruction(ABCConstants.OP_pushstring, entry.getKey());
                info.addInstruction(ABCConstants.OP_convert_s);
                RoyaleFontInfo fontInfo = entry.getValue();
                info.addInstruction(ABCConstants.OP_pushstring, "regular");
                info.addInstruction(fontInfo.regularOp);
                info.addInstruction(ABCConstants.OP_pushstring, "bold");
                info.addInstruction(fontInfo.boldOp);
                info.addInstruction(ABCConstants.OP_pushstring, "italic");
                info.addInstruction(fontInfo.italicOp);
                info.addInstruction(ABCConstants.OP_pushstring, "boldItalic");
                info.addInstruction(fontInfo.boldItalicOp);
                info.addInstruction(ABCConstants.OP_newobject, 4);
            }
            info.addInstruction(ABCConstants.OP_newobject, frame1Info.embeddedFonts.size());
            infoEntries++;
        }

        // accessibility classes
        if (accessibilityClassNames != null && accessibilityClassNames.size() > 0)
        {
            info.addInstruction(ABCConstants.OP_pushstring, "accessibilityClassNames");
            for (String className : accessibilityClassNames)
                info.addInstruction(ABCConstants.OP_pushstring, className);

            info.addInstruction(ABCConstants.OP_newarray, accessibilityClassNames.size());
            infoEntries++;
        }
        
        // cdRSLs and placeholderRSLs:
        if (!rslInfo.requiredRSLs.isEmpty())
        {
            // Note: The Flex framework spells this info property as Rsl, not RSL.
            if (codegenRSLsEntry(info, problemCollection, "cdRsls", rslInfo.requiredRSLs))
                infoEntries++;
            
            // Note: The Flex framework spells this info property as Rsl, not RSL.
            if (codegenRSLsEntry(info, problemCollection, "placeholderRsls", rslInfo.placeholderRSLs))
                infoEntries++;
        }

        // rsls:
        if (codegenLegacyRSLs(info, rsls))
            infoEntries++;

        // Create a new info object from all of the entries.
        info.addInstruction(ABCConstants.OP_newobject, infoEntries);
        info.addInstruction(ABCConstants.OP_dup);
        info.addInstruction(ABCConstants.OP_getlocal0);
        info.addInstruction(ABCConstants.OP_swap);
        info.addInstruction(ABCConstants.OP_setproperty, infoSlotName);
        info.labelNext(infoL1);
        info.addInstruction(ABCConstants.OP_returnvalue);

        ITraitsVisitor itraitsVisitor;
        ITraitVisitor infoSlotVisitor;
        if (isAppFlexInfo)
        {
            classGen.addCTraitsMethod(new Name("info"), Collections.<Name> emptyList(), 
                new Name("Object"), Collections.emptyList(), false, info);
            itraitsVisitor = classGen.getCTraitsVisitor();
            infoSlotVisitor = itraitsVisitor.visitSlotTrait(ABCConstants.TRAIT_Var, infoSlotName,
                    ITraitsVisitor.RUNTIME_SLOT, new Name(IASLanguageConstants.Object), LexicalScope.noInitializer);
        }
        else
        {
            classGen.addITraitsMethod(new Name("info"), Collections.<Name> emptyList(), 
                    new Name("Object"), Collections.emptyList(), false, true, true, info);
            itraitsVisitor = classGen.getITraitsVisitor();
            infoSlotVisitor = itraitsVisitor.visitSlotTrait(ABCConstants.TRAIT_Var, infoSlotName,
                    ITraitsVisitor.RUNTIME_SLOT, new Name(IASLanguageConstants.Object), LexicalScope.noInitializer);
        }
        
        infoSlotVisitor.visitStart();
        infoSlotVisitor.visitEnd();
 
    }