fix upcasting problem (#77 thanks to cantora)
This commit is contained in:
parent
24f1b33737
commit
0801df41dc
3 changed files with 29 additions and 6 deletions
|
|
@ -333,7 +333,7 @@ class Class(SubModule, _Type):
|
||||||
writer.die_if_false(raw, verbose=name)
|
writer.die_if_false(raw, verbose=name)
|
||||||
ptrty = ptr(self).fullname
|
ptrty = ptr(self).fullname
|
||||||
ty = self.fullname
|
ty = self.fullname
|
||||||
fmt = 'typecast< %(ty)s >::from(%(raw)s)'
|
fmt = 'unwrap_as<%(ty)s, %(name)s >::from(%(raw)s)'
|
||||||
casted = writer.declare(ptrty, fmt % locals())
|
casted = writer.declare(ptrty, fmt % locals())
|
||||||
writer.die_if_false(casted)
|
writer.die_if_false(casted)
|
||||||
return casted
|
return casted
|
||||||
|
|
|
||||||
|
|
@ -202,7 +202,8 @@ class CppCodeWriter(CodeWriterBase):
|
||||||
|
|
||||||
def pycapsule_new(self, ptr, name, clsname):
|
def pycapsule_new(self, ptr, name, clsname):
|
||||||
name_soften = mangle(name)
|
name_soften = mangle(name)
|
||||||
ret = self.call('pycapsule_new', 'PyObject*', ptr, quote(name),
|
cast_to_base = 'cast_to_base<%s >::from(%s)' % (name, ptr)
|
||||||
|
ret = self.call('pycapsule_new', 'PyObject*', cast_to_base, quote(name),
|
||||||
quote(clsname))
|
quote(clsname))
|
||||||
with self.block('if (!%(ret)s)' % locals()):
|
with self.block('if (!%(ret)s)' % locals()):
|
||||||
self.return_null()
|
self.return_null()
|
||||||
|
|
|
||||||
|
|
@ -254,10 +254,11 @@ PyObject* py_float_from(const double& val) {
|
||||||
// casting
|
// casting
|
||||||
template<class Td>
|
template<class Td>
|
||||||
struct typecast {
|
struct typecast {
|
||||||
template<class Ts> static
|
// Unused
|
||||||
Td* from(Ts* src) {
|
// template<class Ts> static
|
||||||
return llvm::dyn_cast<Td>(src);
|
// Td* from(Ts* src) {
|
||||||
}
|
// return llvm::dyn_cast<Td>(src);
|
||||||
|
// }
|
||||||
|
|
||||||
static
|
static
|
||||||
Td* from(void* src) {
|
Td* from(void* src) {
|
||||||
|
|
@ -265,3 +266,24 @@ struct typecast {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template<class Td, class Tbase>
|
||||||
|
struct unwrap_as {
|
||||||
|
static
|
||||||
|
Td* from(void* src) {
|
||||||
|
Tbase* base = static_cast<Tbase*>(src);
|
||||||
|
return static_cast<Td*>(base);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<class Td>
|
||||||
|
struct cast_to_base {
|
||||||
|
template<class Ts> static
|
||||||
|
Td* from(Ts* src){
|
||||||
|
return static_cast<Td*>(src);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class Ts> static
|
||||||
|
const Td* from(const Ts* src){
|
||||||
|
return static_cast<const Td*>(src);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue