Make JSC inheritance definition more robust.

This commit is contained in:
Oliver Buchtala 2013-09-16 02:27:51 +02:00
commit 80ce36c445
2 changed files with 26 additions and 6 deletions

View file

@ -394,11 +394,24 @@ JSStaticFunction $jsmangledname_functions[] = {
$jsmangledname_classDefinition.finalize = $jsdtor; $jsmangledname_classDefinition.finalize = $jsdtor;
$jsmangledname_objectDefinition.staticValues = $jsmangledname_values; $jsmangledname_objectDefinition.staticValues = $jsmangledname_values;
$jsmangledname_objectDefinition.staticFunctions = $jsmangledname_functions; $jsmangledname_objectDefinition.staticFunctions = $jsmangledname_functions;
$jsmangledname_objectDefinition.parentClass = $jsbaseclass_classRef; $jsclass_inheritance
JSClassRef $jsmangledname_classRef = JSClassCreate(&$jsmangledname_objectDefinition); JSClassRef $jsmangledname_classRef = JSClassCreate(&$jsmangledname_objectDefinition);
SWIGTYPE_$jsmangledtype->clientdata = $jsmangledname_classRef; SWIGTYPE_$jsmangledtype->clientdata = $jsmangledname_classRef;
%} %}
%fragment ("jsc_class_inherit", templates)
%{
if (SWIGTYPE_p$jsbaseclassmangled != NULL) {
$jsmangledname_objectDefinition.parentClass = (JSClassRef) SWIGTYPE_p$jsbaseclassmangled->clientdata;
}
%}
%fragment ("jsc_class_noinherit", templates)
%{
$jsmangledname_objectDefinition.parentClass = _SwigObject_classRef;
%}
/* ----------------------------------------------------------------------------- /* -----------------------------------------------------------------------------
* jsc_register_class: template for registration of a class * jsc_register_class: template for registration of a class
* - $jsname: class name * - $jsname: class name

View file

@ -1638,19 +1638,26 @@ int JSCEmitter::exitClass(Node *n) {
Template t_classtemplate(getTemplate("jsc_class_definition")); Template t_classtemplate(getTemplate("jsc_class_definition"));
/* prepare registration of base class */ /* prepare registration of base class */
String *base_name_mangled = NewString("_SwigObject"); String *jsclass_inheritance = NewString("");
Node *base_class = getBaseClass(n); Node *base_class = getBaseClass(n);
if (base_class != NULL) { if (base_class != NULL) {
Delete(base_name_mangled); Template t_inherit(getTemplate("jsc_class_inherit"));
base_name_mangled = SwigType_manglestr(Getattr(base_class, "name")); t_inherit.replace("$jsmangledname", state.clazz(NAME_MANGLED))
.replace("$jsbaseclassmangled", SwigType_manglestr(Getattr(base_class, "name")))
.pretty_print(jsclass_inheritance);
} else {
Template t_inherit(getTemplate("jsc_class_noinherit"));
t_inherit.replace("$jsmangledname", state.clazz(NAME_MANGLED))
.pretty_print(jsclass_inheritance);
} }
t_classtemplate.replace("$jsmangledname", state.clazz(NAME_MANGLED)) t_classtemplate.replace("$jsmangledname", state.clazz(NAME_MANGLED))
.replace("$jsmangledtype", state.clazz(TYPE_MANGLED)) .replace("$jsmangledtype", state.clazz(TYPE_MANGLED))
.replace("$jsbaseclass", base_name_mangled) .replace("$jsclass_inheritance", jsclass_inheritance)
.replace("$jsctor", state.clazz(CTOR)) .replace("$jsctor", state.clazz(CTOR))
.replace("$jsdtor", state.clazz(DTOR)) .replace("$jsdtor", state.clazz(DTOR))
.pretty_print(state.global(INITIALIZER)); .pretty_print(state.global(INITIALIZER));
Delete(base_name_mangled); Delete(jsclass_inheritance);
/* Note: this makes sure that there is a swig_type added for this class */ /* Note: this makes sure that there is a swig_type added for this class */
SwigType_remember_clientdata(state.clazz(TYPE_MANGLED), NewString("0")); SwigType_remember_clientdata(state.clazz(TYPE_MANGLED), NewString("0"));