-
Notifications
You must be signed in to change notification settings - Fork 179
Open
Labels
Milestone
Description
When we create a value in the branch of a match-ref, delete is not called on that value.
Example with a string:
(deftype Sum One Two)
(defn main []
(let [state @"Ok" sumt &(Sum.One)]
(match-ref sumt
Sum.One (println* &@&state)
Sum.Two ())))Emitted C code
int main(int argc, char** argv) {
carp_init_globals(argc, argv);
/* let */ {
static String _6 = "Ok";
String *_6_ref = &_6;
String _7 = String_copy(_6_ref);
String state = _7;
Sum _11 = Sum_One();
Sum* _12 = &_11; // ref
Sum* sumt = _12;
if(sumt->_tag == Sum_One_tag) {
Sum* _15_temp = sumt;
// Case expr:
String* _24 = &state; // ref
String _25 = String_copy(_24);
String* _26 = &_25; // ref
String _27 = String_str(_26);
String* _28 = &_27; // ref
IO_println(_28);
}
else if(sumt->_tag == Sum_Two_tag) {
Sum* _15_temp = sumt;
// Case expr:
/* () */
}
else {
// This will not be needed with static exhaustiveness checking in 'match' expressions:
fprintf(stderr, "Unhandled case in 'match' expression at line 7, column 6 in '/home/tim/dev/sandbox/matc/main.carp'\n");
exit(1);
}
String_delete(state);
Sum_delete(_11);
}
return 0;
}Example with a lambda:
(deftype Sum One Two)
(defn main []
(let [state 0]
(match-ref &(Sum.One)
Sum.One (println* ((fn [] @&state)))
Sum.Two ())))Emitted C code
int main(int argc, char** argv) {
carp_init_globals(argc, argv);
/* let */ {
int state = 0;
Sum _10 = Sum_One();
Sum* _11 = &_10; // ref
if(_11->_tag == Sum_One_tag) {
Sum* _11_temp = _11;
// Case expr:
// This lambda captures 1 variables: state
_Lambda_NAKED_LAMBDA_23_env *_23_env = CARP_MALLOC(sizeof(_Lambda_NAKED_LAMBDA_23_env));
_23_env->state = state;
Lambda _23 = {
.callback = (void*)_Lambda_NAKED_LAMBDA_23,
.env = _23_env,
.delete = (void*)_Lambda_NAKED_LAMBDA_23_env_delete,
.copy = (void*)_Lambda_NAKED_LAMBDA_23_env_copy
};
int _24 = _23.env ? ((int(*)(LambdaEnv))_23.callback)(_23.env) : ((int(*)())_23.callback)();
String _25 = Int_str(_24);
String* _26 = &_25; // ref
IO_println(_26);
}
else if(_11->_tag == Sum_Two_tag) {
Sum* _11_temp = _11;
// Case expr:
/* () */
}
else {
// This will not be needed with static exhaustiveness checking in 'match' expressions:
fprintf(stderr, "Unhandled case in 'match' expression at line 7, column 4 in '/home/tim/dev/sandbox/matc/main.carp'\n");
exit(1);
}
Sum_delete(_10);
}
return 0;
}dleslie