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:
parent
8bf966a65c
commit
b9ecf75f17
1 changed files with 21 additions and 14 deletions
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue