Exemple #1
0
HEAP_PTR RuntimeType_New(tMD_TypeDef *pTypeDef) {
	tRuntimeType *pRuntimeType;

	pRuntimeType = (tRuntimeType*)Heap_AllocType(types[TYPE_SYSTEM_RUNTIMETYPE]);
	Heap_MakeUndeletable((HEAP_PTR)pRuntimeType);
	pRuntimeType->pTypeDef = pTypeDef;

	return (HEAP_PTR)pRuntimeType;
}
// Must return a boxed version of value-types
tAsyncCall* System_Array_Internal_GetValue(PTR pThis_, PTR pParams, PTR pReturnValue) {
	tSystemArray *pArray = (tSystemArray*)pThis_;
	tMD_TypeDef *pArrayType;
	U32 index, elementSize;
	tMD_TypeDef *pElementType;
	PTR pElement;

	index = *(U32*)pParams;
	pArrayType = Heap_GetType(pThis_);
	pElementType = pArrayType->pArrayElementType;
	elementSize = pElementType->arrayElementSize;
	pElement = pArray->elements + elementSize * index;
	if (pElementType->isValueType) {
		// If it's a value-type, then box it
		HEAP_PTR boxedValue;
		if (pElementType->pGenericDefinition == types[TYPE_SYSTEM_NULLABLE]) {
			// Nullable type, so box specially
			if (*(U32*)pElement) {
				// Nullable has value
				boxedValue = Heap_AllocType(pElementType->ppClassTypeArgs[0]);
				// Don't copy the .hasValue part
				memcpy(boxedValue, pElement + 4, elementSize - 4);
			} else {
				// Nullable does not have value
				boxedValue = NULL;
			}
		} else {
			boxedValue = Heap_AllocType(pElementType);
			memcpy(boxedValue, pElement, elementSize);
		}
		*(HEAP_PTR*)pReturnValue = boxedValue;
	} else {
		// This must be a reference type, so it must be 32-bits wide
		*(U32*)pReturnValue = *(U32*)pElement;
	}

	return NULL;
}