@@ -278,21 +278,28 @@ static Arg* VM_instruction_handler_NON(PikaObj* self,
278278}
279279
280280Arg * __vm_get (PikaObj * self , Arg * key , Arg * obj ) {
281- ArgType obj_type = arg_getType (obj );
281+ ArgType type = arg_getType (obj );
282+ Arg * obj_new = NULL ;
282283 int index = 0 ;
283284 if (ARG_TYPE_INT == arg_getType (key )) {
284285 index = arg_getInt (key );
285286 }
286- if (ARG_TYPE_STRING == obj_type ) {
287+ if (ARG_TYPE_STRING == type ) {
288+ #if PIKA_STRING_UTF8_ENABLE
289+ PIKA_BOOL is_temp = 0 ;
290+ obj_new = arg_newObj (_arg_to_obj (obj , & is_temp ));
291+ type = arg_getType (obj_new );
292+ #else
287293 char * str_pyload = arg_getStr (obj );
288294 char char_buff [] = " " ;
289295 if (index < 0 ) {
290296 index = strGetSize (str_pyload ) + index ;
291297 }
292298 char_buff [0 ] = str_pyload [index ];
293299 return arg_newStr (char_buff );
300+ #endif
294301 }
295- if (ARG_TYPE_BYTES == obj_type ) {
302+ if (ARG_TYPE_BYTES == type ) {
296303 uint8_t * bytes_pyload = arg_getBytes (obj );
297304 uint8_t byte_buff [] = " " ;
298305 if (index < 0 ) {
@@ -301,8 +308,13 @@ Arg* __vm_get(PikaObj* self, Arg* key, Arg* obj) {
301308 byte_buff [0 ] = bytes_pyload [index ];
302309 return arg_newBytes (byte_buff , 1 );
303310 }
304- if (argType_isObject (obj_type )) {
305- PikaObj * arg_obj = arg_getPtr (obj );
311+ if (argType_isObject (type )) {
312+ PikaObj * arg_obj = NULL ;
313+ if (obj_new != NULL ) {
314+ arg_obj = arg_getPtr (obj_new );
315+ } else {
316+ arg_obj = arg_getPtr (obj );
317+ }
306318 obj_setArg (arg_obj , "__key" , key );
307319 /* clang-format off */
308320 PIKA_PYTHON (
@@ -322,9 +334,17 @@ Arg* __vm_get(PikaObj* self, Arg* key, Arg* obj) {
322334 };
323335 pikaVM_runByteCode (arg_obj , (uint8_t * )bytes );
324336 Arg * __res = args_getArg (arg_obj -> list , "__res" );
337+ Arg * res = NULL ;
325338 if (NULL != __res ) {
326- return arg_copy (__res );
339+ res = arg_copy (__res );
340+ }
341+ if (NULL != obj_new ) {
342+ arg_deinit (obj_new );
327343 }
344+ if (NULL == res ) {
345+ return arg_newNull ();
346+ }
347+ return res ;
328348 }
329349 return arg_newNull ();
330350}
0 commit comments