public StackSlotAccessor buildAccessThisMember(ASTool.Token matchtoken, CompileEnv env)
        {
            if (!(member is VariableBase))
            {
                throw new BuildException(new BuildError(
                                             matchtoken.line, matchtoken.ptr,
                                             matchtoken.sourceFile, "包外数据期望一个Variable"));
            }

            VariableBase var = (VariableBase)member;

            var eax_member = env.getAdditionalRegister();

            eax_member.setEAXTypeWhenCompile(var.valueType);



            OpStep op = new OpStep(OpCode.link_outpackagevairable,
                                   new SourceToken(matchtoken.line, matchtoken.ptr, matchtoken.sourceFile));

            op.reg      = eax_member;
            op.regType  = eax_member.valueType;
            op.arg1     = var;
            op.arg1Type = var.valueType;

            op.arg2     = new ASBinCode.rtData.RightValue(new ASBinCode.rtData.rtInt(outscopeclass.classid));
            op.arg2Type = RunTimeDataType.rt_int;


            env.block.opSteps.Add(op);



            return(eax_member);
        }
        public LeftValueBase buildAccessThisMember(ASTool.Token matchtoken, CompileEnv env)
        {
            if (
                !(classMember.bindField is VariableBase)
                &&
                env.block.scope is ASBinCode.scopes.FunctionScope &&
                env.block.scope.parentScope is ASBinCode.scopes.ObjectInstanceScope
                &&
                ((ASBinCode.scopes.ObjectInstanceScope)env.block.scope.parentScope)._class == static_class._class
                )
            {
                return((LeftValueBase)classMember.bindField);
            }
            else
            {
                OpStep stepInitClass = new OpStep(OpCode.init_staticclass,
                                                  new SourceToken(matchtoken.line, matchtoken.ptr, matchtoken.sourceFile));
                stepInitClass.arg1 = new ASBinCode.rtData.RightValue(
                    new ASBinCode.rtData.rtInt(static_class._class.instanceClass.classid));
                stepInitClass.arg1Type = static_class._class.getRtType();
                env.block.opSteps.Add(stepInitClass);

                var _buildin_  = static_class;
                var eax_member = env.getAdditionalRegister();
                eax_member.setEAXTypeWhenCompile(classMember.valueType);

                eax_member._regMember       = classMember;
                eax_member._regMemberSrcObj = _buildin_;

                AccessBuilder.make_dotStep(env, classMember, matchtoken, eax_member, _buildin_);

                return(eax_member);
            }
        }
        public void build_class(CompileEnv env,
                                ASBinCode.rtti.Class _class,
                                ASTool.Token token, Builder builder,
                                StackSlotAccessor outeax,
                                List <ASTool.AS3.Expr.AS3DataStackElement> args
                                )
        {
            //***查找构造函数**
            if (_class.constructor != null)
            {
                MethodGetterBase field = (MethodGetterBase)_class.constructor.bindField; //(Field)builder._classbuildingEnv[_class].block.scope.members[_class.constructor.index];
                int blockid            = field.refdefinedinblockid;

                var signature =
                    builder.dictSignatures[blockid][field];

                FuncCallBuilder funcbuilder = new FuncCallBuilder();
                funcbuilder.createParaOp(args, signature, token, env, field, builder, true, _class);
            }
            else
            {
                OpStep opMakeArgs = new OpStep(OpCode.prepare_constructor_argement,
                                               new SourceToken(token.line, token.ptr, token.sourceFile));
                opMakeArgs.arg1     = new ASBinCode.rtData.RightValue(new ASBinCode.rtData.rtInt(_class.classid));
                opMakeArgs.arg1Type = RunTimeDataType.rt_int;
                env.block.opSteps.Add(opMakeArgs);
            }

            OpStep op = new OpStep(OpCode.new_instance, new SourceToken(token.line, token.ptr, token.sourceFile));

            op.arg1     = new RightValue(new rtInt(_class.classid));
            op.arg1Type = _class.getRtType();

            outeax.setEAXTypeWhenCompile(_class.getRtType());
            op.reg     = outeax;
            op.regType = _class.getRtType();

            env.block.opSteps.Add(op);
        }
        public void build_class(CompileEnv env,
                                ASBinCode.rtti.Class _class,
                                ASTool.Token token, Builder builder,
                                StackSlotAccessor outeax,
                                List <ASTool.AS3.Expr.AS3DataStackElement> args
                                )
        {
            var _cls = _class;

            if (_cls.staticClass == null)
            {
                _cls = _cls.instanceClass;
            }
            if (_cls.isLink_System)
            {
                OpStep stepInitClass = new OpStep(OpCode.init_staticclass,
                                                  new SourceToken(token.line, token.ptr, token.sourceFile));
                stepInitClass.arg1 = new ASBinCode.rtData.RightValue(
                    new ASBinCode.rtData.rtInt(_cls.classid));
                stepInitClass.arg1Type = _cls.staticClass.getRtType();
                env.block.opSteps.Add(stepInitClass);
            }

            //***查找构造函数**
            if (_class.constructor != null)
            {
                MethodGetterBase field = (MethodGetterBase)_class.constructor.bindField; //(Field)builder._classbuildingEnv[_class].block.scope.members[_class.constructor.index];
                int blockid            = field.refdefinedinblockid;

                var signature =
                    builder.dictSignatures[blockid][field];

                FuncCallBuilder funcbuilder = new FuncCallBuilder();
                OpStep          opMakeArgs  = null;
                funcbuilder.createParaOp(out opMakeArgs, args, signature, token, env, field, builder, true, _class);

                if (_cls.isLink_System)
                {
                    if (signature.parameters.Count == 0)
                    {
                        opMakeArgs.opCode    = OpCode.prepare_constructor_argement_linksystem;
                        opMakeArgs.memregid1 = 0;
                    }
                    else
                    {
                        bool canconvert = true;
                        for (int i = 0; i < signature.parameters.Count; i++)
                        {
                            if (signature.parameters[i].defaultValue != null || signature.parameters[i].isPara)
                            {
                                canconvert = false;
                            }
                        }
                        if (canconvert)
                        {
                            opMakeArgs.opCode    = OpCode.prepare_constructor_argement_linksystem;
                            opMakeArgs.memregid1 = (short)signature.parameters.Count;
                        }
                    }
                }
            }
            else
            {
                OpStep opMakeArgs = new OpStep(OpCode.prepare_constructor_argement,
                                               new SourceToken(token.line, token.ptr, token.sourceFile));
                opMakeArgs.arg1     = new ASBinCode.rtData.RightValue(new ASBinCode.rtData.rtInt(_class.classid));
                opMakeArgs.arg1Type = RunTimeDataType.rt_int;
                env.block.opSteps.Add(opMakeArgs);

                if (_cls.isLink_System)
                {
                    opMakeArgs.opCode    = OpCode.prepare_constructor_argement_linksystem;
                    opMakeArgs.memregid1 = 0;
                }
            }

            OpStep op = new OpStep(OpCode.new_instance, new SourceToken(token.line, token.ptr, token.sourceFile));

            op.arg1     = new RightValue(new rtInt(_class.classid));
            op.arg1Type = _class.getRtType();

            outeax.setEAXTypeWhenCompile(_class.getRtType());
            op.reg     = outeax;
            op.regType = _class.getRtType();

            env.block.opSteps.Add(op);
        }
        public static List <ASBinCode.rtti.Class> findClassFromImports(string t,
                                                                       Builder builder, ASTool.Token token)
        {
            List <ASBinCode.rtti.Class> result = new List <ASBinCode.rtti.Class>();

            if (!builder.isEval)
            {
                if (t.StartsWith("Vector.<"))
                {
                    ASBinCode.rtti.Class outvectortype = null;
                    t = builder.build_vector(t, token, out outvectortype);    //如果是Vector,则先编译Vector类

                    result.Add(outvectortype);
                    return(result);
                }
            }



            //***查找类定义***
            //if (builder._buildingClass.Count > 0)
            //{
            //    //***查找是否是当前类的包外类
            //    var cls = builder._buildingClass.Peek();
            //    if (cls.mainClass == null)
            //    {
            //        //***查找当前类的包外类***
            //        foreach (var item in builder.buildingclasses)
            //        {
            //            if (item.Value.mainClass == cls)
            //            {
            //                if (item.Value.name.Equals(cls.name + "$" + t, StringComparison.Ordinal))
            //                {
            //                    result.Add(item.Value);
            //                    //return ASBinCode.RunTimeDataType.unknown;
            //                }
            //            }
            //        }
            //    }
            //}

            if (builder._currentImports.Count > 0)
            {
                //**查找当前导入的类
                var imports = builder._currentImports.Peek();

                for (int i = 0; i < imports.Count; i++)
                {
                    if (imports[i].isPackageFunction)
                    {
                        continue;
                    }
                    if (t.IndexOf(".") > -1 && !t.StartsWith("Vector.<"))                     //完全限定名
                    {
                        if ((imports[i].package + "." + imports[i].name).Equals(t, StringComparison.Ordinal))
                        {
                            result.Add(imports[i]);
                        }
                    }
                    else
                    {
                        string name = imports[i].name;

                        if (name.Equals(t, StringComparison.Ordinal))
                        {
                            result.Add(imports[i]);
                        }
                    }
                }
            }



            return(result);
        }
        public static List <ASBinCode.rtti.Class> findPackageFunction(string t,
                                                                      Builder builder, ASTool.Token token)
        {
            List <ASBinCode.rtti.Class> result = new List <ASBinCode.rtti.Class>();

            if (!builder.isEval)
            {
                if (t.StartsWith("Vector.<"))
                {
                    return(result);
                }
            }

            if (builder.buildingclasses.Count > 0)
            {
                //在所有类中查找
                List <ASBinCode.rtti.Class> imports = new List <ASBinCode.rtti.Class>();
                foreach (var item in builder.buildingclasses)
                {
                    imports.Add(item.Value);
                }


                for (int i = 0; i < imports.Count; i++)
                {
                    if (!imports[i].isPackageFunction)
                    {
                        continue;
                    }

                    if (t.IndexOf(".") > -1 && !t.StartsWith("Vector.<"))                     //完全限定名
                    {
                        if ((imports[i].package + "." + imports[i].name).Equals(t, StringComparison.Ordinal))
                        {
                            result.Add(imports[i]);
                        }
                    }
                    else
                    {
                        string name = imports[i].name;

                        if (name.Equals(t, StringComparison.Ordinal))
                        {
                            result.Add(imports[i]);
                        }
                    }
                }
            }



            return(result);
        }
        public static List <ASBinCode.rtti.Class> findPackageFunctionFromImports(string t,
                                                                                 Builder builder, ASTool.Token token)
        {
            List <ASBinCode.rtti.Class> result = new List <ASBinCode.rtti.Class>();

            if (!builder.isEval)
            {
                if (t.StartsWith("Vector.<"))
                {
                    return(result);
                }
            }

            if (builder._currentImports.Count > 0)
            {
                //**查找当前导入的类
                var imports = builder._currentImports.Peek();

                for (int i = 0; i < imports.Count; i++)
                {
                    if (!imports[i].isPackageFunction)
                    {
                        continue;
                    }

                    if (t.IndexOf(".") > -1 && !t.StartsWith("Vector.<"))                     //完全限定名
                    {
                        if ((imports[i].package + "." + imports[i].name).Equals(t, StringComparison.Ordinal))
                        {
                            result.Add(imports[i]);
                        }
                    }
                    else
                    {
                        string name = imports[i].name;

                        if (name.Equals(t, StringComparison.Ordinal))
                        {
                            result.Add(imports[i]);
                        }
                    }
                }
            }



            return(result);
        }
        /// <summary>
        /// 从源代码的类型字符串中转换成运行时类型
        /// </summary>
        /// <param name="t"></param>
        /// <returns></returns>
        public static ASBinCode.RunTimeDataType fromSourceCodeStr(
            string t,
            ASTool.Token token,
            Builder builder
            )
        {
            if (t == "*" || t == "void")
            {
                return(rt.rt_void);
            }
            else if (t == "Boolean")
            {
                return(rt.rt_boolean);
            }
            else if (t == "int")
            {
                return(ASBinCode.RunTimeDataType.rt_int);
            }
            else if (t == "uint")
            {
                return(ASBinCode.RunTimeDataType.rt_uint);
            }
            else if (t == "Number")
            {
                return(ASBinCode.RunTimeDataType.rt_number);
            }
            else if (t == "String")
            {
                return(ASBinCode.RunTimeDataType.rt_string);
            }
            else if (t == "Function")
            {
                return(ASBinCode.RunTimeDataType.rt_function);
            }
            else if (t == "Array")
            {
                return(rt.rt_array);
            }
            else
            {
                //***查找类定义***
                var found = findClassFromImports(t, builder, token);


                if (found.Count == 1)
                {
                    return(found[0].getRtType()); // ASBinCode.RunTimeDataType.unknown;
                }
                else if (found.Count > 1)
                {
                    throw new BuildException(token.line, token.ptr, token.sourceFile,
                                             "类型" + t + "不明确."
                                             );
                }
                else
                {
                    throw new BuildException(token.line, token.ptr, token.sourceFile,
                                             "类型" + t + "未实现"
                                             );
                }
            }
        }
