Fix emitter for member pointer constants.

However, I am not happy with the constant emitter in general.
Should not return dynamic values but register constant wrappers statically.
This commit is contained in:
Oliver Buchtala 2013-09-24 01:50:13 +02:00
commit b9ecf75f17

View file

@ -1044,30 +1044,37 @@ int JSEmitter::emitSetter(Node *n, bool is_member, bool is_static) {
int JSEmitter::emitConstant(Node *n) { int JSEmitter::emitConstant(Node *n) {
Wrapper *wrapper = NewWrapper(); Wrapper *wrapper = NewWrapper();
SwigType *type = Getattr(n, "type");
String *name = Getattr(n, "name");
String *iname = Getattr(n, "sym:name");
String *wname = Swig_name_wrapper(name);
String *rawval = Getattr(n, "rawval");
String *value = rawval ? rawval : Getattr(n, "value");
Template t_getter(getTemplate("js_getter")); Template t_getter(getTemplate("js_getter"));
// call the variable methods as a constants are // call the variable methods as a constants are
// registred in same way // registred in same way
enterVariable(n); enterVariable(n);
state.variable(GETTER, wname);
// TODO: why do we need this?
Setattr(n, "wrap:name", wname);
// prepare function wrapper name // special treatment of member pointers
String *wrap_name = Swig_name_wrapper(Getattr(n, "name")); if (SwigType_type(type) == T_MPOINTER) {
state.variable(GETTER, wrap_name); // TODO: this could go into a code-template
Setattr(n, "wrap:name", wrap_name); String *mpointer_wname = NewString("");
Printf(mpointer_wname, "_wrapConstant_%s", iname);
// prepare code part Setattr(n, "memberpointer:constant:wrap:name", mpointer_wname);
String *value = Getattr(n, "rawval"); String *str = SwigType_str(type, mpointer_wname);
if (value == NULL) { Printf(f_wrappers, "static %s = %s;\n", str, value);
value = Getattr(n, "rawvalue"); Delete(str);
if (value == NULL) value = Getattr(n, "value"); value = mpointer_wname;
} }
assert(value != NULL);
String *action = NewString(""); marshalOutput(n, 0, wrapper, NewString(""), value, false);
marshalOutput(n, 0, wrapper, action, value, false);
t_getter.replace("$jswrapper", wrap_name) t_getter.replace("$jswrapper", wname)
.replace("$jslocals", wrapper->locals) .replace("$jslocals", wrapper->locals)
.replace("$jscode", wrapper->code) .replace("$jscode", wrapper->code)
.pretty_print(f_wrappers); .pretty_print(f_wrappers);