Dear Andi, Many many thanks for looking into this!
I am on travel for a week and do not have the computer with the special case with me to test. I did now however run it on the library that I am wrapping, and there get some errors in the creation of the wrapped module (orekit): build/_orekit/__wrap__.cpp:86504:89: error: no member named 'HarmonicOscillator$Parametric$$Type' in namespace 'org::apache::commons::math3::analysis::function' ...= &::org::apache::commons::math3::analysis::function::PY_TYPE(HarmonicOs... ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^ /Users/petrus/anaconda/lib/python2.7/site-packages/JCC-2.18-py2.7-macosx-10.5-x86_64.egg/jcc/sources/macros.h:66:23: note: expanded from macro 'PY_TYPE' #define PY_TYPE(name) name##$$Type ^ <scratch space>:63:1: note: expanded from here HarmonicOscillator$Parametric$$Type ^ build/_orekit/__wrap__.cpp:217752:55: error: no member named 'OrekitMessages$$Type' in namespace 'org::orekit::errors' self->parameters[0] = &::org::orekit::errors::PY_TYPE(OrekitMessages); ~~~~~~~~~~~~~~~~~~~~~~~^ /Users/petrus/anaconda/lib/python2.7/site-packages/JCC-2.18-py2.7-macosx-10.5-x86_64.egg/jcc/sources/macros.h:66:23: note: expanded from macro 'PY_TYPE' #define PY_TYPE(name) name##$$Type ^ <scratch space>:9:1: note: expanded from here OrekitMessages$$Type ^ 2 errors generated. error: command 'gcc' failed with exit status 1 The OrekitMessages is defined as a "public enum OrekitMessages implements Localizable { ..." and the "public class HarmonicOscillator implements UnivariateDifferentiable, DifferentiableUnivariateFunction". Maybe this says you something, I will try to test more and run my test case in . Best Regards and again, many thanks again! /petrus On 11 Jan 2014, at 14:23 , Andi Vajda <va...@apache.org> wrote: > > Hi Petrus, > > On Mon, 30 Dec 2013, Petrus Hyvönen wrote: > >> Andi, great to hear that you could reproduce it. I'm very thankful if you >> could have a look at it, I've been struggling to understand how the >> machinery behind this works, but far from it still.. > > I think I fixed the problem and added an improvement to generics support > along the way. Please check out rev 1557423 from jcc's trunk, rebuild your > module with it and let me know how it's working for you. > > The bug had to do with SimpleClass2's wrapper class missing its parameters > slot which it should get from its superclass, SimpleClass. When calling a > method on SimpleClass from SimpleClass2, the missing parameters in the > wrapper's struct would cause memory to get trashed. > > In addition to fixing the bug, I also improved support for fixed class > parameters. Now, if you change SimpleClass's return_null() method to return > new Integer(12) instead, when calling it on SimpleClass2, 12 is returned > instead of <Object: 12>. > > Andi.. > > public class SimpleClass<T> { public SimpleClass() { > System.out.println("Created SimpleClass"); } > public T return_null() { > return (T) new Integer(12); > } > > } > > >> >> Best Regards >> /Petrus >> >> >> >> On Mon, Dec 30, 2013 at 10:36 AM, Andi Vajda <va...@apache.org> wrote: >> >>> >>> On Sun, 29 Dec 2013, Petrus Hyvönen wrote: >>> >>> I have distilled the library that I have some trouble with and I think I >>>> have an example that is failing due to same problem I think. I am not good >>>> in java, but have tried to follow the logic from the library I'm wrapping. >>>> The function of the example does not make sense in itself. >>>> >>>> public class SimpleClass<T> { >>>> public SimpleClass() { >>>> System.out.println("Created SimpleClass"); >>>> } >>>> public T return_null() { >>>> return null; >>>> } >>>> >>>> } >>>> >>>> >>>> >>>> public class SimpleClass2 extends SimpleClass<Integer>{ >>>> >>>> public SimpleClass2(){} >>>> public void testInJava(){ >>>> System.out.println(this.return_null()); >>>> } >>>> } >>>> >>>> >>>> It seems to me that there is some problem with methods inherited that >>>> returns a generic type, failing in wrapType when this is to be wrapped. >>>> >>>> The python script that fails: >>>> >>>> a= SimpleClass() >>>> print a.return_null() >>>> >>>> b = SimpleClass2() >>>> b.testInJava() >>>> >>>> print b.return_null() #Fails in wrapType >>>> >>>> I don't know if the return null is a bad thing to do in java, but the >>>> error >>>> seems very similar to what I experience in the larger library. I have a >>>> skeleton of that this is slightly larger, but not returning null, but >>>> trying to keep the lenght of example low :) >>>> >>>> Any comments highly appriciated :) >>>> >>> >>> I've been able to reproduce the problem. >>> Thank you for providing an isolated test case ! >>> >>> Andi.. >>> >>> >>> >>>> best Regards >>>> /Petrus >>>> >>>> >>>> >>>> >>>> >>>> >>>> On Fri, Dec 27, 2013 at 6:25 PM, Andi Vajda <va...@apache.org> wrote: >>>> >>>> >>>>> On Dec 27, 2013, at 17:36, Petrus Hyvönen <petrus.hyvo...@gmail.com> >>>>>> >>>>> wrote: >>>>> >>>>>> >>>>>> Dear Andi, >>>>>> >>>>>> I am working on debugging the failure and try to understand a bit how >>>>>> JCC >>>>>> works internally. I haven't gone very far but in case you have some >>>>>> pointers from these early debugging sessions I would be very thankful. I >>>>>> know it's complex, and I should try to make some smaller test cases, but >>>>>> >>>>> I >>>>> >>>>>> don't really have a grasp yet where the problem might be. >>>>>> >>>>>> Writing this might help me also to get some structure in my thinking :) >>>>>> >>>>>> >>>>>> >>>>>> The main crash seems to be in the last line, wrapType(), of >>>>>> __wrap__.cpp: >>>>>> >>>>>> static PyObject >>>>>> >>>>>> *t_AbstractReconfigurableDetector_withHandler(t_ >>>>> AbstractReconfigurableDetector >>>>> >>>>>> *self, PyObject *arg) >>>>>> { >>>>>> ::org::orekit::propagation::events::handlers::EventHandler >>>>>> a0((jobject) NULL); >>>>>> PyTypeObject **p0; >>>>>> ::org::orekit::propagation::events::EventDetector >>>>>> result((jobject) NULL); >>>>>> >>>>>> if (!parseArg(arg, "K", >>>>>> >>>>>> ::org::orekit::propagation::events::handlers:: >>>>> EventHandler::initializeClass, >>>>> >>>>>> &a0, &p0, >>>>>> >>>>>> ::org::orekit::propagation::events::handlers::t_ >>>>> EventHandler::parameters_)) >>>>> >>>>>> { >>>>>> OBJ_CALL(result = self->object.withHandler(a0)); >>>>>> return self->parameters[0] != NULL ? >>>>>> wrapType(self->parameters[0], result.this$) : >>>>>> ::org::orekit::propagation::events::t_EventDetector::wrap_ >>>>>> Object(result); >>>>>> } >>>>>> >>>>>> The parameters[0] does not seem to be null, but neither is it a valid >>>>>> object, in my debugger it says 0xbaadf00d {ob_refcnt=??? ob_type=??? >>>>>> ob_size=??? ...} _typeobject *, wrapType is called and when trying >>>>>> to >>>>>> access the wrapfn it crashes. >>>>>> >>>>>> The main python lines are: >>>>>> tmp1 = ElevationDetector(sta1Frame) # >>>>>> >>>>> ElevationDetector >>>>> >>>>>> is a java public class ElevationDetector extends >>>>>> AbstractReconfigurableDetector<ElevationDetector> >>>>>> hand = ContinueOnEvent().of_(ElevationDetector) # a >>>>>> java ContinueOnEvent<ElevationDetector> object >>>>>> elDetector = tmp1.withHandler(hand) #Crash. withHandler is a method >>>>>> that is inherited from AbstractReconfigurableDetector to >>>>>> >>>>> ElevationDetector >>>>> >>>>>> >>>>>> This crashes when interactively entered on the python prompt (or in >>>>>> other >>>>>> interactive consoles), but seems to work if executed directly without >>>>>> interactivity. This difference makes me think that it might be something >>>>>> with garbage collection, but don't know. >>>>>> >>>>>> Any comments appriciated, I know this is likely very difficult to >>>>>> comment >>>>>> on as it's not very encapsulated. >>>>>> >>>>> >>>>> Right, so unless you can isolate this into something I can reproduce, I'm >>>>> afraid there isn't much I can comment. >>>>> It is quite likely that by the time you have that reproducible test case >>>>> ready, you also have the solution to the problem. Or I might be able to >>>>> help then... >>>>> >>>>> Andi.. >>>>> >>>>> >>>>>> Regards >>>>>> /Petrus >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> On Sun, Dec 15, 2013 at 10:36 AM, Andi Vajda <va...@apache.org> wrote: >>>>>>> >>>>>>> >>>>>>> On Dec 15, 2013, at 5:43, Petrus Hyvönen <petrus.hyvo...@gmail.com> >>>>>>>>> >>>>>>>> wrote: >>>>>>>> >>>>>>>> Hi Andi, >>>>>>>> >>>>>>>> I see your point and have now kept in the pure python domain. >>>>>>>> >>>>>>>> If I run my script from the shell by "python script.py" it does not >>>>>>>> >>>>>>> crash. However if I execute it line-by-line in python it crashes (or in >>>>>>> other tools such as ipython notebook). >>>>>>> >>>>>>>> All classes used are non-wrapped java classes, but I get the same >>>>>>>> >>>>>>> effect >>>>> >>>>>> with classes made for python subclassing. >>>>>>> >>>>>>>> I am getting this on both MacOSX 64-bit python and Windows 7 32-bit >>>>>>>> >>>>>>> python. >>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> elDetector = >>>>>>>>>>> >>>>>>>>>> elDetector.withHandler(ContinueOnEvent().of_(ElevationDetector)) >>>>>>> >>>>>>>> # >>>>>>>> # A fatal error has been detected by the Java Runtime Environment: >>>>>>>> # >>>>>>>> # SIGSEGV (0xb) at pc=0x000000010005da1a, pid=3318, tid=1287 >>>>>>>> # >>>>>>>> # JRE version: Java(TM) SE Runtime Environment (7.0_45-b18) (build >>>>>>>> >>>>>>> 1.7.0_45-b18) >>>>>>> >>>>>>>> # Java VM: Java HotSpot(TM) 64-Bit Server VM (24.45-b08 mixed mode >>>>>>>> >>>>>>> bsd-amd64 compressed oops) >>>>>>> >>>>>>>> # Problematic frame: >>>>>>>> # C [libpython2.7.dylib+0x5aa1a] PyObject_GetAttr+0x1a >>>>>>>> # >>>>>>>> >>>>>>>> >>>>>>>> from the stack it seems like there is somthing happening in "wrapType" >>>>>>>> Stack: [0x00007fff5fb80000,0x00007fff5fc00000], >>>>>>>> sp=0x00007fff5fbff470, >>>>>>>> >>>>>>> free space=509k >>>>>>> >>>>>>>> Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, >>>>>>>> >>>>>>> C=native code) >>>>>>> >>>>>>>> C [libpython2.7.dylib+0x5aa1a] PyObject_GetAttr+0x1a >>>>>>>> C [_orekit.so+0xa80878] wrapType(_typeobject*, _jobject* >>>>>>>> const&)+0x58 >>>>>>>> C [_orekit.so+0x554400] >>>>>>>> >>>>>>> >>>>>>> org::orekit::propagation::events::t_AbstractReconfigurableDetector >>>>> _withHandler(org::orekit::propagation::events::t_ >>>>> AbstractReconfigurableDetector*, >>>>> >>>>>> _object*)+0x1c0 >>>>>>> >>>>>>>> >>>>>>>> First, is the generic class assignment correct as if to write "new >>>>>>>> >>>>>>> ContinueOnEvent<ElevationDetector>()" in java? And is it ok to use >>>>>>> >>>>>> regular >>>>> >>>>>> java objects/types? >>>>>>> >>>>>>>> >>>>>>>> Any other comments to move forward highly appriciated.. Is it somehow >>>>>>>> >>>>>>> possible to get more log what is going wrong? >>>>>>> >>>>>>> You could compile the whole thing for debugging, by adding --debug >>>>>>> after >>>>>>> 'build' in the jcc invocation and run it with gdb. >>>>>>> >>>>>>> If you can isolate a reproducible crash into a small test case, I can >>>>>>> >>>>>> also >>>>> >>>>>> take a look at it. >>>>>>> >>>>>>> Andi.. >>>>>>> >>>>>>> >>>>>>>> WIth best regards >>>>>>>> /Petrus >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> On 15 Dec 2013, at 2:40 , Andi Vajda <va...@apache.org> wrote: >>>>>>>>> >>>>>>>>> >>>>>>>>> On Dec 14, 2013, at 19:14, Petrus Hyvönen <petrus.hyvo...@gmail.com >>>>>>>>>>> >>>>>>>>>> >>>>>>>>> wrote: >>>>>>> >>>>>>>> >>>>>>>>>> Hi, >>>>>>>>>> >>>>>>>>>> I'm having a problem with I think might be related to generic types, >>>>>>>>>> >>>>>>>>> but not sure at all. >>>>>>> >>>>>>>> >>>>>>>>>> I'm wrapping a orbit calculation library, which has been working >>>>>>>>>> well >>>>>>>>>> >>>>>>>>> but in latest version is using generic types and I'm getting some >>>>>>> >>>>>> problems. >>>>> >>>>>> The script works when executed in plain python, but fails in ipython >>>>>>> notebook on this last line when executed as a couple of cells. >>>>>>> >>>>>>>> >>>>>>>>> What is an 'ipython notebook' ? >>>>>>>>> >>>>>>>>> Andi., >>>>>>>>> >>>>>>>>> >>>>>>>>>> The section with problem in my script is: >>>>>>>>>> elDetector = >>>>>>>>>> >>>>>>>>> ElevationDetector(sta1Frame).withConstantElevation(math. >>>>>>> radians(5.0)) >>>>>>> >>>>>>>> elDetector = >>>>>>>>>> >>>>>>>>> elDetector.withHandler(ContinueOnEvent().of_(ElevationDetector)) >>>>>>> >>>>>>>> >>>>>>>>>> In Java it would typically look something like: >>>>>>>>>> >>>>>>>>>> ElevationDetector detector = new ElevationDetector(topo) >>>>>>>>>> .withConstantElevation(x) >>>>>>>>>> .withHandler(new >>>>>>>>>> >>>>>>>>> ContinueOnEvent<ElevationDetector>()); >>>>>>> >>>>>>>> >>>>>>>>>> It produces correct results in plain python, but crashes the kernel >>>>>>>>>> >>>>>>>>> in >>>>> >>>>>> ipython if executed as cells, and in exection from spyder I get an error >>>>>>> message: >>>>>>> >>>>>>>> >>>>>>>>>> " elDetector = >>>>>>>>>> >>>>>>>>> elDetector.withHandler(ContinueOnEvent().of_(ElevationDetector)) >>>>>>> >>>>>>>> AttributeError: 'str' object has no attribute 'wrapfn_' " >>>>>>>>>> >>>>>>>>>> As I have been using this setup stabely with lots of other functions >>>>>>>>>> >>>>>>>>> it feels like there is something with the generic type line, but I >>>>>>> don't >>>>>>> really know how to get any further? I'm confused by that the pauses in >>>>>>> >>>>>> the >>>>> >>>>>> execution could seem to affect the result. >>>>>>> >>>>>>>> >>>>>>>>>> Any comments highly appriciated... >>>>>>>>>> >>>>>>>>>> Best Regards >>>>>>>>>> /Petrus >>>>>>>>>> >>>>>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> _____________________________________________ >>>>>> Petrus Hyvönen, Uppsala, Sweden >>>>>> Mobile Phone/SMS:+46 73 803 19 00 >>>>>> >>>>> >>>>> >>>> >>>> >>>> -- >>>> _____________________________________________ >>>> Petrus Hyvönen, Uppsala, Sweden >>>> Mobile Phone/SMS:+46 73 803 19 00 >>>> >>> >> >> >> -- >> _____________________________________________ >> Petrus Hyvönen, Uppsala, Sweden >> Mobile Phone/SMS:+46 73 803 19 00