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();
}