MCPcopy Create free account
hub / github.com/WheretIB/nullc / ConvertArrayToUnsized

Function ConvertArrayToUnsized

NULLC/Callbacks.cpp:2200–2249  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

2198}
2199
2200void ConvertArrayToUnsized(const char* pos, TypeInfo *dstType)
2201{
2202 // Get r-value type
2203 TypeInfo *nodeType = CodeInfo::nodeList.back()->typeInfo;
2204 // If l-value type or r-value type doesn't have subType, make no conversions
2205 if(!dstType->subType || !nodeType->subType)
2206 return;
2207 // If l-value type is not an unsized array type and l-value subType is not an unsized array type, make no conversions
2208 if(dstType->arrSize != TypeInfo::UNSIZED_ARRAY && dstType->subType->arrSize != TypeInfo::UNSIZED_ARRAY)
2209 return;
2210 // If l-value type is equal to r-value type, make no conversions
2211 if(dstType == nodeType)
2212 return;
2213 // If r-value type is not an array and r-value subType is not an array, make no conversions
2214 if(!nodeType->arrLevel && !nodeType->subType->arrLevel)
2215 return;
2216
2217 if(dstType->subType == nodeType->subType)
2218 {
2219 bool hasImplicitNode = false;
2220 if(CodeInfo::nodeList.back()->nodeType != typeNodeDereference)
2221 {
2222 AddInplaceVariable(pos);
2223 hasImplicitNode = true;
2224 }else{
2225 NodeZeroOP *oldNode = CodeInfo::nodeList.back();
2226 CodeInfo::nodeList.back() = static_cast<NodeDereference*>(oldNode)->GetFirstNode();
2227 static_cast<NodeDereference*>(oldNode)->SetFirstNode(NULL);
2228 }
2229
2230 TypeInfo *inplaceType = CodeInfo::nodeList.back()->typeInfo;
2231 assert(inplaceType->refLevel == 1);
2232 assert(inplaceType->subType->arrLevel != 0);
2233
2234 NodeExpressionList *listExpr = new NodeExpressionList(dstType);
2235 // Create node that places array size on top of the stack
2236 CodeInfo::nodeList.push_back(new NodeNumber((int)inplaceType->subType->arrSize, typeInt));
2237 // Add it to expression list
2238 listExpr->AddNode();
2239 if(hasImplicitNode)
2240 listExpr->AddNode();
2241 // Add expression list to node list
2242 CodeInfo::nodeList.push_back(listExpr);
2243 }else if(nodeType->refLevel == 1 && nodeType->subType->arrSize != TypeInfo::UNSIZED_ARRAY && dstType->subType->subType == nodeType->subType->subType){
2244 // type[N] ref to type[] ref conversion
2245 AddGetVariableNode(pos);
2246 AddInplaceVariable(pos, CodeInfo::GetArrayType(nodeType->subType->subType, TypeInfo::UNSIZED_ARRAY));
2247 AddExtraNode();
2248 }
2249}
2250
2251void ConvertFunctionToPointer(const char* pos, TypeInfo *dstPreferred)
2252{

Callers 6

AddReturnNodeFunction · 0.85
AddDefineVariableNodeFunction · 0.85
AddSetVariableNodeFunction · 0.85
AddArrayConstructorFunction · 0.85
PrepareMemberCallFunction · 0.85
AddFunctionCallNodeFunction · 0.85

Calls 8

AddInplaceVariableFunction · 0.85
assertFunction · 0.85
AddGetVariableNodeFunction · 0.85
AddExtraNodeFunction · 0.85
SetFirstNodeMethod · 0.80
AddNodeMethod · 0.80
GetFirstNodeMethod · 0.45
push_backMethod · 0.45

Tested by

no test coverage detected