object.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. #include "__ofunc.h"
  2. ResultType object_new(OFFICAL_FUNCTIONSIG){
  3. LinkValue *value = NULL;
  4. LinkValue *_init_ = NULL;
  5. setResultCore(result);
  6. ArgumentParser ap[] = {{.type=only_value, .must=1, .long_arg=false},
  7. {.must=-1}};
  8. int status = 1;
  9. arg = parserValueArgument(ap, arg, &status, NULL);
  10. if (status != 1){
  11. setResultError(E_ArgumentException, FEW_ARG, 0, "object", true, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  12. return error_return;
  13. }
  14. {
  15. Inherit *object_father = getInheritFromValueCore(ap[0].value);
  16. VarList *new_var = copyVarList(ap[0].value->value->object.out_var, false, inter);
  17. Value *new_object = makeObject(inter, NULL, new_var, object_father);
  18. value = makeLinkValue(new_object, belong, inter);
  19. setResultOperation(result, value);
  20. }
  21. _init_ = findAttributes(inter->data.object_init, false, value, inter);
  22. if (_init_ != NULL){
  23. Result _init_result;
  24. setResultCore(&_init_result);
  25. _init_->belong = value;
  26. gc_addTmpLink(&_init_->gc_status);
  27. callBackCore(_init_, arg, 0, "sys", CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, &_init_result, value));
  28. gc_freeTmpLink(&_init_->gc_status);
  29. if (!RUN_TYPE(_init_result.type)){
  30. freeResult(result);
  31. *result = _init_result;
  32. goto return_;
  33. }
  34. freeResult(&_init_result);
  35. } else if (arg != NULL)
  36. setResultError(E_ArgumentException, MANY_ARG, 0, "object", true, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  37. return_:
  38. return result->type;
  39. }
  40. ResultType objectRepoStrCore(OFFICAL_FUNCTIONSIG, bool is_repo){
  41. ArgumentParser ap[] = {{.type=only_value, .must=1, .long_arg=false},
  42. {.must=-1}};
  43. char *repo;
  44. char *name;
  45. char *type;
  46. size_t len;
  47. LinkValue *name_value;
  48. setResultCore(result);
  49. parserArgumentUnion(ap, arg, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  50. if (!CHECK_RESULT(result))
  51. return result->type;
  52. freeResult(result);
  53. name_value = findAttributes(inter->data.object_name, false, ap[0].value, inter);
  54. if (name_value != NULL){
  55. gc_addTmpLink(&name_value->gc_status);
  56. name = getRepoStr(name_value, is_repo, 0, "sys", CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  57. gc_freeTmpLink(&name_value->gc_status);
  58. if (!CHECK_RESULT(result))
  59. return result->type;
  60. freeResult(result);
  61. } else
  62. name = "unknown";
  63. if (ap[0].value->value->type == class)
  64. type = "class";
  65. else
  66. type = "object";
  67. len = memStrlen(name) + 26;
  68. repo = memCalloc(len, sizeof(char ));
  69. snprintf(repo, len, "(%s: %s on %p)", type, name, ap[0].value->value);
  70. setResultOperationBase(result, makeLinkValue(makeStringValue(repo, inter), belong, inter));
  71. memFree(repo);
  72. return result->type;
  73. }
  74. ResultType object_repo(OFFICAL_FUNCTIONSIG){
  75. return objectRepoStrCore(CALL_OFFICAL_FUNCTION(arg, var_list, result, belong), true);
  76. }
  77. ResultType object_str(OFFICAL_FUNCTIONSIG){
  78. return objectRepoStrCore(CALL_OFFICAL_FUNCTION(arg, var_list, result, belong), false);
  79. }
  80. void registeredObject(REGISTERED_FUNCTIONSIG){
  81. LinkValue *object = makeLinkValue(inter->data.object, inter->base_father, inter);
  82. NameFunc tmp[] = {{inter->data.object_new, object_new, class_free_},
  83. {inter->data.object_repo, object_repo, all_free_},
  84. {inter->data.object_str, object_str, all_free_},
  85. {NULL, NULL}};
  86. gc_addTmpLink(&object->gc_status);
  87. addStrVar("object", false, true, object, belong, CALL_INTER_FUNCTIONSIG_CORE(inter->var_list));
  88. iterClassFunc(tmp, object, CALL_INTER_FUNCTIONSIG_CORE(inter->var_list));
  89. gc_freeTmpLink(&object->gc_status);
  90. }
  91. void makeBaseObject(Inter *inter){
  92. Value *object = makeClassValue(copyVarList(inter->var_list, false, inter), inter, NULL);
  93. gc_addStatementLink(&object->gc_status);
  94. inter->data.object = object;
  95. }