private void OverrideFlexAppInitialize(AbcInstance instance) { var name = Abc.DefineName(QName.Global("initialize")); instance.DefineMethod( Sig.@virtual(name, AvmTypeCode.Void).@override(), code => { code.LoadThis(); code.Add(InstructionCode.Callsupervoid, name, 0); code.Trace("PFC: calling App.initialize"); //Alert(code, "App Initialize!!!"); code.ReturnVoid(); }); }
void BuildSystemManagerInfo(AbcFile abc, AbcInstance instance) { var objType = abc.BuiltinTypes.Object; if (_cacheInfoObject) { var method = instance.DefineMethod(Sig.@this("$info$", objType), null); _compiler.AddLateMethod(method, BuildSystemManagerInfo); var infoField = instance.DefineSlot("__info", AvmTypeCode.Object); instance.DefineMethod( Sig.@virtual("info", objType).@override(), code => { code.LoadThis(); code.GetProperty(infoField); var br = code.IfNotNull(); code.LoadThis(); code.LoadThis(); code.Call(method); code.SetProperty(infoField); br.BranchTarget = code.Label(); code.LoadThis(); code.GetProperty(infoField); code.ReturnValue(); }); } else { var method = instance.DefineMethod(Sig.@virtual("info", objType).@override(), null); _compiler.AddLateMethod(method, BuildSystemManagerInfo); } }
//Called when GetTypeId method is used. public AbcMethod DefineGetTypeIdMethod(IType type, AbcInstance instance) { if (type == null) { return(null); } if (instance == null) { return(null); } if (instance.IsNative) { return(null); } if (instance.IsInterface) { return(null); } if (instance.IsForeign) { return(null); } var abc = instance.Abc; if (IsSwf) { if (!((IEnumerable <AbcFile>)SwfCompiler.AbcFrames).Contains(abc)) { return(null); } } else { if (abc != Abc) { return(null); } } string name1 = Const.GetTypeId; var name = abc.DefineName(QName.Global(name1)); var trait = instance.Traits.FindMethod(name); if (trait != null) { return(trait.Method); } var method = instance.DefineMethod( Sig.@virtual(name, AvmTypeCode.Int32), code => code.ReturnTypeId(type)); method.Trait.IsOverride = IsOverrideGetTypeId(type, instance); //File.AppendAllText("c:\\GetTypeId.txt", type.FullName + "\n"); if (type.Is(SystemTypeCode.Exception)) { //DefinePrototype_GetType(instance, type); var getTypeId = _generator.Corlib.GetMethod(ObjectMethodId.GetTypeId); instance.DefineMethod(Sig.@from(getTypeId).@override(false), code => code.ReturnTypeId(type)); var prototype = _generator.Corlib.GetMethod(ObjectMethodId.GetType); instance.DefineMethod(Sig.@from(prototype).@override(false), code => { code.CallAssemblyGetType( () => { code.LoadThis(); code.Call(getTypeId); } ); code.ReturnValue(); }); } return(method); }
/* Base Method Code * public function create(... params):Object * { * var mainClassName:String = info()["mainClassName"]; * * if (mainClassName == null) * { * var url:String = loaderInfo.loaderURL; * var dot:int = url.lastIndexOf("."); * var slash:int = url.lastIndexOf("/"); * mainClassName = url.substring(slash + 1, dot); * } * * var mainClass:Class = Class(getDefinitionByName(mainClassName)); * * return mainClass ? new mainClass() : null; * } */ /* Flex Auto Generated Code * public override function create(... params):Object * { * if (params.length > 0 && !(params[0] is String)) * return super.create.apply(this, params); * * var mainClassName:String = params.length == 0 ? "AppName" : String(params[0]); * var mainClass:Class = Class(getDefinitionByName(mainClassName)); * if (!mainClass) * return null; * * var instance:Object = new mainClass(); * if (instance is IFlexModule) * (IFlexModule(instance)).moduleFactory = this; * return instance; * } */ void BuildSystemManagerCreate(AbcFile abc, AbcInstance instance) { var method = instance.DefineMethod( Sig.@virtual("create", AvmTypeCode.Object).@override(), code => { var typeString = abc.DefineName(QName.Global("String")); var typeClass = abc.DefineName(QName.Global("Class")); //NOTE: getDefinitionByName is method of mx.core.SystemManager var getDefByName = abc.DefineName(QName.Global("getDefinitionByName")); const int argParams = 1; const int varClassName = 2; const int varClass = 3; const int varInstance = 4; code.PushThisScope(); code.GetLocal(argParams); code.GetArrayLengthInt(); code.PushInt(0); var gotoCheckString = code.If(BranchOperator.GreaterThan); code.PushString(MainClassName); code.SetLocal(varClassName); var gotoCreate1 = code.Goto(); //check string block var checkString = code.Label(); gotoCheckString.BranchTarget = checkString; //params[0] code.GetNativeArrayItem(argParams, 0); code.Getlex(typeString); code.Add(InstructionCode.Istypelate); //if not str goto calling of super.create var ifNotStr = code.IfFalse(); code.FindPropertyStrict(typeString); code.GetNativeArrayItem(argParams, 0); code.Call(typeString, 1); code.CoerceString(); code.SetLocal(varClassName); var gotoCreate2 = code.Goto(); //super.create.apply(this, params) block var superCreate = code.Label(); ifNotStr.BranchTarget = superCreate; code.LoadThis(); code.GetSuper("create"); code.LoadThis(); code.GetLocal(argParams); code.ApplyFunction(2); code.ReturnValue(); //instance creation block gotoCreate1.BranchTarget = gotoCreate2.BranchTarget = code.Label(); // resolve class by name using SystemManager.getDefinitionByName //code.Trace("PFX_SYSMGR: try to resolve class using SystemManager.getDefinitionByName"); code.FindPropertyStrict(typeClass); code.LoadThis(); code.GetLocal(varClassName); code.Call(getDefByName, 1); code.Call(typeClass, 1); code.Coerce(typeClass); code.SetLocal(varClass); code.GetLocal(varClass); var ifClassNotNull1 = code.IfTrue(); // try to resolve class using flash.system.ApplicationDomain.currentDomain //code.Trace("PFX_SYSMGR: try to resolve class using flash.system.ApplicationDomain.currentDomain"); code.FindPropertyStrict(typeClass); GetCurrentAppDomain(code); code.GetLocal(varClassName); code.Call(abc.DefineName(QName.Global("getDefinition")), 1); code.Call(typeClass, 1); code.Coerce(typeClass); code.SetLocal(varClass); code.GetLocal(varClass); var ifClassNotNull2 = code.IfTrue(); code.Trace(string.Format("PFX_SYSMGR: unable to resolve class '{0}'", MainClassName)); code.ReturnNull(); ifClassNotNull1.BranchTarget = ifClassNotNull2.BranchTarget = code.Label(); // create instance of class was resolved succesfully code.GetLocal(varClass); code.Add(InstructionCode.Construct, 0); code.Add(InstructionCode.Coerce_o); code.SetLocal(varInstance); //if (instance is mx.core.IFlexModule) code.GetLocal(varInstance); var flexModule = _compiler.ImportType(abc, MX.IFlexModule); code.Getlex(flexModule); code.Add(InstructionCode.Istypelate); var gotoReturn = code.IfFalse(); //((IFlexModule)instance).moduleFactory = this code.FindPropertyStrict(flexModule.Name); code.GetLocal(varInstance); code.Call(flexModule.Name, 1); code.LoadThis(); code.SetPublicProperty("mx.core:IFlexModule", "moduleFactory"); gotoReturn.BranchTarget = code.Label(); code.GetLocal(varInstance); code.ReturnValue(); }); method.Flags |= AbcMethodFlags.NeedRest; }