Skip to content

Commit

Permalink
Added Ptr<T> support to Java wrappers
Browse files Browse the repository at this point in the history
  • Loading branch information
mshabunin committed Sep 1, 2014
1 parent 43c2c11 commit 66ed9dd
Showing 1 changed file with 28 additions and 3 deletions.
31 changes: 28 additions & 3 deletions modules/java/generator/gen_java.py
Expand Up @@ -879,6 +879,11 @@ def add_class(self, decl):
self.add_class_code_stream(name, classinfo.base)
if classinfo.base:
self.get_imports(name, classinfo.base)
type_dict["Ptr_"+name] = \
{ "j_type" : name,
"jn_type" : "long", "jn_args" : (("__int64", ".nativeObj"),),
"jni_name" : "Ptr<"+name+">(("+name+"*)%(n)s_nativeObj)", "jni_type" : "jlong",
"suffix" : "J" }


def add_const(self, decl): # [ "const cname", val, [], [] ]
Expand Down Expand Up @@ -1253,6 +1258,9 @@ def gen_func(self, fi, prop_name=''):
j_prologue.append( j_type + ' retVal = new Array' + j_type+'();')
self.classes[fi.classname or self.Module].imports.add('java.util.ArrayList')
j_epilogue.append('Converters.Mat_to_' + ret_type + '(retValMat, retVal);')
elif ret_type.startswith("Ptr_"):
ret_val = type_dict[fi.ctype]["j_type"] + " retVal = new " + type_dict[ret_type]["j_type"] + "("
tail = ")"
elif ret_type == "void":
ret_val = ""
ret = "return;"
Expand Down Expand Up @@ -1325,6 +1333,9 @@ def gen_func(self, fi, prop_name=''):
default = 'return env->NewStringUTF("");'
elif fi.ctype in self.classes: # wrapped class:
ret = "return (jlong) new %s(_retval_);" % fi.ctype
elif fi.ctype.startswith('Ptr_'):
c_prologue.append("typedef Ptr<%s> %s;" % (fi.ctype[4:], fi.ctype))
ret = "return (jlong)(new %(ctype)s(_retval_));" % { 'ctype':fi.ctype }
elif ret_type in self.classes: # pointer to wrapped class:
ret = "return (jlong) _retval_;"
elif type_dict[fi.ctype]["jni_type"] == "jdoubleArray":
Expand Down Expand Up @@ -1355,10 +1366,10 @@ def gen_func(self, fi, prop_name=''):
elif fi.static:
cvname = "%s::%s" % (fi.classname, name)
else:
cvname = "me->" + name
cvname = ("me->" if not self.isSmartClass(fi.classname) else "(*me)->") + name
c_prologue.append(\
"%(cls)s* me = (%(cls)s*) self; //TODO: check for NULL" \
% { "cls" : fi.classname} \
% { "cls" : self.smartWrap(fi.classname)} \
)
cvargs = []
for a in args:
Expand Down Expand Up @@ -1511,9 +1522,23 @@ def gen_class(self, name):
delete (%(cls)s*) self;
}
""" % {"module" : module, "cls" : name, "j_cls" : ci.jname.replace('_', '_1')}
""" % {"module" : module, "cls" : self.smartWrap(name), "j_cls" : ci.jname.replace('_', '_1')}
)

def isSmartClass(self, classname):
'''
Check if class stores Ptr<T>* instead of T* in nativeObj field
'''
return classname in self.classes and self.classes[classname].base

def smartWrap(self, classname):
'''
Wraps class name with Ptr<> if needed
'''
if self.isSmartClass(classname):
return "Ptr<" + classname + ">"
return classname


if __name__ == "__main__":
if len(sys.argv) < 4:
Expand Down

0 comments on commit 66ed9dd

Please sign in to comment.