| 7357 | } |
| 7358 | #ifdef CPPIA_JIT |
| 7359 | void genCode(CppiaCompiler *compiler, const JitVal &inDest, ExprType destType) HXCPP_OVERRIDE |
| 7360 | { |
| 7361 | if (!AS_DYNAMIC) |
| 7362 | { |
| 7363 | // String version |
| 7364 | if (destType==etObject || destType==etString) |
| 7365 | { |
| 7366 | JitTemp s0(compiler,jtString); |
| 7367 | JitTemp s1(compiler,jtString); |
| 7368 | left->genCode(compiler, s0, etString); |
| 7369 | right->genCode(compiler, s1, etString); |
| 7370 | compiler->add( sJitTemp0, s0.getReg().as(jtPointer), s0.offset ); |
| 7371 | compiler->add( sJitTemp1, s1.getReg().as(jtPointer), s1.offset ); |
| 7372 | if (destType==etString) |
| 7373 | { |
| 7374 | compiler->callNative((void *)strAddStrToStrOver, sJitTemp0.as(jtPointer), sJitTemp1.as(jtPointer)); |
| 7375 | compiler->move(inDest.as(jtInt), s0.as(jtInt)); |
| 7376 | compiler->move(inDest.as(jtPointer)+StringOffset::Ptr, s0.as(jtPointer)+StringOffset::Ptr); |
| 7377 | } |
| 7378 | else // Object |
| 7379 | { |
| 7380 | compiler->callNative((void *)strAddStrToObj, sJitTemp0.as(jtPointer), sJitTemp1.as(jtPointer)); |
| 7381 | compiler->checkException(); |
| 7382 | compiler->move( inDest, sJitReturnReg.as(jtPointer) ); |
| 7383 | } |
| 7384 | } |
| 7385 | else |
| 7386 | { |
| 7387 | left->genCode(compiler, JitVal(), etObject); |
| 7388 | right->genCode(compiler, JitVal(), etObject); |
| 7389 | } |
| 7390 | } |
| 7391 | else |
| 7392 | { |
| 7393 | JitTemp tLeft(compiler,jtPointer); |
| 7394 | left->genCode(compiler, tLeft, etObject); |
| 7395 | right->genCode(compiler, sJitTemp1.as(jtPointer), etObject); |
| 7396 | |
| 7397 | switch(destType) |
| 7398 | { |
| 7399 | case etString: |
| 7400 | if (inDest.offset==0) |
| 7401 | { |
| 7402 | compiler->callNative((void *)dynamicAddStr, tLeft, sJitTemp1.as(jtPointer), inDest.getReg()); |
| 7403 | compiler->checkException(); |
| 7404 | } |
| 7405 | else |
| 7406 | { |
| 7407 | compiler->add(sJitTemp2, inDest.getReg(), inDest.offset); |
| 7408 | compiler->callNative((void *)dynamicAddStr, tLeft, sJitTemp1.as(jtPointer), sJitTemp2); |
| 7409 | compiler->checkException(); |
| 7410 | } |
| 7411 | break; |
| 7412 | |
| 7413 | case etObject: |
| 7414 | compiler->callNative((void *)dynamicAddObj, tLeft, sJitTemp1.as(jtPointer)); |
| 7415 | compiler->checkException(); |
| 7416 | compiler->move(inDest, sJitReturnReg.as(jtPointer)); |
nothing calls this directly
no test coverage detected