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