Browse Source

feat: print value显示完整信息

SongZihuan 4 năm trước cách đây
mục cha
commit
4c95fcc639
6 tập tin đã thay đổi với 39 bổ sung17 xóa
  1. 1 1
      include/var.h
  2. 8 3
      src/inter.c
  3. 7 3
      src/runcall.c
  4. 5 1
      src/runfile.c
  5. 16 7
      src/value.c
  6. 2 2
      src/var.c

+ 1 - 1
include/var.h

@@ -60,7 +60,7 @@ VarList *copyVarList(VarList *base, bool n_new, Inter *inter);
 VarList *connectVarListBack(VarList *base, VarList *back);
 bool comparVarList(VarList *dest, VarList *src);
 VarList *connectSafeVarListBack(VarList *base, VarList *back);
-VarList *makeObjectVarList(FatherValue *value, Inter *inter);
+VarList *makeObjectVarList(FatherValue *value, Inter *inter, VarList *base);
 
 NUMBER_TYPE findDefault(DefaultVar *base, char *name);
 DefaultVar *connectDefaultVar(DefaultVar *base, char *name, NUMBER_TYPE times);

+ 8 - 3
src/inter.c

@@ -29,12 +29,17 @@ Inter *makeInter(char *debug, LinkValue *father) {
     }
 
     makeBaseObject(tmp);
+
     tmp->data.none = makeNoneValue(tmp);
     gc_addStatementLink(&tmp->data.none->gc_status);
 
-    base_father = makeLinkValue(makeObject(tmp, copyVarList(tmp->var_list, false, tmp), NULL, NULL), father, tmp);
-    gc_addStatementLink(&base_father->gc_status);
-    tmp->base_father = base_father;
+    {
+        VarList *out_var = copyVarList(tmp->var_list, false, tmp);
+        Value *base_father_value = makeObject(tmp, out_var, NULL, NULL);
+        base_father = makeLinkValue(base_father_value, father, tmp);
+        gc_addStatementLink(&base_father->gc_status);
+        tmp->base_father = base_father;
+    }
 
     registeredBaseFunction(base_father, tmp);
     return tmp;

+ 7 - 3
src/runcall.c

@@ -154,9 +154,13 @@ ResultType callClass(LinkValue *class_value, Parameter *parameter, long int line
     LinkValue *_init_ = NULL;
     setResultCore(result);
 
-    value = makeLinkValue(makeObject(inter, NULL,copyVarList(class_value->value->object.out_var, false, inter),
-                          setFatherCore(makeFatherValue(class_value))), father, inter);
-    setResultOperation(result, value);
+    {
+        FatherValue *father_value = setFatherCore(makeFatherValue(class_value));
+        VarList *new_var = copyVarList(class_value->value->object.out_var, false, inter);
+        Value *new_object = makeObject(inter, NULL, new_var, father_value);
+        value = makeLinkValue(new_object, father, inter);
+        setResultOperation(result, value);
+    }
 
     char *init_name = setStrVarName(inter->data.object_init, false, CALL_INTER_FUNCTIONSIG_CORE(var_list));
     _init_ = findFromVarList(init_name, 0, false, CALL_INTER_FUNCTIONSIG_CORE(value->value->object.var));

+ 5 - 1
src/runfile.c

@@ -100,7 +100,11 @@ ResultType importFile(INTER_FUNCTIONSIG) {
         goto return_;
 
     freeResult(result);
-    import_value = makeLinkValue(makeObject(inter, new_object, copyVarList(var_list, false, inter), NULL), father, inter);
+    {
+        VarList *import_var = copyVarList(var_list, false, inter);
+        Value *import_obj = makeObject(inter, new_object, import_var, NULL);
+        import_value = makeLinkValue(import_obj, father, inter);
+    }
     if (st->u.import_file.as != NULL)
         assCore(st->u.import_file.as, import_value, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, father));
     else {

+ 16 - 7
src/value.c

@@ -6,7 +6,10 @@ Value *makeObject(Inter *inter, VarList *object, VarList *out_var, FatherValue *
     setGC(&tmp->gc_status);
     tmp->type = object_;
     tmp->gc_next = NULL;
-    tmp->object.var = object == NULL ? makeObjectVarList(father, inter) : object;
+
+    if (inter->data.object != NULL && father == NULL)
+        father = makeFatherValue(makeLinkValue(inter->data.object, NULL, inter));
+    tmp->object.var = makeObjectVarList(father, inter, object);
     tmp->object.out_var = out_var;
     tmp->object.father = father;
 
@@ -291,10 +294,10 @@ void printValue(Value *value, FILE *debug){
             fprintf(debug, "'%s'", value->data.str.str);
             break;
         case function:
-            fprintf(debug, "function on <%p>", value);
+            fprintf(debug, "function");
             break;
         case list:
-            fprintf(debug, "list on <%p> size : %d  [ ", value, (int)value->data.list.size);
+            fprintf(debug, "list on size : %d  [ ", (int)value->data.list.size);
             for (int i=0;i < value->data.list.size;i++){
                 if (i > 0)
                     fprintf(debug, ", ", NULL);
@@ -306,7 +309,7 @@ void printValue(Value *value, FILE *debug){
         case dict: {
             Var *tmp = NULL;
             bool print_comma = false;
-            fprintf(debug, "dict on <%p> size : %d  { ", value, (int) value->data.dict.size);
+            fprintf(debug, "dict size : %d  { ", (int) value->data.dict.size);
             for (int i = 0; i < MAX_SIZE; i++) {
                 for (tmp = value->data.dict.dict->hashtable[i]; tmp != NULL; tmp = tmp->next) {
                     if (print_comma)
@@ -325,10 +328,10 @@ void printValue(Value *value, FILE *debug){
             fprintf(debug, "<None>", NULL);
             break;
         case class:
-            fprintf(debug, "class on <%p>", value);
+            fprintf(debug, "class");
             break;
         case object_:
-            fprintf(debug, "object on <%p>", value);
+            fprintf(debug, "object");
             break;
         case bool_:
             if (value->data.bool_.bool_)
@@ -340,9 +343,15 @@ void printValue(Value *value, FILE *debug){
             fprintf(debug, "...");
             break;
         default:
-            fprintf(debug, "default on <%p>", value);
+            fprintf(debug, "unknow");
             break;
     }
+    fprintf(debug, "(");
+    printf("<%p>", value);
+    for (FatherValue *fv = value->object.father; fv != NULL; fv = fv->next)
+        printLinkValue(fv->value, " -> ", "", debug);
+    fprintf(debug, ")");
+
 }
 
 void printLinkValue(LinkValue *value, char *first, char *last, FILE *debug){

+ 2 - 2
src/var.c

@@ -265,8 +265,8 @@ VarList *connectSafeVarListBack(VarList *base, VarList *back){
     return base;
 }
 
-VarList *makeObjectVarList(FatherValue *value, Inter *inter){
-    VarList *tmp = makeVarList(inter, true);
+VarList *makeObjectVarList(FatherValue *value, Inter *inter, VarList *base) {
+    VarList *tmp = base == NULL ? makeVarList(inter, true) : base;
     for (PASS; value != NULL; value = value->next) {
         VarList *new = copyVarList(value->value->value->object.var, false, inter);
         tmp = connectVarListBack(tmp, new);