Generate cleanup code.

This commit is contained in:
Oliver Buchtala 2012-11-16 22:10:02 +01:00
commit 57980975a0

View file

@ -272,6 +272,8 @@ protected:
virtual void marshalOutput(Node *n, Wrapper *wrapper, String *actioncode, const String *cresult=0, bool emitReturnVariable = true); virtual void marshalOutput(Node *n, Wrapper *wrapper, String *actioncode, const String *cresult=0, bool emitReturnVariable = true);
virtual void emitCleanupCode(Wrapper *wrapper, ParmList *params);
void registerProxyType(SwigType* type); void registerProxyType(SwigType* type);
/** /**
@ -831,6 +833,9 @@ int JSEmitter::emitCtor(Node *n) {
marshalInputArgs(n, params, wrapper, Ctor, true, false); marshalInputArgs(n, params, wrapper, Ctor, true, false);
Printv(wrapper->code, action, "\n", 0); Printv(wrapper->code, action, "\n", 0);
emitCleanupCode(wrapper, params);
t_ctor.replace(T_WRAPPER, wrap_name) t_ctor.replace(T_WRAPPER, wrap_name)
.replace(T_TYPE_MANGLED, state.clazz(TYPE_MANGLED)) .replace(T_TYPE_MANGLED, state.clazz(TYPE_MANGLED))
.replace(T_LOCALS, wrapper->locals) .replace(T_LOCALS, wrapper->locals)
@ -914,6 +919,8 @@ int JSEmitter::emitGetter(Node *n, bool is_member, bool is_static) {
marshalInputArgs(n, params, wrapper, Getter, is_member, is_static); marshalInputArgs(n, params, wrapper, Getter, is_member, is_static);
marshalOutput(n, wrapper, action); marshalOutput(n, wrapper, action);
emitCleanupCode(wrapper, params);
t_getter.replace(T_WRAPPER, wrap_name) t_getter.replace(T_WRAPPER, wrap_name)
.replace(T_LOCALS, wrapper->locals) .replace(T_LOCALS, wrapper->locals)
.replace(T_CODE, wrapper->code) .replace(T_CODE, wrapper->code)
@ -950,6 +957,8 @@ int JSEmitter::emitSetter(Node *n, bool is_member, bool is_static) {
marshalInputArgs(n, params, wrapper, Setter, is_member, is_static); marshalInputArgs(n, params, wrapper, Setter, is_member, is_static);
Append(wrapper->code, action); Append(wrapper->code, action);
emitCleanupCode(wrapper, params);
t_setter.replace(T_WRAPPER, wrap_name) t_setter.replace(T_WRAPPER, wrap_name)
.replace(T_LOCALS, wrapper->locals) .replace(T_LOCALS, wrapper->locals)
.replace(T_CODE, wrapper->code) .replace(T_CODE, wrapper->code)
@ -1027,6 +1036,8 @@ int JSEmitter::emitFunction(Node *n, bool is_member, bool is_static) {
marshalInputArgs(n, params, wrapper, Function, is_member, is_static); marshalInputArgs(n, params, wrapper, Function, is_member, is_static);
marshalOutput(n, wrapper, action); marshalOutput(n, wrapper, action);
emitCleanupCode(wrapper, params);
t_function.replace(T_WRAPPER, wrap_name) t_function.replace(T_WRAPPER, wrap_name)
.replace(T_LOCALS, wrapper->locals) .replace(T_LOCALS, wrapper->locals)
.replace(T_CODE, wrapper->code) .replace(T_CODE, wrapper->code)
@ -1140,6 +1151,22 @@ void JSEmitter::marshalOutput(Node *n, Wrapper *wrapper, String *actioncode, co
} }
} }
void JSEmitter::emitCleanupCode(Wrapper *wrapper, ParmList *params) {
Parm *p;
String *tm;
for (p = params; p;) {
if ((tm = Getattr(p, "tmap:freearg"))) {
//addThrows(n, "tmap:freearg", p);
Replaceall(tm, "$input", Getattr(p, "emit:input"));
Printv(wrapper->code, tm, "\n", NIL);
p = Getattr(p, "tmap:freearg:next");
} else {
p = nextSibling(p);
}
}
}
int JSEmitter::switchNamespace(Node *n) { int JSEmitter::switchNamespace(Node *n) {
if (!GetFlag(n, "feature:nspace")) { if (!GetFlag(n, "feature:nspace")) {