diff --git a/config/gen/opengl.pm b/config/gen/opengl.pm index c5d8e7081e..3a3a45a84b 100644 --- a/config/gen/opengl.pm +++ b/config/gen/opengl.pm @@ -797,9 +797,9 @@ sub gen_opengl_wrappers { $autogen_header # GLUT callbacks -v JP -v JPi -v JPii +v pP +v pPi +v pPii # Generated signatures HEADER @@ -826,65 +826,65 @@ HEADER .local pmc glutcb_funcs glutcb_funcs = new 'ResizableStringArray' push glutcb_funcs, 'Parrot_glut_nci_loader' - push glutcb_funcs, 'vJ' + push glutcb_funcs, 'vp' push glutcb_funcs, 'glutcbCloseFunc' - push glutcb_funcs, 'vJP' + push glutcb_funcs, 'vpP' push glutcb_funcs, 'glutcbDisplayFunc' - push glutcb_funcs, 'vJP' + push glutcb_funcs, 'vpP' push glutcb_funcs, 'glutcbIdleFunc' - push glutcb_funcs, 'vJP' + push glutcb_funcs, 'vpP' push glutcb_funcs, 'glutcbMenuDestroyFunc' - push glutcb_funcs, 'vJP' + push glutcb_funcs, 'vpP' push glutcb_funcs, 'glutcbOverlayDisplayFunc' - push glutcb_funcs, 'vJP' + push glutcb_funcs, 'vpP' push glutcb_funcs, 'glutcbWMCloseFunc' - push glutcb_funcs, 'vJP' + push glutcb_funcs, 'vpP' push glutcb_funcs, 'glutcbEntryFunc' - push glutcb_funcs, 'vJP' + push glutcb_funcs, 'vpP' push glutcb_funcs, 'glutcbMenuStateFunc' - push glutcb_funcs, 'vJP' + push glutcb_funcs, 'vpP' push glutcb_funcs, 'glutcbVisibilityFunc' - push glutcb_funcs, 'vJP' + push glutcb_funcs, 'vpP' push glutcb_funcs, 'glutcbWindowStatusFunc' - push glutcb_funcs, 'vJP' + push glutcb_funcs, 'vpP' push glutcb_funcs, 'glutcbButtonBoxFunc' - push glutcb_funcs, 'vJP' + push glutcb_funcs, 'vpP' push glutcb_funcs, 'glutcbDialsFunc' - push glutcb_funcs, 'vJP' + push glutcb_funcs, 'vpP' push glutcb_funcs, 'glutcbMotionFunc' - push glutcb_funcs, 'vJP' + push glutcb_funcs, 'vpP' push glutcb_funcs, 'glutcbPassiveMotionFunc' - push glutcb_funcs, 'vJP' + push glutcb_funcs, 'vpP' push glutcb_funcs, 'glutcbReshapeFunc' - push glutcb_funcs, 'vJP' + push glutcb_funcs, 'vpP' push glutcb_funcs, 'glutcbSpaceballButtonFunc' - push glutcb_funcs, 'vJP' + push glutcb_funcs, 'vpP' push glutcb_funcs, 'glutcbTabletMotionFunc' - push glutcb_funcs, 'vJP' + push glutcb_funcs, 'vpP' push glutcb_funcs, 'glutcbKeyboardFunc' - push glutcb_funcs, 'vJP' + push glutcb_funcs, 'vpP' push glutcb_funcs, 'glutcbKeyboardUpFunc' - push glutcb_funcs, 'vJP' + push glutcb_funcs, 'vpP' push glutcb_funcs, 'glutcbMenuStatusFunc' - push glutcb_funcs, 'vJP' + push glutcb_funcs, 'vpP' push glutcb_funcs, 'glutcbSpaceballMotionFunc' - push glutcb_funcs, 'vJP' + push glutcb_funcs, 'vpP' push glutcb_funcs, 'glutcbSpaceballRotateFunc' - push glutcb_funcs, 'vJP' + push glutcb_funcs, 'vpP' push glutcb_funcs, 'glutcbSpecialFunc' - push glutcb_funcs, 'vJP' + push glutcb_funcs, 'vpP' push glutcb_funcs, 'glutcbSpecialUpFunc' - push glutcb_funcs, 'vJP' + push glutcb_funcs, 'vpP' push glutcb_funcs, 'glutcbMouseFunc' - push glutcb_funcs, 'vJP' + push glutcb_funcs, 'vpP' push glutcb_funcs, 'glutcbMouseWheelFunc' - push glutcb_funcs, 'vJP' + push glutcb_funcs, 'vpP' push glutcb_funcs, 'glutcbTabletButtonFunc' - push glutcb_funcs, 'vJP' + push glutcb_funcs, 'vpP' push glutcb_funcs, 'glutcbTimerFunc' - push glutcb_funcs, 'vJPii' + push glutcb_funcs, 'vpPii' push glutcb_funcs, 'glutcbJoystickFunc' - push glutcb_funcs, 'vJPi' + push glutcb_funcs, 'vpPi' .return (glutcb_funcs) .end diff --git a/runtime/parrot/library/OpenGL.pir b/runtime/parrot/library/OpenGL.pir index e1a5f7ba16..e3ecfa04ab 100644 --- a/runtime/parrot/library/OpenGL.pir +++ b/runtime/parrot/library/OpenGL.pir @@ -199,14 +199,14 @@ Create NCI wrappers for all GL, GLU, and GLUT functions glut_funcs = _glut_func_list() glutcb_funcs = _glutcb_func_list() - _wrap_nci_list(namespace, libgl, gl_funcs) - _wrap_nci_list(namespace, libglu, glu_funcs) - _wrap_nci_list(namespace, libglut, glut_funcs) - _wrap_nci_list(namespace, libglutcb, glutcb_funcs) + _wrap_nci_list(namespace, libgl, gl_funcs, 0) + _wrap_nci_list(namespace, libglu, glu_funcs, 0) + _wrap_nci_list(namespace, libglut, glut_funcs, 0) + _wrap_nci_list(namespace, libglutcb, glutcb_funcs, 1) .end -=item _wrap_nci_list(pmc namespace, pmc library, pmc nci_list) +=item _wrap_nci_list(pmc namespace, pmc library, pmc nci_list, int first_arg_interp) Create NCI wrappers for every C entry point in C, and store the results in C . The list should consist of @@ -218,6 +218,7 @@ alternating function names and Parrot NCI signatures. .param pmc namespace .param pmc library .param pmc nci_list + .param int first_arg_interp .local pmc namespace_key namespace_key = namespace.'get_name'() @@ -232,12 +233,29 @@ alternating function names and Parrot NCI signatures. func_name = shift list_iter signature = shift list_iter function = dlfunc library, func_name, signature + unless first_arg_interp goto done_interp_wrap + .const 'Sub' $P0 = '_call_with_interp' + $P0 = clone $P0 + $P0(function) + function = $P0 + done_interp_wrap: set_root_global namespace_key, func_name, function goto list_loop done: .end +.sub _call_with_interp :anon + .param pmc func + $P0 = getinterp + .yield () + call: + .param pmc args :slurpy + func($P0, args :flat) + .yield () + goto call +.end + =back