示例#9
0
        public static void make_dotStep(CompileEnv env, ASBinCode.rtti.ClassMember member, ASTool.Token token,
                                        StackSlotAccessor eax, RightValueBase rvObj
                                        )
        {
            OpStep op = new OpStep(
                member.bindField is MethodGetterBase ?
                OpCode.access_method
                                :
                OpCode.access_dot

                , new SourceToken(token.line, token.ptr, token.sourceFile));


            RightValueBase field = (RightValueBase)member.bindField;



            op.reg      = eax; eax._isDotAccessTarget = true;
            op.regType  = eax.valueType;
            op.arg1     = rvObj;
            op.arg1Type = rvObj.valueType;
            op.arg2     = field;
            op.arg2Type = member.valueType;

            env.block.opSteps.Add(op);
        }
        public static ASBinCode.IMember find(string name, CompileEnv env, bool isStaticMember, Builder builder, ASTool.Token token)
        {
            //List<IScope> findpath = new List<IScope>();
            //List<IScope> outscopes = new List<IScope>();//查找顺序,最后查找包外代码

            //Dictionary<IScope, ASBinCode.rtti.Class> finderclass = new Dictionary<IScope, ASBinCode.rtti.Class>();



            //{
            //    ASBinCode.rtti.Class defineClass = null;
            //    IScope s = env.block.scope;
            //    while (s !=null)
            //    {
            //        if (s is ASBinCode.scopes.ObjectInstanceScope)
            //        {
            //            ASBinCode.rtti.Class cls = ((ASBinCode.scopes.ObjectInstanceScope)s)._class;
            //            if (isStaticMember && cls.staticClass != null)
            //            {
            //                cls = cls.staticClass;
            //            }
            //            if (defineClass == null)
            //            {
            //                defineClass = cls;
            //                if (cls.mainClass != null)
            //                {
            //                    defineClass = cls.mainClass;
            //                }

            //            }
            //        }
            //        finderclass.Add(s,defineClass);

            //        if (s is ASBinCode.scopes.OutPackageMemberScope && !(ReferenceEquals(s,env.block.scope)))
            //        {
            //            outscopes.Add(s);

            //        }
            //        else
            //        {
            //            findpath.Add(s);
            //        }

            //        s = s.parentScope;
            //    }

            //    findpath.AddRange(outscopes);
            //}



            //ASBinCode.IScope scope = null;
            //for (int j = 0; j < findpath.Count; j++)
            //{
            //    scope = findpath[j];

            //    if (scope is ASBinCode.scopes.ObjectInstanceScope)
            //    {
            //        //查找类方法
            //        ASBinCode.rtti.Class cls = ((ASBinCode.scopes.ObjectInstanceScope)scope)._class;

            //        var fm = ASBinCode.ClassMemberFinder.find(cls, name, finderclass[scope]);
            //        if (fm != null)
            //        {
            //            return fm.bindField;
            //        }

            //    }

            //    if (!(scope is ASBinCode.scopes.OutPackageMemberScope)
            //        ||
            //        (
            //            finderclass[scope] == null
            //            ||
            //            ((ASBinCode.scopes.OutPackageMemberScope)scope).mainclass == finderclass[scope]
            //        )
            //        )
            //    {
            //        //从后往前找。可解决catch块同名变量e问题
            //        for (int i = scope.members.Count - 1; i >= 0; i--)
            //        {
            //            if (scope.members[i].name == name
            //                )
            //            {
            //                return scope.members[i].clone();
            //            }
            //        }
            //    }


            //}
            bool skipoutpackagescope = false;

            ASBinCode.rtti.Class defineClass = null;

            ASBinCode.IScope scope = env.block.scope;

            while (scope != null)
            {
                if (scope is ASBinCode.scopes.ObjectInstanceScope)
                {
                    //查找类方法
                    ASBinCode.rtti.Class cls = ((ASBinCode.scopes.ObjectInstanceScope)scope)._class;

                    if (defineClass == null)
                    {
                        defineClass = cls;
                    }

                    if (!isStaticMember && cls.staticClass == null)
                    {
                        defineClass         = defineClass.instanceClass;
                        skipoutpackagescope = true;
                        break;
                    }
                    else
                    {
                        var fm = ASBinCode.ClassMemberFinder.find(cls, name, defineClass);
                        if (fm != null)
                        {
                            return(fm.bindField);
                        }
                        else
                        {
                            break;
                        }
                    }
                }

                if (!(scope is ASBinCode.scopes.OutPackageMemberScope)
                    ||
                    (
                        defineClass == null
                        ||
                        ((ASBinCode.scopes.OutPackageMemberScope)scope).mainclass == defineClass
                    )
                    )
                {
                    //从后往前找。可解决catch块同名变量e问题
                    for (int i = scope.members.Count - 1; i >= 0; i--)
                    {
                        if (scope.members[i].name == name
                            )
                        {
                            return(scope.members[i].clone());
                        }
                    }
                }
                scope = scope.parentScope;
            }

            //***如果成员未找到,查找@__buildin__//
            if (!env.isEval)
            {
                var buildin = TypeReader.findClassFromImports("@__buildin__", builder, token);
                if (buildin.Count == 1)
                {
                    var bi = buildin[0].staticClass;

                    var member = ClassMemberFinder.find(bi, name, bi);
                    if (member != null && !(member.bindField is ClassPropertyGetter) && member.inheritFrom == null
                        &&
                        member.name != "Object"
                        )
                    {
                        FindStaticMember sm = new FindStaticMember();
                        sm.classMember  = member;
                        sm.static_class = new StaticClassDataGetter(bi);

                        return(sm);
                        //return member.bindField;
                    }
                }
            }

            //***在静态成员中查找***
            var findstaticclass = defineClass;


            while (findstaticclass != null && findstaticclass.staticClass != null)
            {
                var bi     = findstaticclass.staticClass;
                var member = ClassMemberFinder.find(bi, name, defineClass.staticClass);
                if (member != null)
                {
                    if (member != null && member.bindField is ClassPropertyGetter && name == "prototype")
                    {
                        throw new BuildException(token.line, token.ptr, token.sourceFile, "Access of possibly undefined property prototype.");
                    }

                    FindStaticMember sm = new FindStaticMember();
                    sm.classMember  = member;
                    sm.static_class = new StaticClassDataGetter(bi);


                    return(sm);
                    //return member.bindField;
                }
                findstaticclass = findstaticclass.super;
            }

            if (skipoutpackagescope)
            {
                return(null);
            }


            if (defineClass != null && defineClass.mainClass != null)
            {
                defineClass = defineClass.mainClass;
            }

            //***在包外代码中查找****
            if (defineClass != null && defineClass.staticClass != null)
            {
                IScope outpackagescope = null;

                if (defineClass.mainClass == null)
                {
                    outpackagescope =
                        builder._class_outScopeBlock[defineClass].scope;
                }
                else
                {
                    outpackagescope =
                        builder._class_outScopeBlock[defineClass.mainClass].scope;
                }

                for (int i = outpackagescope.members.Count - 1; i >= 0; i--)
                {
                    if (outpackagescope.members[i].name == name
                        )
                    {
                        //return outpackagescope.members[i].clone();
                        FindOutPackageScopeMember fo = new FindOutPackageScopeMember();
                        fo.member = outpackagescope.members[i].clone();


                        fo.outscopeclass = ((ASBinCode.scopes.OutPackageMemberScope)outpackagescope).mainclass;

                        return(fo);
                        //return fo;
                    }
                }
            }



            return(null);
        }