Exemple #1
0
        public static RunTimeValueBase getDefaultParameterValue(ASBinCode.rtti.FunctionSignature signature,int i)
        {
            var dt = signature.parameters[i].type;
            var dv = signature.parameters[i].defaultValue.getValue(null,null);

            return(getDefaultParameterValue(dt,dv));
        }
Exemple #2
0
        public bool createParaScope()
        {
            if (toCallFunc.isNative)
            {
                //if (toCallFunc.native_index < 0)
                //{
                //    toCallFunc.native_index = player.swc.nativefunctionNameIndex[toCallFunc.native_name];
                //}
                //var nf = player.swc.nativefunctions[toCallFunc.native_index];
                var nf = player.swc.getNativeFunction(toCallFunc.functionid);
                if (nf == null)
                {
                    invokerFrame.throwAneException(token,"函数 " + toCallFunc.name + "([" + toCallFunc.native_name + "])" + "的本地代码没找到");
                    invokerFrame.endStep();
                    if (callbacker != null)
                    {
                        callbacker.noticeRunFailed();
                    }
                    release();
                    return(false);
                }
                nf.bin = player.swc;
                if (nf.mode == NativeFunctionBase.NativeFunctionMode.const_parameter_0)
                {
                    nativefuncs.NativeConstParameterFunction func = ((nativefuncs.NativeConstParameterFunction)nf);


                    if (/*invokerFrame.offset +
                         *          invokerFrame.block.totalRegisters + 1 + 1 +
                         *          invokerFrame.call_parameter_slotCount*/invokerFrame.baseBottomSlotIndex + invokerFrame.call_parameter_slotCount + func.TotalArgs >= Player.STACKSLOTLENGTH)
                    {
                        invokerFrame.throwError(new error.InternalError(invokerFrame.player.swc,token,"stack overflow"));
                        invokerFrame.endStep();
                        if (callbacker != null)
                        {
                            callbacker.noticeRunFailed();
                        }
                        release();

                        return(false);
                    }
                    invokerFrame.call_parameter_slotCount += func.TotalArgs;
                    onstackparametercount = func.TotalArgs;

                    func.prepareParameter(toCallFunc,invokerFrame.stack,invokerFrame.baseBottomSlotIndex + invokerFrame.call_parameter_slotCount /*invokerFrame.offset +
                                                                                                                                                  * invokerFrame.block.totalRegisters + 1 + 1 + invokerFrame.call_parameter_slotCount*/- onstackparametercount);

                    return(true);
                }
            }

            ASBinCode.rtti.FunctionSignature signature = toCallFunc.signature;


            if (invokerFrame.baseBottomSlotIndex + invokerFrame.call_parameter_slotCount + signature.onStackParameters  /*invokerFrame.offset +
                                                                                                                         * invokerFrame.block.totalRegisters + 1 + 1 +
                                                                                                                         * invokerFrame.call_parameter_slotCount+signature.onStackParameters*/>= Player.STACKSLOTLENGTH)
            {
                invokerFrame.throwError(new error.InternalError(invokerFrame.player.swc,token,"stack overflow"));
                invokerFrame.endStep();
                if (callbacker != null)
                {
                    callbacker.noticeRunFailed();
                }
                release();

                return(false);
            }
            invokerFrame.call_parameter_slotCount += signature.onStackParameters;
            onstackparametercount = signature.onStackParameters;

            CallFuncHeap =
                player.genHeapFromCodeBlock(player.swc.blocks[toCallFunc.blockid]);

            var parameters = signature.parameters; int len = parameters.Count;

            for (int i = 0; i < len; i++)
            {
                var parameter = parameters[i];
                if (parameter.defaultValue != null)
                {
                    var dv = getDefaultParameterValue(signature,i);

                    _storeArgementToSlot(i,dv);
                }
                else if (parameter.isPara)
                {
                    _storeArgementToSlot(i,new ASBinCode.rtData.rtArray());
                }
                //else
                //{
                //    _storeArgementToSlot(i, ASBinCode.rtData.rtUndefined.undefined);
                //}
            }

            return(true);
        }
        private void copyInheritsFromImplements(ASBinCode.rtti.Class cls, Builder builder)
        {
            foreach (var supercls in cls.implements.Keys)
            {
                for (int i = 0; i < supercls.classMembers.Count; i++)
                {
                    var sm = supercls.classMembers[i];
                    var bf = sm.bindField;
                    if (bf is InterfaceMethodGetter)
                    {
                        var sig = builder.dictSignatures[((InterfaceMethodGetter)bf).refdefinedinblockid][bf];


                        InterfaceMethodGetter ifm =
                            new InterfaceMethodGetter(bf.name, cls, ((InterfaceMethodGetter)bf).refdefinedinblockid);
                        ifm.setLinkMethod((InterfaceMethodGetter)bf);

                        bf = ifm;

                        if (!builder.dictSignatures.ContainsKey(ifm.refdefinedinblockid))
                        {
                            builder.dictSignatures.Add(ifm.refdefinedinblockid, new Dictionary <IMember, ASBinCode.rtti.FunctionSignature>());
                        }

                        builder.dictSignatures[ifm.refdefinedinblockid].Add(ifm, sig);
                    }
                    else if (bf is ClassPropertyGetter)
                    {
                        ClassPropertyGetter cg = new ClassPropertyGetter(bf.name, cls, cls.classMembers.Count);
                        cg.valueType = ((ClassPropertyGetter)bf).valueType;
                        cg.getter    = ((ClassPropertyGetter)bf).getter;
                        cg.setter    = ((ClassPropertyGetter)bf).setter;
                        bf           = cg;
                    }

                    ASBinCode.rtti.ClassMember member = new ASBinCode.rtti.ClassMember(sm.name, cls, bf);
                    member.defaultValue  = sm.defaultValue;
                    member.isConst       = false;
                    member.isConstructor = false;
                    member.isGetter      = sm.isGetter;
                    member.isInternal    = false;
                    member.isOverride    = false;
                    member.isFinal       = false;
                    member.isPrivate     = false;
                    member.isProtectd    = false;
                    member.isPublic      = true;
                    member.isSetter      = sm.isSetter;
                    member.isStatic      = false;
                    member.setTypeWhenCompile(sm.valueType);

                    member.virtualLink = sm;
                    //member.virtualLinkFromClass = supercls;

                    if (sm.inheritFrom == null)
                    {
                        member.inheritFrom = supercls;
                    }
                    else
                    {
                        member.inheritFrom = sm.inheritFrom;
                    }
                    if (sm.inheritSrcMember == null)
                    {
                        member.inheritSrcMember = sm;
                    }
                    else
                    {
                        member.inheritSrcMember = sm.inheritSrcMember;
                    }

                    bool iskip = false;
                    for (int m = 0; m < cls.classMembers.Count; m++)
                    {
                        var om = cls.classMembers[m];

                        ASTool.AS3.IAS3Stmt stmt = null;

                        if (om.name == member.name)
                        {
                            if (om.bindField is ClassPropertyGetter || member.bindField is ClassPropertyGetter)
                            {
                                if (om.bindField is ClassPropertyGetter && member.bindField is ClassPropertyGetter)
                                {
                                    iskip = true;
                                    break;
                                }
                                else
                                {
                                    foreach (var item in builder.buildingclasses)
                                    {
                                        if (item.Value == cls)
                                        {
                                            stmt = item.Key;
                                        }
                                    }

                                    throw new BuildException(
                                              new BuildError(stmt.Token.line, stmt.Token.ptr, stmt.Token.sourceFile,
                                                             "重复的接口成员,一个是访问器一个不是 " + cls.name + ":" + member.name)
                                              );
                                }
                            }

                            ASBinCode.rtti.FunctionSignature sig = null;
                            //**检查签名***
                            if (om.inheritFrom == null)
                            {
                                sig  = builder.dictSignatures[cls.blockid][om.bindField];
                                stmt = builder._buildingmembers[om];
                            }
                            else
                            {
                                sig  = builder.dictSignatures[om.inheritFrom.blockid][om.inheritSrcMember.bindField];
                                stmt = builder._buildingmembers[om.inheritSrcMember];
                            }

                            ASBinCode.rtti.FunctionSignature sig2 = null;
                            if (member.inheritFrom == null)
                            {
                                sig2 = builder.dictSignatures[cls.blockid][member.bindField];
                            }
                            else
                            {
                                sig2 = builder.dictSignatures[member.inheritFrom.blockid][member.inheritSrcMember.bindField];
                            }



                            //***检查2个接口签名完全匹配***
                            if (om.isGetter != member.isGetter || om.isSetter != member.isSetter)
                            {
                                throw new BuildException(
                                          new BuildError(stmt.Token.line, stmt.Token.ptr, stmt.Token.sourceFile,
                                                         "重复的接口成员,访问器类型不匹配" + member.refClass.name + "::" + member.name)
                                          );
                            }
                            else if (sig.returnType != sig2.returnType)
                            {
                                throw new BuildException(
                                          new BuildError(stmt.Token.line, stmt.Token.ptr, stmt.Token.sourceFile,
                                                         "重复的接口成员,签名不匹配" + member.refClass.name + "::" + member.name)
                                          );
                            }
                            else if (sig.parameters.Count != sig2.parameters.Count)
                            {
                                throw new BuildException(
                                          new BuildError(stmt.Token.line, stmt.Token.ptr, stmt.Token.sourceFile,
                                                         "重复的接口成员,签名不匹配" + member.refClass.name + "::" + member.name)
                                          );
                            }
                            else
                            {
                                //***比较所有参数***
                                for (int j = 0; j < sig.parameters.Count; j++)
                                {
                                    if (sig.parameters[j].type != sig2.parameters[j].type
                                        ||
                                        sig.parameters[j].isPara != sig2.parameters[j].isPara
                                        )
                                    {
                                        throw new BuildException(
                                                  new BuildError(stmt.Token.line, stmt.Token.ptr, stmt.Token.sourceFile,
                                                                 "重复的接口成员,签名不匹配" + member.refClass.name + "::" + member.name)
                                                  );
                                    }
                                }
                            }

                            //***检查通过,跳过这次添加***
                            iskip = true;
                        }
                    }
                    if (!iskip)
                    {
                        cls.classMembers.Add(member);
                    }
                }
            }

            //***拷贝完成,重新确认propertygetersetter,并设定索引***
            for (int i = 0; i < cls.classMembers.Count; i++)
            {
                var m = cls.classMembers[i];
                if (m.bindField is ClassPropertyGetter)
                {
                    ClassPropertyGetter pg = (ClassPropertyGetter)m.bindField;
                    //if (pg._class == cls)
                    {
                        pg.getter = null;
                        pg.setter = null;
                        for (int j = 0; j < cls.classMembers.Count; j++)
                        {
                            if (cls.classMembers[j].name == "@" + pg.name + "_get")
                            {
                                pg.getter = (InterfaceMethodGetter)cls.classMembers[j].bindField;
                            }
                            else if (cls.classMembers[j].name == "@" + pg.name + "_set")
                            {
                                pg.setter = (InterfaceMethodGetter)cls.classMembers[j].bindField;
                            }
                        }
                    }
                }
                else
                {
                    InterfaceMethodGetter ig = (InterfaceMethodGetter)m.bindField;
                    ig.setIndexMember(i, cls);
                }
            }
        }