diff options
| author | Yong He <yonghe@outlook.com> | 2022-06-29 13:38:50 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-06-29 13:38:50 -0700 |
| commit | abc100f81d4b22229105f9ed569a7efafc653a3a (patch) | |
| tree | 06c98c1941ab05d9989c9b7566571ec64ab11c39 /source/slang/slang-emit-c-like.cpp | |
| parent | b7638b8fffe78ade657f361cadc08dffc8c10acf (diff) | |
Native call marshalling for ComPtr parameters and return values. (#2305)
Co-authored-by: Yong He <yhe@nvidia.com>
Diffstat (limited to 'source/slang/slang-emit-c-like.cpp')
| -rw-r--r-- | source/slang/slang-emit-c-like.cpp | 40 |
1 files changed, 38 insertions, 2 deletions
diff --git a/source/slang/slang-emit-c-like.cpp b/source/slang/slang-emit-c-like.cpp index 10ac2ca84..9bd999087 100644 --- a/source/slang/slang-emit-c-like.cpp +++ b/source/slang/slang-emit-c-like.cpp @@ -1544,8 +1544,11 @@ void CLikeSourceEmitter::emitCallExpr(IRCall* inst, EmitOpInfo outerPrec) { const auto operand0TypeOp = funcValue->getOperand(0)->getDataType()->getOp(); - if (operand0TypeOp == kIROp_ComPtrType || operand0TypeOp == kIROp_PtrType) + switch (operand0TypeOp) { + case kIROp_ComPtrType: + case kIROp_PtrType: + case kIROp_NativePtrType: emitComInterfaceCallExpr(inst, outerPrec); return; } @@ -1825,7 +1828,40 @@ void CLikeSourceEmitter::defaultEmitInstExpr(IRInst* inst, const EmitOpInfo& inO m_writer->emit(")"); break; } - + case kIROp_GetNativePtr: + { + auto prec = getInfo(EmitOp::Postfix); + needClose = maybeEmitParens(outerPrec, prec); + emitOperand(inst->getOperand(0), leftSide(outerPrec, prec)); + m_writer->emit(".get()"); + break; + } + case kIROp_GetManagedPtrWriteRef: + { + auto prec = getInfo(EmitOp::Postfix); + needClose = maybeEmitParens(outerPrec, prec); + emitDereferenceOperand(inst->getOperand(0), leftSide(outerPrec, prec)); + m_writer->emit(".writeRef()"); + break; + } + case kIROp_ManagedPtrAttach: + { + auto prec = getInfo(EmitOp::Postfix); + needClose = maybeEmitParens(outerPrec, prec); + emitDereferenceOperand(inst->getOperand(0), leftSide(outerPrec, prec)); + m_writer->emit(".attach("); + emitOperand(inst->getOperand(1), EmitOpInfo()); + m_writer->emit(")"); + break; + } + case kIROp_ManagedPtrDetach: + { + auto prec = getInfo(EmitOp::Postfix); + needClose = maybeEmitParens(outerPrec, prec); + emitDereferenceOperand(inst->getOperand(0), leftSide(outerPrec, prec)); + m_writer->emit(".detach()"); + break; + } case kIROp_getElement: case kIROp_getElementPtr: case kIROp_ImageSubscript: |
