Forráskód Böngészése

use queue_popArg_notDeinitArg to add speed

lyon1998 4 éve
szülő
commit
49cb98da8a
5 módosított fájl, 33 hozzáadás és 9 törlés
  1. 7 7
      src/PikaVM.c
  2. 9 0
      src/dataArgs.c
  3. 1 0
      src/dataArgs.h
  4. 15 2
      src/dataQueue.c
  5. 1 0
      src/dataQueue.h

+ 7 - 7
src/PikaVM.c

@@ -203,7 +203,7 @@ static Arg* VM_instruction_handler_RUN(PikaObj* self, VMState* vs, char* data) {
     ByteCodeFrame* method_bytecodeFrame;
     /* return arg directly */
     if (strEqu(data, "")) {
-        return_arg = arg_copy(queue_popArg(vs->qSuper));
+        return_arg = queue_popArg_notDeinitArg(vs->qSuper);
         goto RUN_exit;
     }
 
@@ -255,7 +255,7 @@ static Arg* VM_instruction_handler_RUN(PikaObj* self, VMState* vs, char* data) {
         if ((method_type == ARG_TYPE_OBJECT_METHOD) && (call_arg_index == 0)) {
             call_arg = arg_setPtr(NULL, "", ARG_TYPE_POINTER, method_host_obj);
         } else {
-            call_arg = arg_copy(queue_popArg(vs->qSuper));
+            call_arg = queue_popArg_notDeinitArg(vs->qSuper);
         }
         /* exit when there is no arg in queue */
         if (NULL == call_arg) {
@@ -322,7 +322,7 @@ static Arg* __VM_OUT(PikaObj* self,
                      VMState* vs,
                      char* data,
                      is_init_obj_t is_init_obj) {
-    Arg* outArg = arg_copy(queue_popArg(vs->qThis));
+    Arg* outArg = queue_popArg_notDeinitArg(vs->qThis);
     ArgType outArg_type = arg_getType(outArg);
     PikaObj* hostObj = vs->locals;
     /* match global_list */
@@ -420,7 +420,7 @@ static Arg* VM_instruction_handler_JMP(PikaObj* self, VMState* vs, char* data) {
 static Arg* VM_instruction_handler_JEZ(PikaObj* self, VMState* vs, char* data) {
     int thisBlockDeepth;
     thisBlockDeepth = VMState_getBlockDeepthNow(vs);
-    Arg* assertArg = arg_copy(queue_popArg(vs->qThis));
+    Arg* assertArg = queue_popArg_notDeinitArg(vs->qThis);
     int assert = arg_getInt(assertArg);
     arg_deinit(assertArg);
     char __else[] = "__else0";
@@ -435,8 +435,8 @@ static Arg* VM_instruction_handler_JEZ(PikaObj* self, VMState* vs, char* data) {
 
 static Arg* VM_instruction_handler_OPT(PikaObj* self, VMState* vs, char* data) {
     Arg* outArg = NULL;
-    Arg* arg1 = arg_copy(queue_popArg(vs->qSuper));
-    Arg* arg2 = arg_copy(queue_popArg(vs->qSuper));
+    Arg* arg1 = queue_popArg_notDeinitArg(vs->qSuper);
+    Arg* arg2 = queue_popArg_notDeinitArg(vs->qSuper);
     ArgType type_arg1 = arg_getType(arg1);
     ArgType type_arg2 = arg_getType(arg2);
     int num1_i = 0;
@@ -644,7 +644,7 @@ static Arg* VM_instruction_handler_DEF(PikaObj* self, VMState* vs, char* data) {
 static Arg* VM_instruction_handler_RET(PikaObj* self, VMState* vs, char* data) {
     /* exit jmp signal */
     vs->jmp = -999;
-    Arg* returnArg = arg_copy(queue_popArg(vs->qThis));
+    Arg* returnArg = queue_popArg_notDeinitArg(vs->qThis);
     method_returnArg(vs->locals->list, returnArg);
     return NULL;
 }

+ 9 - 0
src/dataArgs.c

@@ -450,6 +450,15 @@ int32_t args_removeArg(Args* self, Arg* argNow) {
     return 0;
 }
 
+int32_t args_removeArg_notDeinitArg(Args* self, Arg* argNow) {
+    if (NULL == argNow) {
+        /* can not found arg */
+        return 1;
+    }
+    link_removeNode_notDeinitNode(self, argNow);
+    return 0;
+}
+
 int args_moveArg(Args* self, Args* dict, Arg* argNow) {
     if (NULL == argNow) {
         /* can not found arg */

+ 1 - 0
src/dataArgs.h

@@ -114,6 +114,7 @@ uint8_t args_setLiteral(Args* self, char* targetArgName, char* literal);
 int args_pushArg(Args* self, Arg* arg);
 Arg* args_getArg_index(Args* self, int index);
 void* args_getHeapStruct(Args* self, char* name);
+int32_t args_removeArg_notDeinitArg(Args* self, Arg* argNow);
 
 Args* New_args(Args* args);
 #endif

+ 15 - 2
src/dataQueue.c

@@ -36,7 +36,7 @@ void queue_init(Queue* queue) {
 
 Queue* New_queue(void) {
     Args* args = New_args(NULL);
-    queue_init(args) ;
+    queue_init(args);
     return (Queue*)args;
 }
 
@@ -56,7 +56,7 @@ int32_t queue_pushArg(Queue* queue, Arg* arg) {
     return args_setArg(args, arg);
 }
 
-Arg* queue_popArg(Queue* queue) {
+Arg* __queue_popArg(Queue* queue, uint8_t is_deinit_arg) {
     Args* args = queue;
     uint64_t top = args_getInt(args, "__t");
     uint64_t bottom = args_getInt(args, "__b");
@@ -67,9 +67,22 @@ Arg* queue_popArg(Queue* queue) {
     args_setInt(args, "__b", bottom + 1);
     char buff[11];
     Arg* res = args_getArg(args, fast_itoa(buff, bottom));
+    if (is_deinit_arg) {
+        args_removeArg(args, res);
+    } else {
+        args_removeArg_notDeinitArg(args, res);
+    }
     return res;
 }
 
+Arg* queue_popArg(Queue* queue) {
+    return __queue_popArg(queue, 1);
+}
+
+Arg* queue_popArg_notDeinitArg(Queue* queue) {
+    return __queue_popArg(queue, 0);
+}
+
 int32_t queue_pushInt(Queue* queue, int val) {
     return queue_pushArg(queue, arg_setInt(NULL, "", val));
 }

+ 1 - 0
src/dataQueue.h

@@ -43,6 +43,7 @@ int64_t queue_popInt(Queue* queue);
 float queue_popFloat(Queue* queue);
 char* queue_popStr(Queue* queue);
 Arg* queue_popArg(Queue* queue);
+Arg* queue_popArg_notDeinitArg(Queue* queue);
 int32_t queue_deinit_stack(Queue* queue);
 void queue_init(Queue* queue);
 #endif