Convert python to cJson and then to string

This commit is contained in:
Mahbub Alam 2023-10-14 19:49:12 -04:00
parent 7ae7e0b50d
commit 9f5af2b5a0

View File

@ -3,79 +3,58 @@
namespace pkpy{ namespace pkpy{
static std::string convert_python_object_to_string(PyObject* obj, VM* vm); static cJSON* convert_python_object_to_cjson(PyObject* obj, VM* vm);
static PyObject* convert_cjson_to_python_object(const cJSON * const item, VM* vm); static PyObject* convert_cjson_to_python_object(const cJSON * const item, VM* vm);
static std::string convert_list_to_string(const List& list, VM* vm){ static cJSON* convert_list_to_cjson(const List& list, VM* vm){
bool extra_comma_flag = false; cJSON *cjson_list = cJSON_CreateArray();
std::string output = "[";
for(auto& element : list){ for(auto& element : list){
output = output + convert_python_object_to_string(element, vm) + ", "; cJSON_AddItemToArray(cjson_list, convert_python_object_to_cjson(element, vm));
extra_comma_flag = true;
} }
if(extra_comma_flag){ return cjson_list;
output.pop_back();
output.pop_back();
}
return output + "]";
} }
static std::string convert_tuple_to_string(const Tuple& tuple, VM* vm){ static cJSON* convert_tuple_to_cjson(const Tuple& tuple, VM* vm){
bool extra_comma_flag = false; cJSON *cjson_list = cJSON_CreateArray();
std::string output = "[";
for(auto& element : tuple){ for(auto& element : tuple){
output = output + convert_python_object_to_string(element, vm) + ", "; cJSON_AddItemToArray(cjson_list, convert_python_object_to_cjson(element, vm));
extra_comma_flag = true;
} }
if (extra_comma_flag){ return cjson_list;
output.pop_back();
output.pop_back();
}
return output + "]";
} }
static std::string covert_dict_to_string(const Dict& dict, VM* vm){ static cJSON* covert_dict_to_cjson(const Dict& dict, VM* vm){
std::string output = "{"; cJSON *cjson_object = cJSON_CreateObject();
dict.apply([&](PyObject* key, PyObject* val){ dict.apply([&](PyObject* key, PyObject* val){
output = output + "\"" + CAST(Str&, key).c_str() + "\":"; cJSON_AddItemToObject(cjson_object, CAST(Str&, key).c_str(), convert_python_object_to_cjson(val, vm));
output = output + convert_python_object_to_string(val, vm) + ",";
}); });
output.pop_back(); return cjson_object;
return output + "}";
} }
static std::string convert_python_object_to_string(PyObject* obj, VM* vm){ static cJSON* convert_python_object_to_cjson(PyObject* obj, VM* vm){
if (is_type(obj, vm->tp_int)){ if (is_type(obj, vm->tp_int)){
return std::to_string(CAST(i64, obj)); return cJSON_CreateNumber(CAST(i64, obj));
} }
else if (is_type(obj, vm->tp_float)){ else if (is_type(obj, vm->tp_float)){
return std::to_string(CAST(f64, obj)); return cJSON_CreateNumber(CAST(f64, obj));
} }
else if (is_type(obj, vm->tp_bool)){ else if (is_type(obj, vm->tp_bool)){
if (obj == vm->True){ return cJSON_CreateBool(obj == vm->True);
return "true";
}
else{
return "false";
}
} }
else if (is_type(obj, vm->tp_str)){ else if (is_type(obj, vm->tp_str)){
std::string str = CAST(Str&, obj).replace("\n", "\\n").replace("\"", "\\\"").c_str(); return cJSON_CreateString(CAST(Str&, obj).c_str());
return std::string("\"") + str + std::string("\"");
} }
else if (is_type(obj, vm->tp_dict)){ else if (is_type(obj, vm->tp_dict)){
return covert_dict_to_string(CAST(Dict&, obj), vm); return covert_dict_to_cjson(CAST(Dict&, obj), vm);
} }
else if (is_type(obj, vm->tp_list)){ else if (is_type(obj, vm->tp_list)){
return convert_list_to_string(CAST(List&, obj), vm); return convert_list_to_cjson(CAST(List&, obj), vm);
} }
else if(is_type(obj, vm->tp_tuple)){ else if(is_type(obj, vm->tp_tuple)){
return convert_tuple_to_string(CAST(Tuple&, obj), vm); return convert_tuple_to_cjson(CAST(Tuple&, obj), vm);
} }
return "null"; return cJSON_CreateNull();
} }
static PyObject* convert_cjson_to_list(const cJSON * const item, VM* vm){ static PyObject* convert_cjson_to_list(const cJSON * const item, VM* vm){
List list; List list;
@ -136,9 +115,9 @@ void add_module_cjson(VM* vm){
vm->bind_func<1>(mod, "dumps", [](VM* vm, ArgsView args) { vm->bind_func<1>(mod, "dumps", [](VM* vm, ArgsView args) {
std::string str = convert_python_object_to_string(args[0], vm); cJSON* cjson = convert_python_object_to_cjson(args[0], vm);
return VAR(str); char* str = cJSON_Print(cjson);
return VAR(Str(str));
}); });
} }