object.c 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #include "__ofunc.h"
  2. ResultType object_new_(OfficialFunctionSig){
  3. LinkValue *value = NULL;
  4. LinkValue *_init_ = NULL;
  5. setResultCore(result);
  6. ArgumentParser ap[] = {{.type=only_value, .must=1, .long_arg=false},
  7. {.type=only_value, .must=1, .long_arg=false},
  8. {.must=-1}};
  9. int status = 1;
  10. arg = parserValueArgument(ap, arg, &status, NULL);
  11. if (status != 1){
  12. setResultError(result, inter, "ArgumentException", "Too less Argument", 0, "sys", father, true);
  13. return error_return;
  14. }
  15. {
  16. VarList *new_var = NULL;
  17. Value *new_object = NULL;
  18. Argument *father_arg = makeValueArgument(ap[1].value);
  19. FatherValue *object_father = setFather(father_arg);
  20. freeArgument(father_arg, true);
  21. new_var = copyVarList(ap[1].value->value->object.out_var, false, inter);
  22. new_object = makeObject(inter, NULL, new_var, object_father);
  23. value = makeLinkValue(new_object, father, inter);
  24. setResultOperation(result, value);
  25. }
  26. _init_ = findAttributes(inter->data.object_init, false, value, inter);
  27. if (_init_ != NULL){
  28. Result _init_result;
  29. setResultCore(&_init_result);
  30. _init_->father = value;
  31. gc_addTmpLink(&_init_->gc_status);
  32. callBackCore(_init_, arg, 0, "sys", CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, &_init_result, value));
  33. gc_freeTmpLink(&_init_->gc_status);
  34. if (!run_continue_type(_init_result.type)){
  35. freeResult(result);
  36. *result = _init_result;
  37. goto return_;
  38. }
  39. freeResult(&_init_result);
  40. }
  41. return_:
  42. return result->type;
  43. }
  44. void registeredObject(RegisteredFunctionSig){
  45. LinkValue *object = makeLinkValue(inter->data.object, inter->base_father, inter);
  46. VarList *object_var = object->value->object.var;
  47. VarList *object_backup = NULL;
  48. NameFunc tmp[] = {{"__new__", object_new_, class_static_}, {NULL, NULL}};
  49. gc_addTmpLink(&object->gc_status);
  50. addStrVar("object", false, object, father, CALL_INTER_FUNCTIONSIG_CORE(inter->var_list));
  51. object_backup = object_var->next;
  52. object_var->next = inter->var_list;
  53. iterNameFunc(tmp, object, CALL_INTER_FUNCTIONSIG_CORE(object_var));
  54. object_var->next = object_backup;
  55. gc_freeTmpLink(&object->gc_status);
  56. }
  57. void makeBaseObject(Inter *inter){
  58. Value *object = makeClassValue(copyVarList(inter->var_list, false, inter), inter, NULL);
  59. gc_addStatementLink(&object->gc_status);
  60. inter->data.object = object;
  61. }