From 80ce36c445c704a105a70d6820baefb74a7cd0ec Mon Sep 17 00:00:00 2001 From: Oliver Buchtala Date: Mon, 16 Sep 2013 02:27:51 +0200 Subject: [PATCH] Make JSC inheritance definition more robust. --- Lib/javascript/jsc/javascriptcode.swg | 15 ++++++++++++++- Source/Modules/javascript.cxx | 17 ++++++++++++----- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/Lib/javascript/jsc/javascriptcode.swg b/Lib/javascript/jsc/javascriptcode.swg index 2660e0e5e..42837f7f4 100644 --- a/Lib/javascript/jsc/javascriptcode.swg +++ b/Lib/javascript/jsc/javascriptcode.swg @@ -394,11 +394,24 @@ JSStaticFunction $jsmangledname_functions[] = { $jsmangledname_classDefinition.finalize = $jsdtor; $jsmangledname_objectDefinition.staticValues = $jsmangledname_values; $jsmangledname_objectDefinition.staticFunctions = $jsmangledname_functions; - $jsmangledname_objectDefinition.parentClass = $jsbaseclass_classRef; + $jsclass_inheritance JSClassRef $jsmangledname_classRef = JSClassCreate(&$jsmangledname_objectDefinition); 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 * - $jsname: class name diff --git a/Source/Modules/javascript.cxx b/Source/Modules/javascript.cxx index e2ca9026a..038094a12 100644 --- a/Source/Modules/javascript.cxx +++ b/Source/Modules/javascript.cxx @@ -1638,19 +1638,26 @@ int JSCEmitter::exitClass(Node *n) { Template t_classtemplate(getTemplate("jsc_class_definition")); /* prepare registration of base class */ - String *base_name_mangled = NewString("_SwigObject"); + String *jsclass_inheritance = NewString(""); Node *base_class = getBaseClass(n); if (base_class != NULL) { - Delete(base_name_mangled); - base_name_mangled = SwigType_manglestr(Getattr(base_class, "name")); + Template t_inherit(getTemplate("jsc_class_inherit")); + 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)) .replace("$jsmangledtype", state.clazz(TYPE_MANGLED)) - .replace("$jsbaseclass", base_name_mangled) + .replace("$jsclass_inheritance", jsclass_inheritance) .replace("$jsctor", state.clazz(CTOR)) .replace("$jsdtor", state.clazz(DTOR)) .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 */ SwigType_remember_clientdata(state.clazz(TYPE_MANGLED), NewString("0"));