Esempio n. 1
0
        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();
            });
        }
Esempio n. 2
0
        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);
            }
        }
Esempio n. 3
0
        //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);
        }
Esempio n. 4
0
        /* 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;
        }