这是indexloc提供的服务,不要输入任何密码
Skip to content

Allocation made in match-ref branch do not get freed properly  #1064

@TimDeve

Description

@TimDeve

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;
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions