123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173 |
- #include "__virtualmath.h"
- Inter *runBaseInter(char *code_file, char *debug_dir, int *status) {
- Result global_result;
- setResultCore(&global_result);
- return newInter(code_file, debug_dir, &global_result, status);
- }
- Inter *newInter(char *code_file, char *debug_dir, Result *global_result, int *status) {
- Inter *global_inter = NULL;
- ParserMessage *pm = NULL;
- ResultType type;
- *status = 0;
- if (checkFile(code_file) != 1){
- *status = 1;
- return NULL;
- }
- if (checkFile(debug_dir) != 2)
- debug_dir = NULL;
- global_inter = makeInter(code_file, debug_dir);
- pm = makeParserMessage(code_file, debug_dir);
- parserCommandList(pm, global_inter, true, global_inter->statement);
- if (pm->status != success){
- writeLog(stderr, ERROR, "Syntax Error: %s\n", pm->status_message);
- goto return_;
- }
- type = globalIterStatement(global_inter, global_result);
- if (type == error_return)
- printError(global_result, global_inter, true);
- return_:
- freeParserMessage(pm, true);
- return global_inter;
- }
- Inter *makeInter(char *code_file, char *debug) {
- Inter *tmp = memCalloc(1, sizeof(Inter));
- setBaseInterData(tmp);
- tmp->base = NULL;
- tmp->link_base = NULL;
- tmp->statement = makeStatement(0, code_file);
- tmp->var_list = makeVarList(tmp);
- tmp->data.log_dir = memStrcpy(debug);
- if (debug != NULL && !args.stdout_inter){
- char *debug_dir = memStrcat(debug, INTER_LOG, false), *error_dir = memStrcat(debug, INTER_ERROR, false);
- tmp->data.debug = fopen(debug_dir, "w");
- tmp->data.error = fopen(error_dir, "w");
- memFree(debug_dir);
- memFree(error_dir);
- }
- else {
- tmp->data.debug = stdout;
- tmp->data.error = stderr;
- }
- Value *none_value = makeNoneValue(tmp); // 注册None值
- gc_addStatementLink(&none_value->gc_status);
- return tmp;
- }
- void setBaseInterData(struct Inter *inter){
- inter->data.var_str_prefix = memStrcpy("str_");
- inter->data.var_num_prefix = memStrcpy("num_");
- inter->data.var_defualt = memStrcpy("default_var");
- inter->data.object_init = memStrcpy("__init__");
- inter->data.debug = NULL;
- inter->data.log_dir = NULL;
- }
- void freeBaseInterData(struct Inter *inter){
- memFree(inter->data.var_defualt);
- memFree(inter->data.var_num_prefix);
- memFree(inter->data.var_str_prefix);
- memFree(inter->data.object_init);
- memFree(inter->data.log_dir);
- if (inter->data.log_dir != NULL) {
- fclose(inter->data.debug);
- fclose(inter->data.error);
- }
- }
- void freeInter(Inter *inter, bool self){
- freeBase(inter, return_);
- printLinkValueGC("\n\nprintLinkValueGC TAG : freeInter", inter);
- printValueGC("\nprintValueGC TAG : freeInter", inter);
- printVarGC("\nprintVarGC TAG : freeInter", inter);
- freeStatement(inter->statement); // Statement放在Value前面释放, 因为base_value的释放需要处理gc_status
- freeVarList(inter->var_list, true);
- while (inter->base != NULL)
- freeValue(inter->base, inter);
- while (inter->base_var != NULL)
- freeVar(inter->base_var, inter);
- while (inter->link_base != NULL)
- freeLinkValue(inter->link_base, inter);
- while (inter->hash_base != NULL)
- freeHashTable(inter->hash_base, inter);
- freeBaseInterData(inter);
- if (self)
- memFree(inter);
- return_:
- return;
- }
- /* ***********************DEBUG 专用函数*********************************** */
- void printLinkValueGC(char *tag, Inter *inter){
- LinkValue *base = inter->link_base;
- printf("%s\n", tag);
- while (base != NULL) {
- printf("inter->link_base.tmp_link = %ld :: %p\n", base->gc_status.tmp_link, base);
- printf("inter->link_base.statement_link = %ld :: %p\n", base->gc_status.statement_link, base);
- printf("inter->link_base.link = %ld :: %p\n", base->gc_status.link, base);
- printLinkValue(base, "value = ", "\n", stdout);
- printf("-------------------------------------------\n");
- base = base->gc_next;
- }
- printf("printLinkValueGC TAG : END\n");
- }
- void printValueGC(char *tag, Inter *inter){
- Value *base = inter->base;
- printf("%s\n", tag);
- while (base != NULL) {
- printf("inter->link_base.tmp_link = %ld :: %p\n", base->gc_status.tmp_link, base);
- printf("inter->link_base.statement_link = %ld :: %p\n", base->gc_status.statement_link, base);
- printf("inter->link_base.link = %ld :: %p\n", base->gc_status.link, base);
- printf("value = ");
- printValue(base, stdout);
- printf("\n-------------------------------------------\n");
- base = base->gc_next;
- }
- printf("printValueGC TAG : END\n");
- }
- void printVarGC(char *tag, Inter *inter){
- Var *base = inter->base_var;
- printf("%s\n", tag);
- while (base != NULL) {
- printf("inter->link_base.tmp_link = %ld :: %p\n", base->gc_status.tmp_link, base);
- printf("inter->link_base.statement_link = %ld :: %p\n", base->gc_status.statement_link, base);
- printf("inter->link_base.link = %ld :: %p\n", base->gc_status.link, base);
- printf("value :\n");
- printLinkValue(base->name_, "name_: ", "\n", stdout);
- printLinkValue(base->value, "value_: ", "\n", stdout);
- printf("str_name = %s\n", base->name);
- printf("-------------------------------------------\n");
- base = base->gc_next;
- }
- printf("printVarGC TAG : END\n");
- }
- void showLinkValue(struct LinkValue *base){
- printf("tmp_link = %ld :: %p\n", base->gc_status.tmp_link, base);
- printf("statement_link = %ld :: %p\n", base->gc_status.statement_link, base);
- printf("link = %ld :: %p\n", base->gc_status.link, base);
- printLinkValue(base, "value = ", "\n", stdout);
- printf("--------------------------\n");
- }
|