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