private void ImportLdToken(int token) { var ldtokenValue = _methodIL.GetObject(token); WellKnownType ldtokenKind; string name; StackEntry value; if (ldtokenValue is TypeDesc) { ldtokenKind = WellKnownType.RuntimeTypeHandle; AddTypeReference((TypeDesc)ldtokenValue, false); MethodDesc helper = _typeSystemContext.GetHelperEntryPoint("LdTokenHelpers", "GetRuntimeTypeHandle"); AddMethodReference(helper); name = String.Concat( _writer.GetCppTypeName(helper.OwningType), "::", _writer.GetCppMethodName(helper), "((intptr_t)", _writer.GetCppTypeName((TypeDesc)ldtokenValue), "::__getMethodTable())"); value = new LdTokenEntry<TypeDesc>(StackValueKind.ValueType, name, (TypeDesc)ldtokenValue, GetWellKnownType(ldtokenKind)); } else if (ldtokenValue is FieldDesc) { ldtokenKind = WellKnownType.RuntimeFieldHandle; value = new LdTokenEntry<FieldDesc>(StackValueKind.ValueType, null, (FieldDesc) ldtokenValue, GetWellKnownType(ldtokenKind)); } else if (ldtokenValue is MethodDesc) { throw new NotImplementedException(); } else throw new InvalidOperationException(); _stack.Push(value); }
private void ImportLdFtn(int token, ILOpcode opCode) { MethodDesc method = (MethodDesc)_methodIL.GetObject(token); if (opCode == ILOpcode.ldvirtftn) { if (method.IsVirtual) throw new NotImplementedException(); } AddMethodReference(method); var entry = new LdTokenEntry<MethodDesc>(StackValueKind.NativeInt, NewTempName(), method); PushTemp(entry); Append("(intptr_t)&"); Append(_writer.GetCppTypeName(method.OwningType)); Append("::"); Append(_writer.GetCppMethodName(method)); AppendSemicolon(); }