MCPcopy Create free account
hub / github.com/GaijinEntertainment/daScript / simulateExprMakeTuple

Method simulateExprMakeTuple

src/ast/ast_simulate.cpp:1185–1242  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1183 }
1184
1185 vector<SimNode *> SimulateVisitor::simulateExprMakeTuple(const ExprMakeTuple *mkt) {
1186 vector<SimNode *> simlist;
1187 // init with 0
1188 int total = int(mkt->values.size());
1189 if ( !mkt->doesNotNeedInit && !mkt->initAllFields ) {
1190 uint32_t sizeOf = mkt->makeType->getSizeOf();
1191 SimNode * init0;
1192 if ( mkt->useCMRES ) {
1193 if ( sizeOf==0 ) {
1194 init0 = nullptr;
1195 } else if ( sizeOf <= 32 ) {
1196 init0 = context.code->makeNodeUnrollNZ<SimNode_InitLocalCMResN>(sizeOf, mkt->at, mkt->extraOffset);
1197 } else {
1198 init0 = context.code->makeNode<SimNode_InitLocalCMRes>(mkt->at, mkt->extraOffset, sizeOf);
1199 }
1200 } else if ( mkt->useStackRef ) {
1201 init0 = context.code->makeNode<SimNode_InitLocalRef>(mkt->at, mkt->stackTop, mkt->extraOffset, sizeOf);
1202 } else {
1203 init0 = context.code->makeNode<SimNode_InitLocal>(mkt->at, mkt->stackTop + mkt->extraOffset, sizeOf);
1204 }
1205 if (init0) simlist.push_back(init0);
1206 }
1207 for ( int index=0; index != total; ++index ) {
1208 auto & val = mkt->values[index];
1209 uint32_t offset = mkt->extraOffset + mkt->makeType->getTupleFieldOffset(index);
1210 SimNode * cpy;
1211 if ( val->rtti_isMakeLocal() ) {
1212 // so what happens here, is we ask it for the generated commands and append it to this list only
1213 auto mkl = static_cast<ExprMakeLocal*>(val);
1214 auto lsim = sv_simulateLocal(mkl);
1215 simlist.insert(simlist.end(), lsim.begin(), lsim.end());
1216 continue;
1217 } else if ( mkt->useCMRES ) {
1218 if (val->type->canCopy()) {
1219 cpy = sv_makeLocalCMResCopy(mkt->at, offset, val);
1220 } else {
1221 cpy = sv_makeLocalCMResMove(mkt->at, offset, val);
1222 }
1223 } else if ( mkt->useStackRef ) {
1224 if (val->type->canCopy()) {
1225 cpy = sv_makeLocalRefCopy(mkt->at, mkt->stackTop, offset, val);
1226 } else {
1227 cpy = sv_makeLocalRefMove(mkt->at, mkt->stackTop, offset, val);
1228 }
1229 } else {
1230 if (val->type->canCopy()) {
1231 cpy = sv_makeLocalCopy(mkt->at, mkt->stackTop + offset, val);
1232 } else {
1233 cpy = sv_makeLocalMove(mkt->at, mkt->stackTop + offset, val);
1234 }
1235 }
1236 if ( !cpy ) {
1237 context.thisProgram->error("internal compilation error, can't generate array initialization", "", "", mkt->at, CompilationError::internal_tuple);
1238 }
1239 simlist.push_back(cpy);
1240 }
1241 return simlist;
1242 }

Callers

nothing calls this directly

Calls 9

getTupleFieldOffsetMethod · 0.80
sizeMethod · 0.45
getSizeOfMethod · 0.45
push_backMethod · 0.45
insertMethod · 0.45
endMethod · 0.45
beginMethod · 0.45
canCopyMethod · 0.45
errorMethod · 0.45

Tested by

no test coverage detected