提交 3fa60f92 编写于 作者: P Paul Westcott 提交者: Kevin Ransom (msft)

Fix bug in seekReadMethodDefAsMethodDataUncached (#1704)

seekReadMethodDefAsMethodDataUncached didn't honour the total parameter
count of both the type object and the method object. If there was only
one, then the correct result would have been achieved, but when both
were specific it caused corruption of the resultant MethodData
structure.
上级 05913b0f
......@@ -1908,12 +1908,12 @@ let gparam_of_gactual (_ga:ILType) = mkILSimpleTypar "T"
let mkILFormalTypars (x: ILGenericArgsList) = List.map gparam_of_gactual x
let mkILFormalGenericArgs (gparams:ILGenericParameterDefs) =
List.mapi (fun n _gf -> mkILTyvarTy (uint16 n)) gparams
let mkILFormalGenericArgs numtypars (gparams:ILGenericParameterDefs) =
List.mapi (fun n _gf -> mkILTyvarTy (uint16 (numtypars + n))) gparams
let mkILFormalBoxedTy tref gparams = mkILBoxedTy tref (mkILFormalGenericArgs gparams)
let mkILFormalBoxedTy tref gparams = mkILBoxedTy tref (mkILFormalGenericArgs 0 gparams)
let mkILFormalNamedTy bx tref gparams = mkILNamedTy bx tref (mkILFormalGenericArgs gparams)
let mkILFormalNamedTy bx tref gparams = mkILNamedTy bx tref (mkILFormalGenericArgs 0 gparams)
// --------------------------------------------------------------------
// Operations on class etc. defs.
......
......@@ -1686,7 +1686,7 @@ val mkILFormalBoxedTy: ILTypeRef -> ILGenericParameterDef list -> ILType
val mkILFormalNamedTy: ILBoxity -> ILTypeRef -> ILGenericParameterDef list -> ILType
val mkILFormalTypars: ILType list -> ILGenericParameterDefs
val mkILFormalGenericArgs: ILGenericParameterDefs -> ILGenericArgsList
val mkILFormalGenericArgs: int -> ILGenericParameterDefs -> ILGenericArgsList
val mkILSimpleTypar : string -> ILGenericParameterDef
/// Make custom attributes.
val mkILCustomAttribMethRef:
......
......@@ -2222,8 +2222,6 @@ and seekReadMethodDefAsMethodData ctxt idx =
ctxt.seekReadMethodDefAsMethodData idx
and seekReadMethodDefAsMethodDataUncached ctxtH idx =
let ctxt = getHole ctxtH
let (_code_rva, _implflags, _flags, nameIdx, typeIdx, _paramIdx) = seekReadMethodRow ctxt idx
let nm = readStringHeap ctxt nameIdx
// Look for the method def parent.
let tidx =
seekReadIndexedRow (ctxt.getNumRows TableNames.TypeDef,
......@@ -2235,15 +2233,25 @@ and seekReadMethodDefAsMethodDataUncached ctxtH idx =
elif methodsIdx <= idx && idx < endMethodsIdx then 0
else -1),
true,fst)
// Read the method def signature.
let _generic,_genarity,cc,retty,argtys,varargs = readBlobHeapAsMethodSig ctxt 0 typeIdx
if varargs <> None then dprintf "ignoring sentinel and varargs in ILMethodDef token signature"
// Create a formal instantiation if needed
let finst = mkILFormalGenericArgs (seekReadGenericParams ctxt 0 (tomd_TypeDef,tidx))
let minst = mkILFormalGenericArgs (seekReadGenericParams ctxt finst.Length (tomd_MethodDef,idx))
// Create a formal instantiation if needed
let typeGenericArgs = seekReadGenericParams ctxt 0 (tomd_TypeDef, tidx)
let typeGenericArgsCount = typeGenericArgs.Length
let methodGenericArgs = seekReadGenericParams ctxt typeGenericArgsCount (tomd_MethodDef, idx)
let finst = mkILFormalGenericArgs 0 typeGenericArgs
let minst = mkILFormalGenericArgs typeGenericArgsCount methodGenericArgs
// Read the method def parent.
let enclTyp = seekReadTypeDefAsType ctxt AsObject (* not ok: see note *) finst tidx
// Return the constituent parts: put it together at the place where this is called.
let (_code_rva, _implflags, _flags, nameIdx, typeIdx, _paramIdx) = seekReadMethodRow ctxt idx
let nm = readStringHeap ctxt nameIdx
// Read the method def signature.
let _generic,_genarity,cc,retty,argtys,varargs = readBlobHeapAsMethodSig ctxt typeGenericArgsCount typeIdx
if varargs <> None then dprintf "ignoring sentinel and varargs in ILMethodDef token signature"
MethodData(enclTyp, cc, nm, argtys, retty, minst)
......@@ -2267,7 +2275,7 @@ and seekReadFieldDefAsFieldSpecUncached ctxtH idx =
// Read the field signature.
let retty = readBlobHeapAsFieldSig ctxt 0 typeIdx
// Create a formal instantiation if needed
let finst = mkILFormalGenericArgs (seekReadGenericParams ctxt 0 (tomd_TypeDef,tidx))
let finst = mkILFormalGenericArgs 0 (seekReadGenericParams ctxt 0 (tomd_TypeDef,tidx))
// Read the field def parent.
let enclTyp = seekReadTypeDefAsType ctxt AsObject (* not ok: see note *) finst tidx
// Put it together.
......
......@@ -143,7 +143,7 @@ type IlxUnionInfo =
let destTyFuncApp = function Apps_tyapp (b,c) -> b,c | _ -> failwith "destTyFuncApp"
let mkILFormalCloRef gparams csig = IlxClosureSpec.Create(csig, mkILFormalGenericArgs gparams)
let mkILFormalCloRef gparams csig = IlxClosureSpec.Create(csig, mkILFormalGenericArgs 0 gparams)
let actualTypOfIlxUnionField (cuspec : IlxUnionSpec) idx fidx =
instILType cuspec.GenericArgs (cuspec.FieldDef idx fidx).Type
......
......@@ -3462,7 +3462,7 @@ and GenMethodImpl cenv eenv (useMethodImpl,(TSlotSig(nameOfOverridenMethod,_,_,_
let eenvForOverrideBy = AddTyparsToEnv methTyparsOfOverridingMethod eenv
let ilParamsOfOverridingMethod,ilReturnOfOverridingMethod = GenActualSlotsig m cenv eenvForOverrideBy slotsig methTyparsOfOverridingMethod
let ilOverrideMethGenericParams = GenGenericParams cenv eenvForOverrideBy methTyparsOfOverridingMethod
let ilOverrideMethGenericArgs = mkILFormalGenericArgs ilOverrideMethGenericParams
let ilOverrideMethGenericArgs = mkILFormalGenericArgs 0 ilOverrideMethGenericParams
let ilOverrideBy = mkILInstanceMethSpecInTy(ilTyForOverriding, nameOfOverridingMethod, typesOfILParams ilParamsOfOverridingMethod, ilReturnOfOverridingMethod.Type, ilOverrideMethGenericArgs)
{ Overrides = OverridesSpec(ilOverrideMethRef,ilOverrideTy)
OverrideBy = ilOverrideBy })
......@@ -3607,7 +3607,7 @@ and GenSequenceExpr cenv (cgbuf:CodeGenBuffer) eenvouter (nextEnumeratorValRef:V
let ilCloLambdas = Lambdas_return ilCloRetTyInner
let cloref = IlxClosureRef(ilCloTypeRef, ilCloLambdas, ilCloFreeVars)
let ilxCloSpec = IlxClosureSpec.Create(cloref, GenGenericArgs m eenvouter.tyenv cloFreeTyvars)
let formalClospec = IlxClosureSpec.Create(cloref, mkILFormalGenericArgs ilCloGenericParams)
let formalClospec = IlxClosureSpec.Create(cloref, mkILFormalGenericArgs 0 ilCloGenericParams)
let getFreshMethod =
let _,mbody =
......@@ -4080,7 +4080,7 @@ and GenDelegateExpr cenv cgbuf eenvouter expr (TObjExprMethod((TSlotSig(_,delega
let takenNames = List.map nameOfVal tmvs
let (cloAttribs,_,_,cloFreeTyvars,cloFreeVars,ilDelegeeTypeRef,ilCloFreeVars,eenvinner) = GetIlxClosureFreeVars cenv m None eenvouter takenNames expr
let ilDelegeeGenericParams = GenGenericParams cenv eenvinner cloFreeTyvars
let ilDelegeeGenericActualsInner = mkILFormalGenericArgs ilDelegeeGenericParams
let ilDelegeeGenericActualsInner = mkILFormalGenericArgs 0 ilDelegeeGenericParams
// Create a new closure class with a single "delegee" method that implements the delegate.
let delegeeMethName = "Invoke"
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册