Make JSC inheritance definition more robust.
This commit is contained in:
parent
973042302b
commit
80ce36c445
2 changed files with 26 additions and 6 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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"));
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue