@@ -97,7 +97,7 @@ char* fast_itoa(char* buf, uint32_t val) {
97
97
return & p [val < 10 ];
98
98
}
99
99
100
- int32_t obj_deinit (PikaObj * self ) {
100
+ static int32_t obj_deinit_no_del (PikaObj * self ) {
101
101
/* free the list */
102
102
args_deinit (self -> list );
103
103
/* free the pointer */
@@ -106,6 +106,22 @@ int32_t obj_deinit(PikaObj* self) {
106
106
return 0 ;
107
107
}
108
108
109
+ int32_t obj_deinit (PikaObj * self ) {
110
+ Arg * del = obj_getMethodArg (self , "__del__" );
111
+ if (NULL != del ) {
112
+ const uint8_t bytes [] = {
113
+ 0x04 , 0x00 , /* instruct array size */
114
+ 0x00 , 0x82 , 0x01 , 0x00 , /* instruct array */
115
+ 0x09 , 0x00 , /* const pool size */
116
+ 0x00 , 0x5f , 0x5f , 0x64 , 0x65 ,
117
+ 0x6c , 0x5f , 0x5f , 0x00 , /* const pool */
118
+ };
119
+ pikaVM_runByteCode (self , (uint8_t * )bytes );
120
+ arg_deinit (del );
121
+ }
122
+ return obj_deinit_no_del (self );
123
+ }
124
+
109
125
int32_t obj_enable (PikaObj * self ) {
110
126
obj_setInt (self , "isEnable" , 1 );
111
127
return 0 ;
@@ -327,14 +343,21 @@ Arg* obj_getMethodArg(PikaObj* obj, char* methodPath) {
327
343
goto exit ;
328
344
}
329
345
methodHostClass = obj_getClassObj (obj );
346
+ if (NULL == methodHostClass ) {
347
+ method = NULL ;
348
+ goto exit ;
349
+ }
330
350
method = arg_copy (obj_getArg (methodHostClass , methodName ));
331
- obj_deinit (methodHostClass );
351
+ obj_deinit_no_del (methodHostClass );
332
352
exit :
333
353
return method ;
334
354
}
335
355
336
356
PikaObj * obj_getClassObj (PikaObj * obj ) {
337
357
NewFun classPtr = (NewFun )obj_getPtr (obj , "_clsptr" );
358
+ if (NULL == classPtr ) {
359
+ return NULL ;
360
+ }
338
361
PikaObj * classObj = obj_getClassObjByNewFun (obj , "" , classPtr );
339
362
return classObj ;
340
363
}
0 commit comments