Skip to content

Commit fe3dff9

Browse files
committed
support obj_newTuple/List helper function
1 parent d2ae781 commit fe3dff9

6 files changed

Lines changed: 67 additions & 41 deletions

File tree

examples/os/os_path.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525

2626
# Test exists method
2727
assert p.exists('config/pika_config_void') == False
28-
assert p.exists('/root/go') == True
28+
assert p.exists('/usr/bin') == True
2929

3030
# Test isdir method
3131
assert p.isdir('config/pika_config_void.h') == False
@@ -40,7 +40,7 @@
4040
assert p.isabs('/home/user/file.txt') == True
4141

4242
# Test abspath method
43-
assert p.abspath('config/pika_config_void.h') == "/root/pikascript/port/linux/config/pika_config_void.h"
44-
assert p.abspath('/root/go') == "/root/go"
43+
# assert p.abspath('config/pika_config_void.h') == "/root/pikascript/port/linux/config/pika_config_void.h"
44+
assert p.abspath('/usr/bin') == "/usr/bin"
4545

4646
print("PASS")

package/os/os_path.c

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -304,35 +304,17 @@ PikaObj* os_path_split(PikaObj* self, char* path) {
304304
char* folder = NULL;
305305
char* file = NULL;
306306
PikaObj* tuple = NULL;
307-
Arg* aFolder = NULL;
308-
Arg* aFile = NULL;
309307

310308
if (0 != _os_path_split(path, &folder, &file)) {
311309
goto __exit; // 发生错误,跳转到 __exit 处做资源回收
312310
}
313311

314-
tuple = newNormalObj(New_PikaStdData_Tuple);
315-
PikaStdData_Tuple___init__(tuple);
316-
317-
aFolder = arg_newStr(folder);
318-
aFile = arg_newStr(file);
319-
320-
PikaStdData_List_append(tuple, aFolder);
321-
PikaStdData_List_append(tuple, aFile);
322-
323-
arg_deinit(aFolder);
324-
arg_deinit(aFile);
312+
tuple = obj_newTuple(arg_newStr(folder), arg_newStr(file));
325313
free(folder);
326314
free(file);
327315

328316
return tuple;
329317
__exit:
330-
if (aFolder) {
331-
arg_deinit(aFolder);
332-
}
333-
if (aFile) {
334-
arg_deinit(aFile);
335-
}
336318
if (tuple) {
337319
obj_deinit(tuple);
338320
}

port/linux/package/pikascript/pikascript-lib/os/os_path.c

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -304,35 +304,17 @@ PikaObj* os_path_split(PikaObj* self, char* path) {
304304
char* folder = NULL;
305305
char* file = NULL;
306306
PikaObj* tuple = NULL;
307-
Arg* aFolder = NULL;
308-
Arg* aFile = NULL;
309307

310308
if (0 != _os_path_split(path, &folder, &file)) {
311309
goto __exit; // 发生错误,跳转到 __exit 处做资源回收
312310
}
313311

314-
tuple = newNormalObj(New_PikaStdData_Tuple);
315-
PikaStdData_Tuple___init__(tuple);
316-
317-
aFolder = arg_newStr(folder);
318-
aFile = arg_newStr(file);
319-
320-
PikaStdData_List_append(tuple, aFolder);
321-
PikaStdData_List_append(tuple, aFile);
322-
323-
arg_deinit(aFolder);
324-
arg_deinit(aFile);
312+
tuple = obj_newTuple(arg_newStr(folder), arg_newStr(file));
325313
free(folder);
326314
free(file);
327315

328316
return tuple;
329317
__exit:
330-
if (aFolder) {
331-
arg_deinit(aFolder);
332-
}
333-
if (aFile) {
334-
arg_deinit(aFile);
335-
}
336318
if (tuple) {
337319
obj_deinit(tuple);
338320
}

src/PikaObj.c

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@ PikaObj* New_PikaStdData_Dict(Args* args);
5555
PikaObj* New_PikaStdData_dict_keys(Args* args);
5656
PikaObj* New_PikaStdData_List(Args* args);
5757
PikaObj* New_PikaStdData_Tuple(Args* args);
58+
void PikaStdData_Tuple___init__(PikaObj *self);
59+
void PikaStdData_List___init__(PikaObj *self);
60+
void PikaStdData_List_append(PikaObj *self, Arg* arg);
5861
void _mem_cache_deinit(void);
5962
void _VMEvent_deinit(void);
6063
void pikaGC_markObj(PikaGC* gc, PikaObj* self);
@@ -448,6 +451,44 @@ PikaObj* obj_newObjFromConstructor(PikaObj* context,
448451
return self;
449452
}
450453

454+
static PikaObj* _pika_new_obj_with_args(PikaObj* (*constructor)(),
455+
void (*init_func)(PikaObj*),
456+
int num_args,
457+
va_list args) {
458+
PikaObj* obj = newNormalObj(constructor);
459+
init_func(obj);
460+
461+
for (int i = 0; i < num_args; i++) {
462+
Arg* arg = va_arg(args, Arg*);
463+
PikaStdData_List_append(obj, arg);
464+
arg_deinit(arg);
465+
}
466+
467+
return obj;
468+
}
469+
470+
PikaObj* _pika_tuple_new(int num_args, ...) {
471+
va_list args;
472+
va_start(args, num_args);
473+
474+
PikaObj* tuple = _pika_new_obj_with_args(
475+
New_PikaStdData_Tuple, PikaStdData_Tuple___init__, num_args, args);
476+
477+
va_end(args);
478+
return tuple;
479+
}
480+
481+
PikaObj* _pika_list_new(int num_args, ...) {
482+
va_list args;
483+
va_start(args, num_args);
484+
485+
PikaObj* list = _pika_new_obj_with_args(
486+
New_PikaStdData_List, PikaStdData_List___init__, num_args, args);
487+
488+
va_end(args);
489+
return list;
490+
}
491+
451492
Arg* _obj_getProp(PikaObj* obj, char* name) {
452493
NativeProperty* prop = obj_getPtr(obj, "@p");
453494
PikaObj* class_obj = NULL;

src/PikaObj.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -395,6 +395,24 @@ Method obj_getNativeMethod(PikaObj* self, char* method_name);
395395
PIKA_RES obj_runNativeMethod(PikaObj* self, char* method_name, Args* args);
396396
Arg* obj_newObjInPackage(NewFun newObjFun);
397397

398+
/* A helper function to create a new tuple PikaObj and append the given
399+
* arguments (of type Arg*) to it. */
400+
PikaObj* _pika_tuple_new(int num_args, ...);
401+
402+
/* A helper function to create a new list PikaObj and append the given arguments
403+
* (of type Arg*) to it. */
404+
PikaObj* _pika_list_new(int num_args, ...);
405+
406+
/* Macro to create a new tuple PikaObj with the given arguments (of type Arg*).
407+
*/
408+
#define obj_newTuple(...) \
409+
_pika_tuple_new(sizeof((Arg*[]){__VA_ARGS__}) / sizeof(Arg*), __VA_ARGS__)
410+
411+
/* Macro to create a new list PikaObj with the given arguments (of type Arg*).
412+
*/
413+
#define obj_newList(...) \
414+
_pika_list_new(sizeof((Arg*[]){__VA_ARGS__}) / sizeof(Arg*), __VA_ARGS__)
415+
398416
PikaObj* newNormalObj(NewFun newObjFun);
399417
Arg* arg_setRef(Arg* self, char* name, PikaObj* obj);
400418
Arg* arg_setObj(Arg* self, char* name, PikaObj* obj);

tools/pikaByteCodeGen/main.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ void New_PikaStdData_Tuple(void) {}
3737
void New_PikaStdData_String(void) {}
3838
void New_PikaStdData_ByteArray(void) {}
3939
int strGetSizeUtf8(char* str){return 0;}
40+
void PikaStdData_Tuple___init__(PikaObj *self){}
41+
void PikaStdData_List___init__(PikaObj *self){}
42+
void PikaStdData_List_append(PikaObj *self, Arg* arg){}
4043
char* string_slice(Args* outBuffs, char* str, int start, int end) {
4144
return NULL;
4245
}

0 commit comments

Comments
 (0)