diff options
author | Alon Zakai <alonzakai@gmail.com> | 2011-08-17 14:07:38 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2011-08-17 14:07:38 -0700 |
commit | 7258f46b91b6c0eccd1881dd0c95a679d712b959 (patch) | |
tree | 9f9725859ffc15774b11242f0c375320f820fec7 | |
parent | c2d71f807a84cb1cfad154c59e9d6859fff3e631 (diff) |
add destroy() in bindings generation
-rwxr-xr-x | tools/bindings_generator.py | 35 |
1 files changed, 32 insertions, 3 deletions
diff --git a/tools/bindings_generator.py b/tools/bindings_generator.py index 076c1106..4e36d032 100755 --- a/tools/bindings_generator.py +++ b/tools/bindings_generator.py @@ -191,6 +191,23 @@ for classname, clazz in classes.iteritems(): }], }) + # Add destroyer + if not clazz.get('abstract'): + clazz['methods'].append({ + 'destroyer': True, + 'name': '__destroy__', + 'constructor': False, + 'destructor': False, + 'static': False, + 'returns': 'void', + 'returns_text': 'void', + 'returns_reference': False, + 'returns_pointer': False, + 'pure_virtual': False, + 'num_args': set([0]), + 'parameters': [], + }) + # Explore all functions we need to generate, including parent classes, handling of overloading, etc. def clean_type(t): @@ -218,7 +235,7 @@ for classname, clazz in parsed.classes.iteritems(): if method['name'] not in clazz['final_methods']: copied = clazz['final_methods'][method['name']] = {} for key in ['name', 'constructor', 'static', 'returns', 'returns_text', 'returns_reference', 'returns_pointer', 'destructor', 'pure_virtual', - 'getter', 'setter']: + 'getter', 'setter', 'destroyer']: copied[key] = method.get(key) copied['num_args'] = method['num_args'].copy() copied['origin'] = subclass @@ -293,9 +310,17 @@ gen_c.write('extern "C" {\n') # Use this when calling a binding function when you want to pass a null pointer. # Having this object saves us needing to do checks for the object being null each time in the bindings code. gen_js.write(''' +// Bindings utilities function wrapPointer(ptr) { return { ptr: ptr } }; this['wrapPointer'] = wrapPointer; + this['NULL'] = wrapPointer(0); + +function destroy(obj) { + if (!obj['__destroy__']) throw 'Error: Cannot destroy object. (Did you create it yourself?)'; + obj['__destroy__'](); +} +this['destroy'] = destroy; ''') def generate_wrapping_code(classname): @@ -316,14 +341,14 @@ def generate_class(generating_classname, classname, clazz): # TODO: deprecate ge inherited = generating_classname_head != classname_head - if clazz['abstract']: + abstract = clazz['abstract'] + if abstract: # For abstract base classes, add a function definition on top. There is no constructor gen_js.write('\nfunction ' + generating_classname_head + ('(){ throw "%s is abstract!" }\n' % generating_classname_head) + generate_wrapping_code(generating_classname_head)) if export: gen_js.write('''this['%s'] = %s; ''' % (generating_classname_head, generating_classname_head)) - for method in clazz['final_methods'].itervalues(): mname = method['name'] if classname_head + '::' + mname in ignored: @@ -416,6 +441,10 @@ def generate_class(generating_classname, classname, clazz): # TODO: deprecate ge gen_c.write(''' self->%s = value; ''' % actualmname) + elif method.get('destroyer'): + gen_c.write(''' + delete self; +''') else: # normal method gen_c.write(''' %s%s%s(%s); |