private void AppendVirtualSlots(StringBuilder sb, TypeDesc implType, TypeDesc declType) { var baseType = declType.BaseType; if (baseType != null) AppendVirtualSlots(sb, implType, baseType); List<MethodDesc> virtualSlots; _compilation.NodeFactory.VirtualSlots.TryGetValue(declType, out virtualSlots); if (virtualSlots != null) { for (int i = 0; i < virtualSlots.Count; i++) { MethodDesc declMethod = virtualSlots[i]; MethodDesc implMethod = VirtualFunctionResolution.FindVirtualFunctionTargetMethodOnObjectType(declMethod, implType.GetClosestMetadataType()); if (implMethod.IsAbstract) { sb.Append("NULL,"); } else { sb.Append("(void*)&"); sb.Append(GetCppTypeName(implMethod.OwningType)); sb.Append("::"); sb.Append(GetCppMethodName(implMethod)); sb.Append(","); } } } }
private void AppendVirtualSlots(CppGenerationBuffer sb, TypeDesc implType, TypeDesc declType) { var baseType = declType.BaseType; if (baseType != null) AppendVirtualSlots(sb, implType, baseType); IReadOnlyList<MethodDesc> virtualSlots = _compilation.NodeFactory.VTable(declType).Slots; for (int i = 0; i < virtualSlots.Count; i++) { MethodDesc declMethod = virtualSlots[i]; MethodDesc implMethod = implType.GetClosestMetadataType().FindVirtualFunctionTargetMethodOnObjectType(declMethod); sb.AppendLine(); if (implMethod.IsAbstract) { sb.Append("NULL,"); } else { sb.Append("(void*)&"); sb.Append(GetCppMethodDeclarationName(implMethod.OwningType, GetCppMethodName(implMethod))); sb.Append(","); } } }
private void AppendVirtualSlots(StringBuilder sb, TypeDesc implType, TypeDesc declType) { var baseType = declType.BaseType; if (baseType != null) AppendVirtualSlots(sb, implType, baseType); var reg = _compilation.GetRegisteredType(declType); if (reg.VirtualSlots != null) { for (int i = 0; i < reg.VirtualSlots.Count; i++) { MethodDesc declMethod = reg.VirtualSlots[i]; MethodDesc implMethod = VirtualFunctionResolution.FindVirtualFunctionTargetMethodOnObjectType(declMethod, implType.GetClosestMetadataType()); sb.Append("(void*)&"); sb.Append(GetCppTypeName(implMethod.OwningType)); sb.Append("::"); sb.Append(GetCppMethodName(implMethod)); sb.Append(","); } } }
private void OutputVirtualSlots(NodeFactory factory, ref ObjectDataBuilder objData, TypeDesc implType, TypeDesc declType) { var baseType = declType.BaseType; if (baseType != null) OutputVirtualSlots(factory, ref objData, implType, baseType); List<MethodDesc> virtualSlots; factory.VirtualSlots.TryGetValue(declType, out virtualSlots); if (virtualSlots != null) { for (int i = 0; i < virtualSlots.Count; i++) { MethodDesc declMethod = virtualSlots[i]; MethodDesc implMethod = VirtualFunctionResolution.FindVirtualFunctionTargetMethodOnObjectType(declMethod, implType.GetClosestMetadataType()); if (!implMethod.IsAbstract) objData.EmitPointerReloc(factory.MethodEntrypoint(implMethod)); else objData.EmitZeroPointer(); } } }
private void OutputVirtualSlots(NodeFactory factory, ref ObjectDataBuilder objData, TypeDesc implType, TypeDesc declType) { declType = declType.GetClosestMetadataType(); var baseType = declType.BaseType; if (baseType != null) OutputVirtualSlots(factory, ref objData, implType, baseType); IReadOnlyList<MethodDesc> virtualSlots = factory.VTable(declType).Slots; for (int i = 0; i < virtualSlots.Count; i++) { MethodDesc declMethod = virtualSlots[i]; MethodDesc implMethod = implType.GetClosestMetadataType().FindVirtualFunctionTargetMethodOnObjectType(declMethod); if (declMethod.HasInstantiation) { // Generic virtual methods will "compile", but will fail to link. Check for it here. throw new NotImplementedException("VTable for " + _type + " has generic virtual methods."); } if (!implMethod.IsAbstract) objData.EmitPointerReloc(factory.MethodEntrypoint(implMethod, implMethod.OwningType.IsValueType)); else objData.EmitZeroPointer(); } }