diff options
| author | Emmanuel Raviart <eraviart@entrouvert.com> | 2005-01-09 23:38:13 +0000 |
|---|---|---|
| committer | Emmanuel Raviart <eraviart@entrouvert.com> | 2005-01-09 23:38:13 +0000 |
| commit | 9a741aa87859b4cb10f5c644608859ee8c112a1d (patch) | |
| tree | 35fa659685d17248987322d2f0fd429cfd73d6aa /php | |
| parent | e86892f3c014f2bbbd236cb2706d5004facdc2bc (diff) | |
| download | lasso-9a741aa87859b4cb10f5c644608859ee8c112a1d.tar.gz lasso-9a741aa87859b4cb10f5c644608859ee8c112a1d.tar.xz lasso-9a741aa87859b4cb10f5c644608859ee8c112a1d.zip | |
Swig: Added a patch to PHP, so that it handles correctly dynamic cast of
function results.
[Note: Patch is not integrated in Makefile.am.]
Diffstat (limited to 'php')
| -rwxr-xr-x | php/patch_swig_output.py | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/php/patch_swig_output.py b/php/patch_swig_output.py new file mode 100755 index 00000000..c8d82e2d --- /dev/null +++ b/php/patch_swig_output.py @@ -0,0 +1,129 @@ +#! /usr/bin/env python + +"""Correct Swig output for PHP binding. + +The PHP binding of Swig version 1.3.22 doest handle dynamic cast of function results well: After +the C object is dynamically casted, it creates a statically caster PHP object. + +This program corrects this, by replacing: + { + swig_type_info *ty = SWIG_TypeDynamicCast(SWIGTYPE_p_LassoXXX, (void **) &result); + SWIG_SetPointerZval(return_value, (void *)result, ty, 1); + } + /* Wrap this return value */ + if (this_ptr) { + /* NATIVE Constructor, use this_ptr */ + zval *_cPtr; MAKE_STD_ZVAL(_cPtr); + *_cPtr = *return_value; + INIT_ZVAL(*return_value); + add_property_zval(this_ptr,"_cPtr",_cPtr); + } else if (! this_ptr) { + /* ALTERNATIVE Constructor, make an object wrapper */ + zval *obj, *_cPtr; + MAKE_STD_ZVAL(obj); + MAKE_STD_ZVAL(_cPtr); + *_cPtr = *return_value; + INIT_ZVAL(*return_value); + object_init_ex(obj,ptr_ce_swig_LassoXXX); + add_property_zval(obj,"_cPtr",_cPtr); + *return_value=*obj; + } +with: + { + swig_type_info *ty = SWIG_TypeDynamicCast(SWIGTYPE_p_LassoXXX, (void **) &result); + SWIG_SetPointerZval(return_value, (void *)result, ty, 1); + /* Wrap this return value */ + if (this_ptr) { + /* NATIVE Constructor, use this_ptr */ + zval *_cPtr; MAKE_STD_ZVAL(_cPtr); + *_cPtr = *return_value; + INIT_ZVAL(*return_value); + add_property_zval(this_ptr,"_cPtr",_cPtr); + } else if (! this_ptr) { + /* ALTERNATIVE Constructor, make an object wrapper */ + zval *obj, *_cPtr; + MAKE_STD_ZVAL(obj); + MAKE_STD_ZVAL(_cPtr); + *_cPtr = *return_value; + INIT_ZVAL(*return_value); + object_init_ex(obj,ptr_ce_swig_LassoXXX); + add_property_zval(obj,"_cPtr",_cPtr); + *return_value=*obj; + }} +and + { + swig_type_info *ty = SWIG_TypeDynamicCast(SWIGTYPE_p_LassoXXX, (void **) &result); + SWIG_SetPointerZval(return_value, (void *)result, ty, 0); + } + /* Wrap this return value */ + { + /* ALTERNATIVE Constructor, make an object wrapper */ + zval *obj, *_cPtr; + MAKE_STD_ZVAL(obj); + MAKE_STD_ZVAL(_cPtr); + *_cPtr = *return_value; + INIT_ZVAL(*return_value); + object_init_ex(obj,ptr_ce_swig_LassoSamlpResponseAbstract); + add_property_zval(obj,"_cPtr",_cPtr); + *return_value=*obj; + } +with: + { + swig_type_info *ty = SWIG_TypeDynamicCast(SWIGTYPE_p_LassoXXX, (void **) &result); + SWIG_SetPointerZval(return_value, (void *)result, ty, 0); + /* Wrap this return value */ + /* ALTERNATIVE Constructor, make an object wrapper */ + zval *obj, *_cPtr; + MAKE_STD_ZVAL(obj); + MAKE_STD_ZVAL(_cPtr); + *_cPtr = *return_value; + INIT_ZVAL(*return_value); + object_init_ex(obj,ptr_ce_swig_LassoSamlpResponseAbstract); + add_property_zval(obj,"_cPtr",_cPtr); + *return_value=*obj; + } +""" + +wrapFile = file('lasso_wrap.c') +wrap = wrapFile.read() +wrapFile.close() + +i = wrap.find(' {\n swig_type_info *ty = SWIG_TypeDynamicCast(') +while i >= 0: + end = """ + *return_value=*obj; + } +""" + j = wrap.find(end, i) + len(end) + segment = wrap[i:j] + if 'this_ptr' in segment: + segment = segment.replace(""" + } + /* Wrap this return value */ + if (this_ptr) { +""", """ + /* Wrap this return value */ + if (this_ptr) { +""") + + segment = segment.replace(end, """ + *return_value=*obj; + }} +""") + else: + segment = segment.replace(""" + } + /* Wrap this return value */ + { +""", """ + /* Wrap this return value */ +""") + x = segment.find('object_init_ex(obj,') + len('object_init_ex(obj,') + y = segment.find(')', x) + segment = '%s%s%s' % (segment[:x], 'get_node_info_with_swig(ty)->php', segment[y:]) + wrap = '%s%s%s' % (wrap[:i], segment, wrap[j:]) + i = wrap.find(' {\n swig_type_info *ty = SWIG_TypeDynamicCast(', i + len(segment)) + +wrapFile = file('lasso_wrap_patched.c', 'w') +wrapFile.write(wrap) +wrapFile.close() |
