| 2198 | } |
| 2199 | |
| 2200 | void 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 | |
| 2251 | void ConvertFunctionToPointer(const char* pos, TypeInfo *dstPreferred) |
| 2252 | { |
no test coverage detected