@@ -266,16 +266,14 @@ void raise_if_failed(ErlNifEnv *env, Py_ssize_t size) {
266
266
}
267
267
}
268
268
269
- ERL_NIF_TERM py_object_to_binary_term (ErlNifEnv *env, PyObjectPtr py_object) {
269
+ ERL_NIF_TERM py_str_to_binary_term (ErlNifEnv *env, PyObjectPtr py_object) {
270
270
Py_ssize_t size;
271
271
auto buffer = PyUnicode_AsUTF8AndSize (py_object, &size);
272
272
raise_if_failed (env, buffer);
273
273
274
- ERL_NIF_TERM binary_term;
275
- auto data = enif_make_new_binary (env, size, &binary_term);
276
- memcpy (data, buffer, size);
277
-
278
- return binary_term;
274
+ Py_IncRef (py_object);
275
+ auto ex_object_resource = fine::make_resource<ExObjectResource>(py_object);
276
+ return fine::make_resource_binary (env, ex_object_resource, buffer, size);
279
277
}
280
278
281
279
fine::Ok<> init (ErlNifEnv *env, std::string python_dl_path,
@@ -583,7 +581,7 @@ fine::Term unicode_to_string(ErlNifEnv *env, ExObject ex_object) {
583
581
ensure_initialized ();
584
582
auto gil_guard = PyGILGuard ();
585
583
586
- return py_object_to_binary_term (env, ex_object.resource ->py_object );
584
+ return py_str_to_binary_term (env, ex_object.resource ->py_object );
587
585
}
588
586
589
587
FINE_NIF (unicode_to_string, ERL_NIF_DIRTY_JOB_CPU_BOUND);
@@ -745,7 +743,7 @@ fine::Term format_exception(ErlNifEnv *env, ExError error) {
745
743
auto py_line = PyList_GetItem (py_lines, i);
746
744
raise_if_failed (env, py_line);
747
745
748
- terms.push_back (py_object_to_binary_term (env, py_line));
746
+ terms.push_back (py_str_to_binary_term (env, py_line));
749
747
}
750
748
751
749
return enif_make_list_from_array (env, terms.data (),
@@ -803,7 +801,7 @@ fine::Term decode_once(ErlNifEnv *env, ExObject ex_object) {
803
801
raise_if_failed (env, py_str);
804
802
auto py_str_guard = PyDecRefGuard (py_str);
805
803
806
- auto binary_term = py_object_to_binary_term (env, py_str);
804
+ auto binary_term = py_str_to_binary_term (env, py_str);
807
805
808
806
return fine::encode (
809
807
env, std::make_tuple (atoms::integer, fine::Term (binary_term)));
@@ -904,7 +902,7 @@ fine::Term decode_once(ErlNifEnv *env, ExObject ex_object) {
904
902
auto is_unicode = PyObject_IsInstance (py_object, py_str_type);
905
903
raise_if_failed (env, is_unicode);
906
904
if (is_unicode) {
907
- return py_object_to_binary_term (env, py_object);
905
+ return py_str_to_binary_term (env, py_object);
908
906
}
909
907
910
908
auto py_bytes_type = PyDict_GetItemString (py_builtins, " bytes" );
@@ -917,11 +915,9 @@ fine::Term decode_once(ErlNifEnv *env, ExObject ex_object) {
917
915
auto result = PyBytes_AsStringAndSize (py_object, &buffer, &size);
918
916
raise_if_failed (env, result);
919
917
920
- ERL_NIF_TERM binary_term;
921
- auto data = enif_make_new_binary (env, size, &binary_term);
922
- memcpy (data, buffer, size);
923
-
924
- return binary_term;
918
+ Py_IncRef (py_object);
919
+ auto ex_object_resource = fine::make_resource<ExObjectResource>(py_object);
920
+ return fine::make_resource_binary (env, ex_object_resource, buffer, size);
925
921
}
926
922
927
923
auto py_set_type = PyDict_GetItemString (py_builtins, " set" );
@@ -1341,7 +1337,7 @@ eval(ErlNifEnv *env, ErlNifBinary code, std::string code_md5,
1341
1337
continue ;
1342
1338
}
1343
1339
1344
- auto key_term = py_object_to_binary_term (env, py_key);
1340
+ auto key_term = py_str_to_binary_term (env, py_key);
1345
1341
key_terms.push_back (key_term);
1346
1342
1347
1343
// Incref before making the resource
0 commit comments