From 6cab491a9cd7bde00b359774360bb22ac8992de7 Mon Sep 17 00:00:00 2001 From: "yu.dongliang" <18588496441@163.com> Date: Wed, 13 Aug 2025 13:15:46 +0800 Subject: [PATCH] js: simple Object Model ok --- examples/js.html | 12 +- html/Makefile | 1 + js/abc_libjs.so | Bin 54336 -> 14440 bytes js/core/scf_ast.c | 72 +++++++ js/core/scf_ast.h | 4 +- js/core/scf_dag.c | 11 +- js/core/scf_lex_word.h | 1 + js/core/scf_optimizer_auto_gc.c | 46 ++++- js/core/scf_pointer_alias.c | 2 +- js/core/scf_scope.c | 3 + js/core/scf_type.h | 1 + js/core/scf_variable.c | 3 + js/core/scf_variable.h | 3 + js/doc.c | 108 +++++++++- js/elf/scf_elf_x64_so.c | 12 +- js/lex/scf_lex.c | 1 + js/lib/scf_capi.c | 1 + js/lib/x64/scf_object.o | Bin 7025 -> 7122 bytes js/native/x64/scf_x64_bb_color.c | 15 +- js/native/x64/scf_x64_inst.c | 2 +- js/native/x64/scf_x64_reg.c | 123 ++++++------ js/native/x64/scf_x64_reg.h | 43 ++-- js/parse/main.c | 14 +- js/parse/scf_dfa_expr.c | 124 ++++++++++-- js/parse/scf_dfa_function_js.c | 331 +++++++++++++++++++++++++++++++ js/parse/scf_dfa_init_data.c | 98 ++++----- js/parse/scf_dfa_parse.c | 2 + js/parse/scf_dfa_util.h | 7 + js/parse/scf_dfa_var.c | 23 +-- js/parse/scf_parse.c | 2 +- js/parse/scf_parse.h | 11 + js/parse/scf_struct_array.c | 327 ++++++++++++++++++++++++++++++ ui/Makefile | 1 + 33 files changed, 1189 insertions(+), 215 deletions(-) create mode 100644 js/parse/scf_dfa_function_js.c diff --git a/examples/js.html b/examples/js.html index a37709d..1c701f0 100644 --- a/examples/js.html +++ b/examples/js.html @@ -7,10 +7,16 @@

含有js的页面

diff --git a/html/Makefile b/html/Makefile index 59b84ac..1d21c36 100644 --- a/html/Makefile +++ b/html/Makefile @@ -147,6 +147,7 @@ CFILES += ../js/parse/scf_dfa_type.c CFILES += ../js/parse/scf_dfa_identity.c CFILES += ../js/parse/scf_dfa_function.c +CFILES += ../js/parse/scf_dfa_function_js.c CFILES += ../js/parse/scf_dfa_operator.c CFILES += ../js/parse/scf_dfa_var.c diff --git a/js/abc_libjs.so b/js/abc_libjs.so index 11e076095d1acac48e38c7f89f57f70c6d26cfdc..cb2894b91f8825c8ff490375a86190317ca0631c 100755 GIT binary patch delta 221 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 diff --git a/js/core/scf_ast.c b/js/core/scf_ast.c index a85bc7f..2e815bb 100644 --- a/js/core/scf_ast.c +++ b/js/core/scf_ast.c @@ -410,3 +410,75 @@ int scf_ast_find_type_type(scf_type_t** pt, scf_ast_t* ast, int type) return scf_ast_find_global_type_type(pt, ast, type); } +int scf_ast_add_const_str(scf_ast_t* ast, scf_node_t* parent, scf_lex_word_t* w) +{ + scf_variable_t* v; + scf_lex_word_t* w2; + scf_type_t* t = scf_block_find_type_type(ast->current_block, SCF_VAR_CHAR); + scf_node_t* node; + + w2 = scf_lex_word_clone(w); + if (!w2) + return -ENOMEM; + + int ret = scf_string_cat_cstr(w2->text, "__cstr"); + if (ret < 0) { + scf_lex_word_free(w2); + return ret; + } + + v = SCF_VAR_ALLOC_BY_TYPE(w2, t, 1, 1, NULL); + scf_lex_word_free(w2); + w2 = NULL; + if (!v) + return -ENOMEM; + v->const_literal_flag = 1; + + scf_logi("w->text: %s\n", w->text->data); + v->data.s = scf_string_clone(w->text); + if (!v->data.s) { + scf_variable_free(v); + return -ENOMEM; + } + + node = scf_node_alloc(NULL, v->type, v); + scf_variable_free(v); + v = NULL; + if (!node) + return -ENOMEM; + + ret = scf_node_add_child(parent, node); + if (ret < 0) { + scf_node_free(node); + return ret; + } + + return 0; +} + +int scf_ast_add_const_var(scf_ast_t* ast, scf_node_t* parent, int type, const uint64_t u64) +{ + scf_variable_t* v; + scf_type_t* t = scf_block_find_type_type(ast->current_block, type); + scf_node_t* node; + + v = SCF_VAR_ALLOC_BY_TYPE(NULL, t, 1, 0, NULL); + if (!v) + return -ENOMEM; + v->data.u64 = u64; + v->const_literal_flag = 1; + + node = scf_node_alloc(NULL, v->type, v); + scf_variable_free(v); + v = NULL; + if (!node) + return -ENOMEM; + + int ret = scf_node_add_child(parent, node); + if (ret < 0) { + scf_node_free(node); + return ret; + } + + return 0; +} diff --git a/js/core/scf_ast.h b/js/core/scf_ast.h index 404c778..f05e72e 100644 --- a/js/core/scf_ast.h +++ b/js/core/scf_ast.h @@ -101,5 +101,7 @@ int scf_ast_add_base_type(scf_ast_t* ast, scf_base_type_t* base_type); int scf_ast_add_file_block(scf_ast_t* ast, const char* path); -#endif +int scf_ast_add_const_str(scf_ast_t* ast, scf_node_t* parent, scf_lex_word_t* w); +int scf_ast_add_const_var(scf_ast_t* ast, scf_node_t* parent, int type, const uint64_t u64); +#endif diff --git a/js/core/scf_dag.c b/js/core/scf_dag.c index 6290c18..fb92226 100644 --- a/js/core/scf_dag.c +++ b/js/core/scf_dag.c @@ -280,7 +280,11 @@ void scf_dn_status_print(scf_dn_status_t* ds) if (ds->dag_node) { v = ds->dag_node->var; - printf("dn: v_%d_%d/%s ", v->w->line, v->w->pos, v->w->text->data); + + if (v->w) + printf("dn: v_%d_%d/%s ", v->w->line, v->w->pos, v->w->text->data); + else + printf("dn: v_%#lx ", (uintptr_t)v & 0xffff); if (ds->dn_indexes) { for (i = ds->dn_indexes->size - 1; i >= 0; i--) { @@ -296,7 +300,10 @@ void scf_dn_status_print(scf_dn_status_t* ds) if (ds->alias) { v = ds->alias->var; - printf(" alias: v_%d_%d/%s ", v->w->line, v->w->pos, v->w->text->data); + if (v->w) + printf(" alias: v_%d_%d/%s ", v->w->line, v->w->pos, v->w->text->data); + else + printf(" alias: v_%#lx ", (uintptr_t)v & 0xffff); if (ds->alias_indexes) { for (i = ds->alias_indexes->size - 1; i >= 0; i--) { diff --git a/js/core/scf_lex_word.h b/js/core/scf_lex_word.h index b9addb6..7b2c10a 100644 --- a/js/core/scf_lex_word.h +++ b/js/core/scf_lex_word.h @@ -148,6 +148,7 @@ enum scf_lex_words // class SCF_LEX_WORD_KEY_CLASS, // class + SCF_LEX_WORD_KEY_FUNC, // function SCF_LEX_WORD_KEY_CONST, // const SCF_LEX_WORD_KEY_STATIC, // static diff --git a/js/core/scf_optimizer_auto_gc.c b/js/core/scf_optimizer_auto_gc.c index 822c25a..2b1ab06 100644 --- a/js/core/scf_optimizer_auto_gc.c +++ b/js/core/scf_optimizer_auto_gc.c @@ -22,23 +22,50 @@ static int _find_ds_malloced(scf_basic_block_t* bb, void* data) return 0; } -static int _find_dn_active(scf_basic_block_t* bb, void* data) +static int __find_dn_active(scf_vector_t* dn_vec, scf_dag_node_t* dn) { - scf_dag_node_t* dn = data; + scf_dn_status_t* ds = NULL; + scf_dag_node_t* dn2; + int i; - if (scf_vector_find(bb->dn_loads, data)) - return 1; + for (i = 0; i < dn_vec->size; i++) { + dn2 = dn_vec->data[i]; - if (scf_vector_find(bb->dn_reloads, data)) - return 1; + if (dn2 == dn) + return 1; - if (scf_vector_find(bb->entry_dn_actives, data)) - return 1; + int ret = scf_ds_for_dn(&ds, dn2); + if (ret < 0) + return ret; + + if (ds->dag_node == dn) { + scf_dn_status_free(ds); + return 1; + } + + scf_dn_status_free(ds); + ds = NULL; + } - scf_logd("bb: %p, dn: %s, 0\n", bb, dn->var->w->text->data); return 0; } +static int _find_dn_active(scf_basic_block_t* bb, void* data) +{ + scf_dag_node_t* dn = data; + + int ret = __find_dn_active(bb->dn_loads, dn); + if (0 == ret) { + ret = __find_dn_active(bb->dn_reloads, dn); + + if (0 == ret) + ret = __find_dn_active(bb->entry_dn_actives, dn); + } + + scf_logd("bb: %p, dn: %s, 0\n", bb, dn->var->w->text->data); + return ret; +} + static int _bb_find_ds_malloced(scf_basic_block_t* root, scf_list_t* bb_list_head, scf_dn_status_t* ds, scf_vector_t* results) { scf_basic_block_visit_flag(bb_list_head, 0); @@ -1014,7 +1041,6 @@ static int _optimize_auto_gc(scf_ast_t* ast, scf_function_t* f, scf_vector_t* fu } } -// scf_basic_block_print_list(bb_list_head); return 0; } diff --git a/js/core/scf_pointer_alias.c b/js/core/scf_pointer_alias.c index 2232ac7..811de5d 100644 --- a/js/core/scf_pointer_alias.c +++ b/js/core/scf_pointer_alias.c @@ -1557,7 +1557,7 @@ int scf_pointer_alias(scf_vector_t* aliases, scf_dag_node_t* dn_alias, scf_3ac_c default: if (dn_alias->var && dn_alias->var->w) { v = dn_alias->var; - scf_loge("type: %d, v_%d_%d/%s\n", dn_alias->type, v->w->line, v->w->pos, v->w->text->data); + scf_loge("type: %d, v_%d_%d/%s/%#lx\n", dn_alias->type, v->w->line, v->w->pos, v->w->text->data, 0xffff & (uintptr_t)dn_alias->var); } else scf_loge("type: %d, v_%#lx\n", dn_alias->type, 0xffff & (uintptr_t)dn_alias->var); return -1; diff --git a/js/core/scf_scope.c b/js/core/scf_scope.c index 8790ebe..9e7612f 100644 --- a/js/core/scf_scope.c +++ b/js/core/scf_scope.c @@ -42,6 +42,9 @@ void scf_scope_push_var(scf_scope_t* scope, scf_variable_t* var) { assert(scope); assert(var); + + var->js_index = scope->vars->size; + scf_vector_add(scope->vars, var); } diff --git a/js/core/scf_type.h b/js/core/scf_type.h index efb3a15..82aa8a9 100644 --- a/js/core/scf_type.h +++ b/js/core/scf_type.h @@ -36,6 +36,7 @@ struct scf_type_s { int size; int offset; // only used for member var of struct or class + scf_type_t* super; // pointed to super type extended by this scf_type_t* parent; // pointed to parent type includes this }; diff --git a/js/core/scf_variable.c b/js/core/scf_variable.c index 96197d2..3c2fde5 100644 --- a/js/core/scf_variable.c +++ b/js/core/scf_variable.c @@ -100,6 +100,9 @@ scf_variable_t* scf_variable_alloc(scf_lex_word_t* w, scf_type_t* t) v->refs = 1; v->type = t->type; + v->js_type = -1; + v->js_index = -1; + v->const_flag = t->node.const_flag; v->nb_pointers = t->nb_pointers; v->func_ptr = t->func_ptr; diff --git a/js/core/scf_variable.h b/js/core/scf_variable.h index 89e8b19..1e4ae3d 100644 --- a/js/core/scf_variable.h +++ b/js/core/scf_variable.h @@ -16,6 +16,9 @@ struct scf_variable_s { int type; // type scf_lex_word_t* w; // lex word + int js_type; + int js_index; + int nb_lbs; // number of '{}' when parse js object int nb_rbs; diff --git a/js/doc.c b/js/doc.c index a575256..849a9db 100644 --- a/js/doc.c +++ b/js/doc.c @@ -1,4 +1,107 @@ -int printf(const char* fmt, ...); +#include"../js/lib/scf_capi.c" + +struct Object +{ + int type; + int n_members; + Object** members; + char* name; +// p.x --> p.members[x] + char* str; + double d; + + int __init(Object* this, double d) + { + this->d = d; + return 0; + } + + int __init(Object* this, const char* name, int n_members) + { + printf("this: %p, name: %s\n", this, name); + int len = strlen(name); + + this->name = scf__auto_malloc(len + 1); + if (!this->name) + return -1; + memcpy(this->name, name, len + 1); + + this->n_members = n_members; + + if (n_members > 0) { + this->members = scf__auto_malloc(sizeof(Object*) * n_members); + if (!this->members) + return -1; + } + + printf("\n"); + return 0; + } + + int __init(Object* this, const char* name, int n_members, double d) + { + printf("this: %p, name: %s\n", this, name); + int len = strlen(name); + + this->name = scf__auto_malloc(len + 1); + if (!this->name) + return -1; + memcpy(this->name, name, len + 1); + + this->n_members = n_members; + + if (n_members > 0) { + this->members = scf__auto_malloc(sizeof(Object*) * n_members); + if (!this->members) + return -1; + } + + this->d = d; + + printf("this: %p, this->d: %lg, d: %lg\n", this, this->d, d); + return 0; + } + + const char* toString(Object* this) + { + char* s = scf__auto_malloc(128); + if (!s) + return NULL; + + snprintf(s, 127, "%lg", this->d); + return s; + } + + Object* operator+(Object* this, Object* that) + { + Object* res = create Object(this->d + that->d); + return res; + } + + void __release(Object* this) + { + if (this->members) { + int i; + for (i = 0; i < this->n_members; i++) { + if (this->members[i]) { + this->members[i].__release(); + + scf__auto_freep(&this->members[i], NULL); + } + } + + scf__auto_freep(&this->members, NULL); + } + + if (this->name) + scf__auto_freep(&this->name, NULL); + + if (this->str) + scf__auto_freep(&this->str, NULL); + +// printf("\n"); + } +}; struct HTML; @@ -6,8 +109,9 @@ int abc_html_write(HTML* html, const char* s); struct HTML { - void write(HTML* this, const char* s) + void write(HTML* this, Object* obj) { + char* s = obj.toString(); abc_html_write(this, s); } }; diff --git a/js/elf/scf_elf_x64_so.c b/js/elf/scf_elf_x64_so.c index 236e9a4..46b1df7 100644 --- a/js/elf/scf_elf_x64_so.c +++ b/js/elf/scf_elf_x64_so.c @@ -170,10 +170,7 @@ static int _x64_elf_add_gnu_hash(elf_native_t* x64, elf_section_t** ps) #define HASH_BUCKETS 3 #define HASH_BLOOMS 1 - int n_syms = x64->dynsyms->size; - - if (x64->dyn_relas) - n_syms -= x64->dyn_relas->size; + int n_syms = x64->dynsyms->size - x64->n_plts; int len = sizeof(uint32_t) * 4 + sizeof(uint64_t) * HASH_BLOOMS + sizeof(uint32_t) * HASH_BUCKETS @@ -833,12 +830,9 @@ int __x64_so_add_dyn(elf_native_t* x64, const char* sysroot) scf_string_t* str = scf_string_alloc(); char c = '\0'; - int j = 0; + int j = x64->n_plts; int i; - if (x64->dyn_relas) - j = x64->dyn_relas->size; - scf_string_cat_cstr_len(str, &c, 1); for (i = 0; i < x64->dynsyms->size; i++) { @@ -919,7 +913,7 @@ int __x64_so_add_dyn(elf_native_t* x64, const char* sysroot) dyns[i + 8].d_tag = DT_JMPREL; dyns[i + 5].d_un.d_ptr = (uintptr_t)x64->got_plt; - dyns[i + 6].d_un.d_ptr = sizeof(Elf64_Rela); + dyns[i + 6].d_un.d_ptr = x64->rela_plt->data_len; dyns[i + 7].d_un.d_ptr = DT_RELA; dyns[i + 8].d_un.d_ptr = (uintptr_t)x64->rela_plt; diff --git a/js/lex/scf_lex.c b/js/lex/scf_lex.c index a62e8a8..a9b9e56 100644 --- a/js/lex/scf_lex.c +++ b/js/lex/scf_lex.c @@ -80,6 +80,7 @@ static scf_key_word_t key_words[] = {"union", SCF_LEX_WORD_KEY_UNION}, {"struct", SCF_LEX_WORD_KEY_STRUCT}, {"var", SCF_LEX_WORD_KEY_VAR}, + {"function", SCF_LEX_WORD_KEY_FUNC}, }; static scf_escape_char_t escape_chars[] = diff --git a/js/lib/scf_capi.c b/js/lib/scf_capi.c index 384b957..759b34d 100644 --- a/js/lib/scf_capi.c +++ b/js/lib/scf_capi.c @@ -1,5 +1,6 @@ int printf(const char* fmt, ...); +int snprintf(char* buf, uintptr_t size, const char* fmt, ...); int rand(); void srand(uint32_t seed); diff --git a/js/lib/x64/scf_object.o b/js/lib/x64/scf_object.o index 00fd5253109c65072c6564ed60a497bb9540a1cc..86e2a9f712e93bda81c0ce0abe0440bf1d4d5e1a 100644 GIT binary patch delta 1331 zcmZ9MT}TvB6vywm1+sWAwAIneH`7i(*VGLU!1RF2~q12T79R1Wh(c{E`HkF~cm=x) zhx6|Vy+i03EOM@a4y_D`wl<=d%%n#>6YV`tsm0pVD1%-xR+69l)MJs( z2!o#EX8yfTJ$>{fgYH2y?LWu(B#q#*SSKNGw3)`j;JWa#!DZ2aS0#I_2G{;JV2A0A za8@A-;HR^YJdncZ0)|V@S02v2ZYBIuS*sl4m2TxJpeV zfLl1>*6_1C3~?;?X#P|d^&u1c;-Tvoy((c*Z1iaLQ>tJVT}5$)mdVEuRrxl(#ip;e z>9=r{)*7{S(`|Gb7l_W;YRhc&0lG>w|G161Z8U&&C8wbYM@#nlqofPFV+EE+(Lq-i zy1Z3%6za&Qu$}xp93el6Gu{SpV!2QAm(V=L+yz-I!zyefy3V9>t85bjI6$<Y}F* zyDLn7|7;%HHLdvy^P-hVYl`_{nU~7A31?`nT1gX9^~u&Ncwm=RkPX3=Va+e)}fNE-#_i&!bTk)##0V1*U=0a|Uf zqr%Rex!T}?IdjhWo%_Fc?!CKj1B>MY z!!Tit1mK!68{$J5Mzse^p%{knFoeK?2?#mgXEW0p@e>4`J6%@x5q&)1bmdxEDMokz zsxZMr(15c%#24IHs8l*Glz)k8TUt;)E-3Z&zow@~5a8K%2 zk9T=_Irg!49%xuN_QEC7XK5I8G5zT0#lOgULeYL4X=Ok-ps*i+2j?{wVoyyyCyG7$=4$@23wzVWTNv zxrx;ONoo}9GrQn2zRRqITevx^Ie(ZaR5p<>=2l}H-p-0=jEZ_x)CbU?y#b{sXXIxJc_yp&5k2AxU%O+k-x@rtgxp zXAP~vI-<>zK9qDtxdVHN-jsAoQonq^#3x=2=e%C{fS)LG>0X!@k?Npba2eGFE4MLO HtsDFw= diff --git a/js/native/x64/scf_x64_bb_color.c b/js/native/x64/scf_x64_bb_color.c index af9d946..2f9eefa 100644 --- a/js/native/x64/scf_x64_bb_color.c +++ b/js/native/x64/scf_x64_bb_color.c @@ -428,8 +428,8 @@ int x64_load_bb_colors2(scf_basic_block_t* bb, scf_bb_group_t* bbg, scf_function for (j = 0; j < bb->prevs->size; j++) { prev = bb->prevs->data[j]; - if (!scf_vector_find(bbg->body, prev)) - continue; +// if (!scf_vector_find(bbg->body, prev)) +// continue; for (k = 0; k < prev->dn_colors_exit->size; k++) { ds2 = prev->dn_colors_exit->data[k]; @@ -438,7 +438,8 @@ int x64_load_bb_colors2(scf_basic_block_t* bb, scf_bb_group_t* bbg, scf_function break; } - assert(k < prev->dn_colors_exit->size); + if (k >= prev->dn_colors_exit->size) + break; if (0 == first) { first = 1; @@ -452,12 +453,11 @@ int x64_load_bb_colors2(scf_basic_block_t* bb, scf_bb_group_t* bbg, scf_function } if (j < bb->prevs->size) { - for (j = 0; j < bb->prevs->size; j++) { prev = bb->prevs->data[j]; - if (!scf_vector_find(bbg->body, prev)) - continue; + // if (!scf_vector_find(bbg->body, prev)) + // continue; for (k = 0; k < prev->dn_colors_exit->size; k++) { ds2 = prev->dn_colors_exit->data[k]; @@ -466,7 +466,8 @@ int x64_load_bb_colors2(scf_basic_block_t* bb, scf_bb_group_t* bbg, scf_function break; } - assert(k < prev->dn_colors_exit->size); + if (k >= prev->dn_colors_exit->size) + continue; if (x64_bb_save_dn2(ds2->color, dn, prev, f) < 0) { scf_loge("\n"); diff --git a/js/native/x64/scf_x64_inst.c b/js/native/x64/scf_x64_inst.c index baad56d..9854380 100644 --- a/js/native/x64/scf_x64_inst.c +++ b/js/native/x64/scf_x64_inst.c @@ -1049,7 +1049,7 @@ static int _x64_inst_array_index(scf_native_t* ctx, scf_3ac_code_t* c, int lea_f return ret; } - if (vb->nb_dimentions > 1 || vb->type >= SCF_STRUCT || lea_flag) { + if (vb->nb_dimentions > 1 || (vb->type >= SCF_STRUCT && 0 == vb->nb_pointers) || lea_flag) { OpCode = x64_find_OpCode(SCF_X64_LEA, rd->bytes, rd->bytes, SCF_X64_E2G); } else { diff --git a/js/native/x64/scf_x64_reg.c b/js/native/x64/scf_x64_reg.c index 331d25d..b21cb3a 100644 --- a/js/native/x64/scf_x64_reg.c +++ b/js/native/x64/scf_x64_reg.c @@ -207,18 +207,21 @@ void x64_registers_print() } } -int x64_caller_save_regs(scf_3ac_code_t* c, uint32_t* regs, int nb_regs, int stack_size, scf_register_t** saved_regs) +int x64_caller_save_regs(scf_3ac_code_t* c, const char* regs[], int nb_regs, int stack_size, scf_register_t** saved_regs) { scf_basic_block_t* bb = c->basic_block; scf_dag_node_t* dn; scf_instruction_t* inst; - scf_x64_OpCode_t* push = x64_find_OpCode(SCF_X64_PUSH, 8,8, SCF_X64_G); - scf_x64_OpCode_t* mov = x64_find_OpCode(SCF_X64_MOV, 8,8, SCF_X64_G2E); - scf_register_t* rsp = x64_find_register("rsp"); + scf_x64_OpCode_t* push = x64_find_OpCode(SCF_X64_PUSH, 8,8, SCF_X64_G); + scf_x64_OpCode_t* movsd = x64_find_OpCode(SCF_X64_MOVSD, 8,8, SCF_X64_G2E); + scf_x64_OpCode_t* mov = x64_find_OpCode(SCF_X64_MOV, 8,8, SCF_X64_G2E); + scf_x64_OpCode_t* sub = x64_find_OpCode(SCF_X64_SUB, 4,4, SCF_X64_I2E); + scf_register_t* rsp = x64_find_register("rsp"); scf_register_t* r; scf_register_t* r2; + uint32_t imm = 8; int i; int j; int k; @@ -226,7 +229,7 @@ int x64_caller_save_regs(scf_3ac_code_t* c, uint32_t* regs, int nb_regs, int sta int n = 0; for (j = 0; j < nb_regs; j++) { - r2 = x64_find_register_type_id_bytes(0, regs[j], 8); + r2 = x64_find_register(regs[j]); for (i = 0; i < sizeof(x64_registers) / sizeof(x64_registers[0]); i++) { r = &(x64_registers[i]); @@ -263,10 +266,21 @@ int x64_caller_save_regs(scf_3ac_code_t* c, uint32_t* regs, int nb_regs, int sta if (i == sizeof(x64_registers) / sizeof(x64_registers[0])) continue; - if (stack_size > 0) - inst = x64_make_inst_G2P(mov, rsp, size + stack_size, r2); - else - inst = x64_make_inst_G(push, r2); + if (X64_COLOR_TYPE(r2->color)) { + if (stack_size > 0) + inst = x64_make_inst_G2P(movsd, rsp, size + stack_size, r2); + else { + inst = x64_make_inst_I2E(sub, rsp, (uint8_t*)&imm, 4); + X64_INST_ADD_CHECK(c->instructions, inst); + + inst = x64_make_inst_G2P(movsd, rsp, 0, r2); + } + } else { + if (stack_size > 0) + inst = x64_make_inst_G2P(mov, rsp, size + stack_size, r2); + else + inst = x64_make_inst_G(push, r2); + } X64_INST_ADD_CHECK(c->instructions, inst); saved_regs[n++] = r2; @@ -276,10 +290,21 @@ int x64_caller_save_regs(scf_3ac_code_t* c, uint32_t* regs, int nb_regs, int sta if (size & 0xf) { r2 = saved_regs[n - 1]; - if (stack_size > 0) - inst = x64_make_inst_G2P(mov, rsp, size + stack_size, r2); - else - inst = x64_make_inst_G(push, r2); + if (X64_COLOR_TYPE(r2->color)) { + if (stack_size > 0) + inst = x64_make_inst_G2P(movsd, rsp, size + stack_size, r2); + else { + inst = x64_make_inst_I2E(sub, rsp, (uint8_t*)&imm, 4); + X64_INST_ADD_CHECK(c->instructions, inst); + + inst = x64_make_inst_G2P(movsd, rsp, 0, r2); + } + } else { + if (stack_size > 0) + inst = x64_make_inst_G2P(mov, rsp, size + stack_size, r2); + else + inst = x64_make_inst_G(push, r2); + } X64_INST_ADD_CHECK(c->instructions, inst); saved_regs[n++] = r2; @@ -297,53 +322,19 @@ int x64_caller_save_regs(scf_3ac_code_t* c, uint32_t* regs, int nb_regs, int sta return size; } -int x64_push_regs(scf_vector_t* instructions, uint32_t* regs, int nb_regs) -{ - int i; - int j; - scf_register_t* r; - scf_register_t* r2; - scf_instruction_t* inst; - scf_x64_OpCode_t* push = x64_find_OpCode(SCF_X64_PUSH, 8,8, SCF_X64_G); - - for (j = 0; j < nb_regs; j++) { - r2 = x64_find_register_type_id_bytes(0, regs[j], 8); - - for (i = 0; i < sizeof(x64_registers) / sizeof(x64_registers[0]); i++) { - r = &(x64_registers[i]); - - if (!X64_COLOR_TYPE(r->color) && (SCF_X64_REG_RSP == r->id || SCF_X64_REG_RBP == r->id)) - continue; - - if (0 == r->dag_nodes->size) - continue; - - if (X64_COLOR_CONFLICT(r2->color, r->color)) - break; - } - - if (i == sizeof(x64_registers) / sizeof(x64_registers[0])) - continue; - - inst = x64_make_inst_G(push, r2); - X64_INST_ADD_CHECK(instructions, inst); - } - return 0; -} - int x64_pop_regs(scf_vector_t* instructions, scf_register_t** regs, int nb_regs, scf_register_t** updated_regs, int nb_updated) { - int i; - int j; - - scf_register_t* rsp = x64_find_register("rsp"); - scf_register_t* r; - scf_register_t* r2; + scf_register_t* rsp = x64_find_register("rsp"); + scf_register_t* r; + scf_register_t* r2; scf_instruction_t* inst; - scf_x64_OpCode_t* pop = x64_find_OpCode(SCF_X64_POP, 8, 8, SCF_X64_G); - scf_x64_OpCode_t* add = x64_find_OpCode(SCF_X64_ADD, 4, 4, SCF_X64_I2E); + scf_x64_OpCode_t* movsd = x64_find_OpCode(SCF_X64_MOVSD, 8, 8, SCF_X64_E2G); + scf_x64_OpCode_t* pop = x64_find_OpCode(SCF_X64_POP, 8, 8, SCF_X64_G); + scf_x64_OpCode_t* add = x64_find_OpCode(SCF_X64_ADD, 4, 4, SCF_X64_I2E); uint32_t imm = 8; + int i; + int j; for (j = nb_regs - 1; j >= 0; j--) { r2 = regs[j]; @@ -373,7 +364,13 @@ int x64_pop_regs(scf_vector_t* instructions, scf_register_t** regs, int nb_regs, } if (i == nb_updated) { - inst = x64_make_inst_G(pop, r2); + if (X64_COLOR_TYPE(r2->color)) { + inst = x64_make_inst_P2G(movsd, r2, rsp, 0); + X64_INST_ADD_CHECK(instructions, inst); + + inst = x64_make_inst_I2E(add, rsp, (uint8_t*)&imm, 4); + } else + inst = x64_make_inst_G(pop, r2); X64_INST_ADD_CHECK(instructions, inst); } else { inst = x64_make_inst_I2E(add, rsp, (uint8_t*)&imm, 4); @@ -679,7 +676,7 @@ int x64_overflow_reg2(scf_register_t* r, scf_dag_node_t* dn, scf_3ac_code_t* c, int x64_reg_used(scf_register_t* r, scf_dag_node_t* dn) { scf_register_t* r2; - scf_dag_node_t* dn2; + scf_dag_node_t* dn2; int i; int j; @@ -695,7 +692,7 @@ int x64_reg_used(scf_register_t* r, scf_dag_node_t* dn) continue; for (j = 0; j < r2->dag_nodes->size; j++) { - dn2 = r2->dag_nodes->data[j]; + dn2 = r2->dag_nodes->data[j]; if (dn2 != dn) return 1; @@ -745,6 +742,8 @@ scf_register_t* x64_select_overflowed_reg(scf_dag_node_t* dn, scf_3ac_code_t* c) int i; int j; + scf_logi("bytes: %d\n", bytes); + assert(c->rcg); ret = x64_rcg_find_node(&gn, c->rcg, dn, NULL); @@ -1358,9 +1357,7 @@ int x64_push_callee_regs(scf_3ac_code_t* c, scf_function_t* f) int j; for (i = 0; i < X64_ABI_CALLEE_SAVES_NB; i++) { - - j = x64_abi_callee_saves[i]; - r = x64_find_register_type_id_bytes(0, j, 8); + r = x64_find_register(x64_abi_callee_saves[i]); for (j = 0; j < N; j++) { r2 = &(x64_registers[j]); @@ -1397,9 +1394,7 @@ int x64_pop_callee_regs(scf_3ac_code_t* c, scf_function_t* f) f->callee_saved_size = 0; for (i = X64_ABI_CALLEE_SAVES_NB - 1; i >= 0; i--) { - - j = x64_abi_callee_saves[i]; - r = x64_find_register_type_id_bytes(0, j, 8); + r = x64_find_register(x64_abi_callee_saves[i]); for (j = 0; j < N; j++) { r2 = &(x64_registers[j]); diff --git a/js/native/x64/scf_x64_reg.h b/js/native/x64/scf_x64_reg.h index 790ce54..40c5967 100644 --- a/js/native/x64/scf_x64_reg.h +++ b/js/native/x64/scf_x64_reg.h @@ -65,27 +65,36 @@ static uint32_t x64_abi_ret_regs[] = }; #define X64_ABI_RET_NB (sizeof(x64_abi_ret_regs) / sizeof(x64_abi_ret_regs[0])) -static uint32_t x64_abi_caller_saves[] = +static const char* x64_abi_caller_saves[] = { - SCF_X64_REG_RAX, - SCF_X64_REG_RCX, - SCF_X64_REG_RDX, - SCF_X64_REG_RSI, - SCF_X64_REG_RDI, - SCF_X64_REG_R8, - SCF_X64_REG_R9, - SCF_X64_REG_R10, - SCF_X64_REG_R11, + "rax", + "rcx", + "rdx", + "rsi", + "rdi", + "r8", + "r9", + "r10", + "r11", + + "xmm0", + "xmm1", + "xmm2", + "xmm3", + "xmm4", + "xmm5", + "xmm6", + "xmm7", }; #define X64_ABI_CALLER_SAVES_NB (sizeof(x64_abi_caller_saves) / sizeof(x64_abi_caller_saves[0])) -static uint32_t x64_abi_callee_saves[] = +static const char* x64_abi_callee_saves[] = { - SCF_X64_REG_RBX, - SCF_X64_REG_R12, - SCF_X64_REG_R13, - SCF_X64_REG_R14, - SCF_X64_REG_R15, + "rbx", + "r12", + "r13", + "r14", + "r15", }; #define X64_ABI_CALLEE_SAVES_NB (sizeof(x64_abi_callee_saves) / sizeof(x64_abi_callee_saves[0])) @@ -138,7 +147,7 @@ int x64_save_var2(scf_dag_node_t* dn, scf_register_t* r, scf_3ac int x64_push_regs(scf_vector_t* instructions, uint32_t* regs, int nb_regs); int x64_pop_regs (scf_vector_t* instructions, scf_register_t** regs, int nb_regs, scf_register_t** updated_regs, int nb_updated); -int x64_caller_save_regs(scf_3ac_code_t* c, uint32_t* regs, int nb_regs, int stack_size, scf_register_t** saved_regs); +int x64_caller_save_regs(scf_3ac_code_t* c, const char* regs[], int nb_regs, int stack_size, scf_register_t** saved_regs); int x64_push_callee_regs(scf_3ac_code_t* c, scf_function_t* f); int x64_pop_callee_regs (scf_3ac_code_t* c, scf_function_t* f); diff --git a/js/parse/main.c b/js/parse/main.c index d262425..d592dd3 100644 --- a/js/parse/main.c +++ b/js/parse/main.c @@ -5,7 +5,7 @@ static char* __objs[] = { - "_start.o", +// "_start.o", "scf_object.o", "scf_atomic.o", }; @@ -101,13 +101,11 @@ int scf_parse_link(const char* exec, const char* obj, const char* libjs, const c #define MAIN_ADD_FILES(_objs, _sofiles, _arch) \ do { \ - if (!dyn) { \ - int ret = add_sys_files(objs, sysroot, _arch, _objs, sizeof(_objs) / sizeof(_objs[0])); \ - if (ret < 0) \ - return ret; \ - } \ - \ - int ret = add_sys_files(sofiles, sysroot, _arch, _sofiles, sizeof(_sofiles) / sizeof(_sofiles[0])); \ + int ret; \ + ret = add_sys_files(objs, sysroot, _arch, _objs, sizeof(_objs) / sizeof(_objs[0])); \ + if (ret < 0) \ + return ret; \ + ret = add_sys_files(sofiles, sysroot, _arch, _sofiles, sizeof(_sofiles) / sizeof(_sofiles[0])); \ if (ret < 0) \ return ret; \ } while (0) diff --git a/js/parse/scf_dfa_expr.c b/js/parse/scf_dfa_expr.c index 6e9ea28..949880b 100644 --- a/js/parse/scf_dfa_expr.c +++ b/js/parse/scf_dfa_expr.c @@ -80,8 +80,10 @@ int _expr_add_var(scf_parse_t* parse, dfa_data_t* d) { expr_module_data_t* md = d->module_datas[dfa_module_expr.index]; scf_variable_t* var = NULL; + scf_variable_t* v = NULL; scf_node_t* node = NULL; scf_type_t* pt = NULL; + scf_type_t* t = NULL; scf_function_t* f = NULL; dfa_identity_t* id = scf_stack_pop(d->current_identities); scf_lex_word_t* w; @@ -114,9 +116,25 @@ int _expr_add_var(scf_parse_t* parse, dfa_data_t* d) var->const_literal_flag = 1; } - scf_logi("var: %s, member_flag: %d, line: %d\n", var->w->text->data, var->member_flag, var->w->line); + scf_logi("var: %s, member_flag: %d, js_type: %d, line: %d, pos: %d\n", var->w->text->data, var->member_flag, var->js_type, var->w->line, var->w->pos); - node = scf_node_alloc(w, var->type, var); + if (md->current_var + && md->current_var->js_type >= 0 + && var->member_flag) { + scf_loge("var: %s, member_flag: %d, line: %d, pos: %d\n", var->w->text->data, var->member_flag, var->w->line, var->w->pos); + + t = scf_block_find_type_type(parse->ast->current_block, SCF_VAR_INTPTR); + v = SCF_VAR_ALLOC_BY_TYPE(NULL, t, 1, 0, NULL); + if (!v) + return -ENOMEM; + v->const_literal_flag = 1; + v->data.i64 = var->js_index; + + node = scf_node_alloc(w, v->type, v); + scf_variable_free(v); + v = NULL; + } else + node = scf_node_alloc(w, var->type, var); if (!node) return -ENOMEM; @@ -273,12 +291,14 @@ static int _expr_action_number(scf_dfa_t* dfa, scf_vector_t* words, void* data) static int _expr_action_op(scf_dfa_t* dfa, scf_vector_t* words, void* data, int nb_operands) { - scf_parse_t* parse = dfa->priv; - dfa_data_t* d = data; - scf_lex_word_t* w = words->data[words->size - 1]; - - scf_operator_t* op; - scf_node_t* node; + scf_parse_t* parse = dfa->priv; + dfa_data_t* d = data; + expr_module_data_t* md = d->module_datas[dfa_module_expr.index]; + scf_lex_word_t* w = words->data[words->size - 1]; + scf_variable_t* v; + scf_operator_t* op; + scf_node_t* node; + scf_type_t* t; op = scf_find_base_operator(w->text->data, nb_operands); if (!op) { @@ -297,6 +317,44 @@ static int _expr_action_op(scf_dfa_t* dfa, scf_vector_t* words, void* data, int return SCF_DFA_ERROR; } + if (SCF_LEX_WORD_ARROW == w->type || SCF_LEX_WORD_DOT == w->type) { + if (md->current_var->js_type >= 0) { + t = NULL; + if (scf_ast_find_type(&t, parse->ast, "Object") < 0) + return SCF_DFA_ERROR; + + v = scf_scope_find_variable(t->scope, "members"); + if (!v) { + scf_logw("var 'members' not found in struct '%s'\n", t->name->data); + return SCF_DFA_ERROR; + } + + node = scf_node_alloc(NULL, v->type, v); + if (!node) + return SCF_DFA_ERROR; + + if (scf_expr_add_node(d->expr, node) < 0) { + scf_node_free(node); + return SCF_DFA_ERROR; + } + + node = scf_node_alloc(NULL, SCF_OP_ARRAY_INDEX, NULL); + if (!node) + return SCF_DFA_ERROR; + + if (scf_expr_add_node(d->expr, node) < 0) { + scf_node_free(node); + return SCF_DFA_ERROR; + } + + t = NULL; + if (scf_ast_find_type_type(&t, parse->ast, md->current_var->js_type) < 0) + return SCF_DFA_ERROR; + + parse->ast->current_block = (scf_block_t*)t; + } + } + return SCF_DFA_NEXT_WORD; } @@ -552,6 +610,10 @@ static int _expr_action_ls(scf_dfa_t* dfa, scf_vector_t* words, void* data) dfa_data_t* d = data; expr_module_data_t* md = d->module_datas[dfa_module_expr.index]; dfa_identity_t* id = scf_stack_top(d->current_identities); + scf_operator_t* op; + scf_variable_t* v; + scf_type_t* t; + scf_node_t* node; if (id && id->identity) { if (_expr_add_var(parse, d) < 0) { @@ -565,28 +627,56 @@ static int _expr_action_ls(scf_dfa_t* dfa, scf_vector_t* words, void* data) md->parent_block = NULL; } - scf_operator_t* op = scf_find_base_operator_by_type(SCF_OP_ARRAY_INDEX); + if (md->current_var->js_type >= 0) { + t = NULL; + if (scf_ast_find_type(&t, parse->ast, "Object") < 0) + return SCF_DFA_ERROR; + + v = scf_scope_find_variable(t->scope, "members"); + if (!v) { + scf_logw("var 'members' not found in struct '%s'\n", t->name->data); + return SCF_DFA_ERROR; + } + + node = scf_node_alloc(w, SCF_OP_POINTER, NULL); + if (!node) + return SCF_DFA_ERROR; + + if (scf_expr_add_node(d->expr, node) < 0) { + scf_node_free(node); + return SCF_DFA_ERROR; + } + + node = scf_node_alloc(NULL, v->type, v); + if (!node) + return SCF_DFA_ERROR; + + if (scf_expr_add_node(d->expr, node) < 0) { + scf_node_free(node); + return SCF_DFA_ERROR; + } + } + + op = scf_find_base_operator_by_type(SCF_OP_ARRAY_INDEX); assert(op); - scf_node_t* n = scf_node_alloc(w, op->type, NULL); - if (!n) { + node = scf_node_alloc(w, op->type, NULL); + if (!node) { scf_loge("node alloc error\n"); return SCF_DFA_ERROR; } - n->op = op; + node->op = op; - scf_expr_add_node(d->expr, n); + scf_expr_add_node(d->expr, node); scf_stack_push(md->ls_exprs, d->expr); - scf_expr_t* index = scf_expr_alloc(); - if (!index) { + d->expr = scf_expr_alloc(); + if (!d->expr) { scf_loge("index expr alloc error\n"); return SCF_DFA_ERROR; } - d->expr = index; - return SCF_DFA_NEXT_WORD; } diff --git a/js/parse/scf_dfa_function_js.c b/js/parse/scf_dfa_function_js.c new file mode 100644 index 0000000..a32423d --- /dev/null +++ b/js/parse/scf_dfa_function_js.c @@ -0,0 +1,331 @@ +#include"scf_dfa.h" +#include"scf_dfa_util.h" +#include"scf_parse.h" + +extern scf_dfa_module_t dfa_module_function_js; + +typedef struct { + + scf_block_t* parent_block; + +} dfa_fun_data_t; + +int _function_js_add_function(scf_dfa_t* dfa, scf_lex_word_t* w, dfa_data_t* d) +{ + scf_parse_t* parse = dfa->priv; + scf_ast_t* ast = parse->ast; + dfa_fun_data_t* fd = d->module_datas[dfa_module_function_js.index]; + + scf_function_t* f; + scf_variable_t* v; + scf_block_t* b; + scf_type_t* t = NULL; + + int ret = scf_ast_find_type(&t, ast, "Object"); + if (ret < 0) + return ret; + + b = ast->current_block; + while (b) { + if (b->node.type >= SCF_STRUCT) + break; + b = (scf_block_t*)b->node.parent; + } + + f = scf_function_alloc(w); + if (!f) + return SCF_DFA_ERROR; + f->member_flag = !!b; + + scf_logi("function: %s,line:%d, member_flag: %d\n", f->node.w->text->data, f->node.w->line, f->member_flag); + + v = SCF_VAR_ALLOC_BY_TYPE(w, t, 0, 1, NULL); + if (!v) { + scf_function_free(f); + return SCF_DFA_ERROR; + } + + if (scf_vector_add(f->rets, v) < 0) { + scf_variable_free(v); + scf_function_free(f); + return SCF_DFA_ERROR; + } + + scf_scope_push_function(ast->current_block->scope, f); + + scf_node_add_child((scf_node_t*)ast->current_block, (scf_node_t*)f); + + fd ->parent_block = ast->current_block; + ast->current_block = (scf_block_t*)f; + + d->current_function = f; + + return SCF_DFA_NEXT_WORD; +} + +int _function_js_add_arg(scf_ast_t* ast, scf_lex_word_t* w, dfa_data_t* d) +{ + scf_variable_t* arg = NULL; + scf_type_t* t = NULL; + + int ret = scf_ast_find_type(&t, ast, "Object"); + if (ret < 0) + return ret; + + arg = SCF_VAR_ALLOC_BY_TYPE(w, t, 0, 1, NULL); + if (!arg) + return SCF_DFA_ERROR; + + scf_scope_push_var(d->current_function->scope, arg); + + scf_logi("d->argc: %d, arg->nb_pointers: %d, arg->nb_dimentions: %d\n", + d->argc, arg->nb_pointers, arg->nb_dimentions); + + scf_vector_add(d->current_function->argv, arg); + + arg->refs++; + arg->arg_flag = 1; + arg->local_flag = 1; + + d->argc++; + + return SCF_DFA_NEXT_WORD; +} + +static int _function_js_action_vargs(scf_dfa_t* dfa, scf_vector_t* words, void* data) +{ + dfa_data_t* d = data; + + d->current_function->vargs_flag = 1; + + return SCF_DFA_NEXT_WORD; +} + +static int _function_js_action_comma(scf_dfa_t* dfa, scf_vector_t* words, void* data) +{ + scf_parse_t* parse = dfa->priv; + dfa_data_t* d = data; + scf_lex_word_t* w; + + if (words->size < 2) + return SCF_DFA_ERROR; + w = words->data[words->size - 2]; + + if (!scf_lex_is_identity(w)) + return SCF_DFA_ERROR; + + if (_function_js_add_arg(parse->ast, w, d) < 0) { + scf_loge("function_js add arg failed\n"); + return SCF_DFA_ERROR; + } + + SCF_DFA_PUSH_HOOK(scf_dfa_find_node(dfa, "function_js_comma"), SCF_DFA_HOOK_PRE); + + return SCF_DFA_NEXT_WORD; +} + +static int _function_js_action_lp(scf_dfa_t* dfa, scf_vector_t* words, void* data) +{ + scf_parse_t* parse = dfa->priv; + dfa_data_t* d = data; + dfa_fun_data_t* fd = d->module_datas[dfa_module_function_js.index]; + scf_lex_word_t* w; + + if (words->size < 2) + return SCF_DFA_ERROR; + w = words->data[words->size - 2]; + + assert(!d->current_node); + + d->current_var = NULL; + + if (_function_js_add_function(dfa, w, d) < 0) + return SCF_DFA_ERROR; + + SCF_DFA_PUSH_HOOK(scf_dfa_find_node(dfa, "function_js_rp"), SCF_DFA_HOOK_PRE); + SCF_DFA_PUSH_HOOK(scf_dfa_find_node(dfa, "function_js_comma"), SCF_DFA_HOOK_PRE); + + d->argc = 0; + d->nb_lps++; + + return SCF_DFA_NEXT_WORD; +} + +static int _function_js_action_rp(scf_dfa_t* dfa, scf_vector_t* words, void* data) +{ + scf_parse_t* parse = dfa->priv; + dfa_data_t* d = data; + dfa_fun_data_t* fd = d->module_datas[dfa_module_function_js.index]; + scf_function_t* f = d->current_function; + scf_function_t* fprev = NULL; + scf_lex_word_t* w; + + d->nb_rps++; + + if (d->nb_rps < d->nb_lps) { + SCF_DFA_PUSH_HOOK(scf_dfa_find_node(dfa, "function_js_rp"), SCF_DFA_HOOK_PRE); + return SCF_DFA_NEXT_WORD; + } + + if (words->size < 2) + return SCF_DFA_ERROR; + w = words->data[words->size - 2]; + + if (scf_lex_is_identity(w)) { + if (_function_js_add_arg(parse->ast, w, d) < 0) { + scf_loge("function_js add arg failed\n"); + return SCF_DFA_ERROR; + } + } + + scf_list_del(&f->list); + scf_node_del_child((scf_node_t*)fd->parent_block, (scf_node_t*)f); + + scf_block_t* b = fd->parent_block; + + if (!b->node.root_flag && !b->node.file_flag) { + scf_loge("function_js should be defined in file, global\n"); + return SCF_DFA_ERROR; + } + + assert(b->scope); + + if (SCF_LEX_WORD_KEY_FUNC != f->node.w->type) { + if (f->static_flag) + fprev = scf_scope_find_function(b->scope, f->node.w->text->data); + else { + int ret = scf_ast_find_global_function(&fprev, parse->ast, f->node.w->text->data); + if (ret < 0) + return ret; + } + + if (fprev) { + scf_loge("repeated declare function '%s', first in line: %d_%d, second in line: %d_%d\n", + f->node.w->text->data, fprev->node.w->line, fprev->node.w->pos, f->node.w->line, f->node.w->pos); + return SCF_DFA_ERROR; + } + } + + scf_scope_push_function(fd->parent_block->scope, f); + + scf_node_add_child((scf_node_t*)fd->parent_block, (scf_node_t*)f); + + SCF_DFA_PUSH_HOOK(scf_dfa_find_node(dfa, "function_js_end"), SCF_DFA_HOOK_END); + + parse->ast->current_block = (scf_block_t*)d->current_function; + + return SCF_DFA_NEXT_WORD; +} + +static int _function_js_action_end(scf_dfa_t* dfa, scf_vector_t* words, void* data) +{ + scf_parse_t* parse = dfa->priv; + dfa_data_t* d = data; + scf_lex_word_t* w = words->data[words->size - 1]; + dfa_fun_data_t* fd = d->module_datas[dfa_module_function_js.index]; + + parse->ast->current_block = (scf_block_t*)(fd->parent_block); + + if (d->current_function->node.nb_nodes > 0) + d->current_function->node.define_flag = 1; + + fd->parent_block = NULL; + + d->current_function = NULL; + d->argc = 0; + d->nb_lps = 0; + d->nb_rps = 0; + + return SCF_DFA_OK; +} + +static int _dfa_init_module_function_js(scf_dfa_t* dfa) +{ + SCF_DFA_MODULE_NODE(dfa, function_js, comma, scf_dfa_is_comma, _function_js_action_comma); + SCF_DFA_MODULE_NODE(dfa, function_js, vargs, scf_dfa_is_vargs, _function_js_action_vargs); + SCF_DFA_MODULE_NODE(dfa, function_js, end, scf_dfa_is_entry, _function_js_action_end); + + SCF_DFA_MODULE_NODE(dfa, function_js, lp, scf_dfa_is_lp, _function_js_action_lp); + SCF_DFA_MODULE_NODE(dfa, function_js, rp, scf_dfa_is_rp, _function_js_action_rp); + SCF_DFA_MODULE_NODE(dfa, function_js, func, scf_dfa_is_func, scf_dfa_action_next); + SCF_DFA_MODULE_NODE(dfa, function_js, fname, scf_dfa_is_identity, scf_dfa_action_next); + SCF_DFA_MODULE_NODE(dfa, function_js, arg, scf_dfa_is_identity, scf_dfa_action_next); + + scf_parse_t* parse = dfa->priv; + dfa_data_t* d = parse->dfa_data; + dfa_fun_data_t* fd = d->module_datas[dfa_module_function_js.index]; + + assert(!fd); + + fd = calloc(1, sizeof(dfa_fun_data_t)); + if (!fd) { + scf_loge("\n"); + return SCF_DFA_ERROR; + } + + d->module_datas[dfa_module_function_js.index] = fd; + + return SCF_DFA_OK; +} + +static int _dfa_fini_module_function_js(scf_dfa_t* dfa) +{ + scf_parse_t* parse = dfa->priv; + dfa_data_t* d = parse->dfa_data; + dfa_fun_data_t* fd = d->module_datas[dfa_module_function_js.index]; + + if (fd) { + free(fd); + fd = NULL; + d->module_datas[dfa_module_function_js.index] = NULL; + } + + return SCF_DFA_OK; +} + +static int _dfa_init_syntax_function_js(scf_dfa_t* dfa) +{ + SCF_DFA_GET_MODULE_NODE(dfa, function_js, comma, comma); + SCF_DFA_GET_MODULE_NODE(dfa, function_js, vargs, vargs); + + SCF_DFA_GET_MODULE_NODE(dfa, function_js, lp, lp); + SCF_DFA_GET_MODULE_NODE(dfa, function_js, rp, rp); + SCF_DFA_GET_MODULE_NODE(dfa, function_js, func, func); + SCF_DFA_GET_MODULE_NODE(dfa, function_js, fname, fname); + SCF_DFA_GET_MODULE_NODE(dfa, function_js, arg, arg); + + SCF_DFA_GET_MODULE_NODE(dfa, block, entry, block); + + // function_js start + scf_vector_add(dfa->syntaxes, func); + + scf_dfa_node_add_child(func, fname); + scf_dfa_node_add_child(fname, lp); + scf_dfa_node_add_child(func, lp); + + // function_js args + scf_dfa_node_add_child(lp, rp); + + scf_dfa_node_add_child(lp, arg); + scf_dfa_node_add_child(arg, comma); + scf_dfa_node_add_child(comma, arg); + scf_dfa_node_add_child(arg, rp); + + scf_dfa_node_add_child(comma, vargs); + scf_dfa_node_add_child(vargs, rp); + + // function_js body + scf_dfa_node_add_child(rp, block); + + return 0; +} + +scf_dfa_module_t dfa_module_function_js = +{ + .name = "function_js", + + .init_module = _dfa_init_module_function_js, + .init_syntax = _dfa_init_syntax_function_js, + + .fini_module = _dfa_fini_module_function_js, +}; diff --git a/js/parse/scf_dfa_init_data.c b/js/parse/scf_dfa_init_data.c index c13cda0..b3b647f 100644 --- a/js/parse/scf_dfa_init_data.c +++ b/js/parse/scf_dfa_init_data.c @@ -6,6 +6,7 @@ extern scf_dfa_module_t dfa_module_init_data; int scf_array_init (scf_ast_t* ast, scf_lex_word_t* w, scf_variable_t* var, scf_vector_t* init_exprs); int scf_struct_init(scf_ast_t* ast, scf_lex_word_t* w, scf_variable_t* var, scf_vector_t* init_exprs); +int scf_object_init(scf_ast_t* ast, scf_lex_word_t* w, scf_variable_t* var, scf_variable_t* obj, scf_vector_t* init_exprs); int _class_calculate_size(scf_dfa_t* dfa, scf_type_t* s); @@ -32,42 +33,17 @@ static inline int _data_is_entry(scf_dfa_t* dfa, void* word) return SCF_LEX_WORD_LB == w->type || SCF_LEX_WORD_LS == w->type; } -static int _do_data_init(scf_dfa_t* dfa, scf_vector_t* words, dfa_data_t* d) +static int _do_data_init(scf_ast_t* ast, dfa_data_t* d, scf_variable_t* obj) { - scf_parse_t* parse = dfa->priv; - scf_variable_t* var = d->current_var; - scf_lex_word_t* w = words->data[words->size - 1]; - init_module_data_t* md = d->module_datas[dfa_module_init_data.index]; + init_module_data_t* md = d->module_datas[dfa_module_init_data.index]; dfa_init_expr_t* ie; + int i; - int ret = -1; - int i = 0; - - if (d->current_var->nb_dimentions > 0) - ret = scf_array_init(parse->ast, md->assign, d->current_var, md->init_exprs); - - else if (d->current_var->type >= SCF_STRUCT) - ret = scf_struct_init(parse->ast, md->assign, d->current_var, md->init_exprs); - - if (ret < 0) - goto error; + int ret = scf_object_init(ast, md->assign, d->current_var, obj, md->init_exprs); for (i = 0; i < md->init_exprs->size; i++) { ie = md->init_exprs->data[i]; - ret = scf_node_add_child((scf_node_t*)parse->ast->current_block, ie->expr); - if (ret < 0) - goto error; - ie->expr = NULL; - - free(ie); - ie = NULL; - } - -error: - for (; i < md->init_exprs->size; i++) { - ie = md->init_exprs->data[i]; - scf_expr_free(ie->expr); free(ie); ie = NULL; @@ -76,7 +52,9 @@ error: md->assign = NULL; scf_vector_free(md->init_exprs); + scf_vector_free(md->init_objs); md->init_exprs = NULL; + md->init_objs = NULL; free(md->current_index); md->current_index = NULL; @@ -85,6 +63,7 @@ error: md->nb_lbs = 0; md->nb_rbs = 0; + d->current_var = NULL; return ret; } @@ -111,11 +90,14 @@ static int _add_struct_member(scf_ast_t* ast, dfa_data_t* d, scf_variable_t* r) scf_scope_push_type(ast->current_block->scope, s); scf_node_add_child((scf_node_t*)ast->current_block, (scf_node_t*)s); - obj->type = s->type; + obj->type = s->type; + obj->js_type = s->type; + scf_logi("obj->w: %s\n", obj->w->text->data); } else { int ret = scf_ast_find_type_type(&s, ast, obj->type); if (ret < 0) return ret; + scf_logi("obj->w: %s\n", obj->w->text->data); } w = md->current_index[md->current_dim].w; @@ -141,6 +123,7 @@ static int _add_struct_member(scf_ast_t* ast, dfa_data_t* d, scf_variable_t* r) scf_variable_free(r); return -ENOMEM; } + v->member_flag = 1; if (r->nb_dimentions > 0) { v->nb_dimentions = r->nb_dimentions; @@ -161,6 +144,9 @@ static int _add_struct_member(scf_ast_t* ast, dfa_data_t* d, scf_variable_t* r) scf_variable_free(r); r = NULL; + if (v->type >= SCF_STRUCT) + v->js_type = v->type; + scf_scope_push_var(s->scope, v); return 0; } @@ -335,21 +321,16 @@ static int __data_add_obj(scf_dfa_t* dfa, scf_vector_t* words, void* data) d->expr = NULL; md->current_dim++; - if (md->current_dim >= md->current_n) { - - void* p = realloc(md->current_index, sizeof(dfa_index_t) * (md->current_dim + 1)); - if (!p) - return -ENOMEM; - md->current_index = p; - md->current_n = md->current_dim + 1; - } + scf_logd("w: %s, md->current_dim: %d\n", w->text->data, md->current_dim); - int i; - for (i = md->current_dim; i < md->current_n; i++) { + void* p = realloc(md->current_index, sizeof(dfa_index_t) * (md->current_dim + 1)); + if (!p) + return -ENOMEM; + md->current_index = p; + md->current_n = md->current_dim + 1; - md->current_index[i].w = NULL; - md->current_index[i].i = 0; - } + md->current_index[md->current_dim].w = NULL; + md->current_index[md->current_dim].i = 0; return 0; } @@ -441,12 +422,14 @@ static int _data_action_rb(scf_dfa_t* dfa, scf_vector_t* words, void* data) md->nb_rbs++; md->current_dim--; + scf_logd("md->current_dim: %d, md->current_n: %d\n", md->current_dim, md->current_n); + int i; for (i = md->current_dim + 1; i < md->current_n; i++) { - md->current_index[i].w = NULL; md->current_index[i].i = 0; } + md->current_n--; obj = scf_stack_pop(md->init_objs); @@ -460,8 +443,8 @@ static int _data_action_rb(scf_dfa_t* dfa, scf_vector_t* words, void* data) if (md->nb_rbs == md->nb_lbs) { d->expr_local_flag = 0; - scf_logi("-----------\n\n"); - + scf_logi("----------- type: %d, nb_pointers: %d\n\n", d->current_var->type, d->current_var->nb_pointers); +#if 0 d->current_var->type = obj->type; d->current_var->size = obj->size; d->current_var->data_size = obj->data_size; @@ -469,7 +452,13 @@ static int _data_action_rb(scf_dfa_t* dfa, scf_vector_t* words, void* data) if (_do_data_init(dfa, words, d) < 0) return SCF_DFA_ERROR; +#else + d->current_var->js_type = obj->type; + ret = _do_data_init(parse->ast, d, obj); + if (ret < 0) + return ret; +#endif scf_dfa_del_hook_by_name(&(dfa->hooks[SCF_DFA_HOOK_POST]), "init_data_comma"); } else { w = md->current_index[md->current_dim].w; @@ -527,23 +516,20 @@ static int _data_action_rs(scf_dfa_t* dfa, scf_vector_t* words, void* data) md->current_index[i].i = 0; } + md->current_n--; + scf_stack_pop(md->init_objs); if (md->init_objs->size <= 0) { d->expr_local_flag = 0; - d->current_var->type = obj->type; - d->current_var->size = obj->size; - d->current_var->data_size = obj->data_size; - d->current_var->nb_pointers = obj->nb_pointers; - - assert(d->current_var->nb_dimentions == obj->nb_dimentions); + scf_logi("----------- type: %d, nb_pointers: %d\n\n", d->current_var->type, d->current_var->nb_pointers); - for (i = 0; i < obj->nb_dimentions; i++) - d->current_var->dimentions[i].num = obj->dimentions[i].num; + d->current_var->js_type = obj->type; - if (_do_data_init(dfa, words, d) < 0) - return SCF_DFA_ERROR; + ret = _do_data_init(parse->ast, d, obj); + if (ret < 0) + return ret; scf_dfa_del_hook_by_name(&(dfa->hooks[SCF_DFA_HOOK_POST]), "init_data_rs"); scf_dfa_del_hook_by_name(&(dfa->hooks[SCF_DFA_HOOK_POST]), "init_data_comma"); diff --git a/js/parse/scf_dfa_parse.c b/js/parse/scf_dfa_parse.c index 495c411..2654cee 100644 --- a/js/parse/scf_dfa_parse.c +++ b/js/parse/scf_dfa_parse.c @@ -23,6 +23,7 @@ extern scf_dfa_module_t dfa_module_type; extern scf_dfa_module_t dfa_module_var; extern scf_dfa_module_t dfa_module_function; +extern scf_dfa_module_t dfa_module_function_js; extern scf_dfa_module_t dfa_module_operator; extern scf_dfa_module_t dfa_module_if; @@ -59,6 +60,7 @@ scf_dfa_module_t* dfa_modules[] = &dfa_module_enum, &dfa_module_union, &dfa_module_class, + &dfa_module_function_js, &dfa_module_type, diff --git a/js/parse/scf_dfa_util.h b/js/parse/scf_dfa_util.h index 46801e7..84e0733 100644 --- a/js/parse/scf_dfa_util.h +++ b/js/parse/scf_dfa_util.h @@ -326,4 +326,11 @@ static inline int scf_dfa_is_var(scf_dfa_t* dfa, void* word) return SCF_LEX_WORD_KEY_VAR == w->type; } +static inline int scf_dfa_is_func(scf_dfa_t* dfa, void* word) +{ + scf_lex_word_t* w = word; + + return SCF_LEX_WORD_KEY_FUNC == w->type; +} + #endif diff --git a/js/parse/scf_dfa_var.c b/js/parse/scf_dfa_var.c index 91b88fa..45b7608 100644 --- a/js/parse/scf_dfa_var.c +++ b/js/parse/scf_dfa_var.c @@ -120,6 +120,13 @@ static int _var_add_var(scf_dfa_t* dfa, dfa_data_t* d) return SCF_DFA_ERROR; } + if (SCF_VAR_VAR == id0->type->type) { + id0->nb_pointers = 1; + + if (scf_ast_find_type(&id0->type, parse->ast, "Object") < 0) + return SCF_DFA_ERROR; + } + v = SCF_VAR_ALLOC_BY_TYPE(id->identity, id0->type, id0->const_flag, id0->nb_pointers, id0->func_ptr); if (!v) { scf_loge("alloc var failed\n"); @@ -158,7 +165,6 @@ static int _var_add_var(scf_dfa_t* dfa, dfa_data_t* d) static int _var_init_expr(scf_dfa_t* dfa, dfa_data_t* d, scf_vector_t* words, int semi_flag) { scf_parse_t* parse = dfa->priv; - scf_variable_t* r = NULL; scf_lex_word_t* w = words->data[words->size - 1]; scf_node_t* node0; scf_node_t* node1; @@ -171,21 +177,6 @@ static int _var_init_expr(scf_dfa_t* dfa, dfa_data_t* d, scf_vector_t* words, in assert(d->current_var); - if (SCF_VAR_VAR == d->current_var->type) { - if (scf_expr_calculate(parse->ast, d->expr, &r) < 0) { - scf_loge("\n"); - goto error; - } - - d->current_var->type = r->type; - d->current_var->size = r->size; - d->current_var->data_size = r->data_size; - d->current_var->nb_pointers = r->nb_pointers; - } - - scf_variable_free(r); - r = NULL; - node0 = scf_node_alloc(w, SCF_OP_ASSIGN, NULL); if (!node0) goto error; diff --git a/js/parse/scf_parse.c b/js/parse/scf_parse.c index 6a6d0af..01f76ec 100644 --- a/js/parse/scf_parse.c +++ b/js/parse/scf_parse.c @@ -1902,7 +1902,7 @@ int scf_parse_compile_functions(scf_parse_t* parse, scf_vector_t* functions) } assert(scf_list_empty(&h)); - scf_basic_block_print_list(&f->basic_block_list_head); +// scf_basic_block_print_list(&f->basic_block_list_head); } int ret = scf_optimize(parse->ast, functions); diff --git a/js/parse/scf_parse.h b/js/parse/scf_parse.h index 5b45bb4..aa89b4c 100644 --- a/js/parse/scf_parse.h +++ b/js/parse/scf_parse.h @@ -132,4 +132,15 @@ int scf_parse_link(const char* exec, const char* obj, const char* libjs, const c int _find_global_var(scf_node_t* node, void* arg, scf_vector_t* vec); int _find_function (scf_node_t* node, void* arg, scf_vector_t* vec); +static inline int dfa_index_same(dfa_index_t* di, dfa_index_t* di2) +{ + if (di->w) { + if (di2->w && !strcmp(di->w->text->data, di2->w->text->data)) + return 1; + } else { + if (!di2->w && di->i >= 0 && di->i == di2->i) + return 1; + } + return 0; +} #endif diff --git a/js/parse/scf_struct_array.c b/js/parse/scf_struct_array.c index 8e8c720..4c16cdf 100644 --- a/js/parse/scf_struct_array.c +++ b/js/parse/scf_struct_array.c @@ -369,3 +369,330 @@ int scf_struct_init(scf_ast_t* ast, scf_lex_word_t* w, scf_variable_t* var, scf_ return 0; } + +static int __object_create(scf_expr_t* e, scf_ast_t* ast, scf_lex_word_t* w, scf_variable_t* var, int n_members, scf_type_t* Object, + scf_vector_t* init_exprs, + scf_vector_t* init_pos) +{ + scf_variable_t* v; + scf_block_t* b; + scf_type_t* pt = scf_block_find_type_type(ast->current_block, SCF_FUNCTION_PTR); + scf_node_t* create; + scf_node_t* assign; + scf_node_t* node; + + assign = scf_node_alloc(w, SCF_OP_ASSIGN, NULL); + if (!assign) + return -ENOMEM; + + int ret = scf_expr_add_node(e, assign); + if (ret < 0) { + scf_node_free(assign); + return ret; + } + + b = scf_block_alloc_cstr("multi_rets"); + if (!b) + return -ENOMEM; + + ret = scf_node_add_child((scf_node_t*)b, assign->nodes[0]); + if (ret < 0) + return ret; + assign->nodes[0] = (scf_node_t*)b; + b->node.parent = assign; + + create = scf_node_alloc(w, SCF_OP_CREATE, NULL); + if (!create) + return -ENOMEM; + + // add construct() for obj + v = SCF_VAR_ALLOC_BY_TYPE(Object->w, pt, 1, 1, NULL); + if (!v) { + scf_node_free(create); + return -ENOMEM; + } + v->const_literal_flag = 1; + + node = scf_node_alloc(NULL, v->type, v); + scf_variable_free(v); + v = NULL; + if (!node) { + scf_node_free(create); + return -ENOMEM; + } + + ret = scf_node_add_child(create, node); + if (ret < 0) { + scf_node_free(node); + scf_node_free(create); + return ret; + } + + // add obj name + ret = scf_ast_add_const_str(ast, create, var->w); + if (ret < 0) { + scf_node_free(create); + return ret; + } + + // add obj members + ret = scf_ast_add_const_var(ast, create, SCF_VAR_INT, n_members); + if (ret < 0) { + scf_node_free(create); + return ret; + } + + if (0 == n_members && init_exprs && init_pos) { + dfa_init_expr_t* ie; + dfa_index_t* di; + int i; + int j; + + for (i = 0; i < init_exprs->size; i++) { + ie = init_exprs->data[i]; + + if (ie->n != init_pos->size) { + scf_logw("var: %s, ie->n: %d, init_pos->size: %d\n", var->w->text->data, ie->n, init_pos->size); + continue; + } + + for (j = 0; j < init_pos->size; j++) { + di = init_pos->data[j]; + + if (!dfa_index_same(&ie->index[j], di)) { + scf_logw("var: %s\n", var->w->text->data); + break; + } + } + + if (j >= init_pos->size) { + assert(ie->expr); + + scf_logi("var: %s\n", var->w->text->data); + + ret = scf_node_add_child(create, ie->expr); + if (ret < 0) { + scf_node_free(create); + return ret; + } + + ie->expr = NULL; + assert(0 == scf_vector_del(init_exprs, ie)); + free(ie); + ie = NULL; + break; + } + } + } + + ret = scf_expr_add_node(e, create); + if (ret < 0) { + scf_node_free(create); + return ret; + } + return 0; +} + +#define OBJ_EXPR_ADD_NODE(_e, _node) \ + do { \ + int ret = scf_expr_add_node(_e, _node); \ + if (ret < 0) { \ + scf_node_free(_node); \ + scf_expr_free(_e); \ + return ret; \ + } \ + } while (0) + +static int __object_init(scf_ast_t* ast, scf_expr_t* e, scf_lex_word_t* w, scf_variable_t* var, scf_variable_t* obj, scf_type_t* Object, + scf_variable_t* members, + int array_dim, + scf_vector_t* init_exprs, + scf_vector_t* init_pos) +{ + scf_type_t* t = NULL; + scf_expr_t* e2; + scf_expr_t* e3; + scf_node_t* node; + + int ret = scf_ast_find_type_type(&t, ast, obj->type); + if (ret < 0) + return ret; + + e2 = scf_expr_clone(e); + if (!e2) { + scf_expr_free(e); + return -ENOMEM; + } + + if (array_dim < obj->nb_dimentions) { + scf_logi("var: %s, array_dim: %d, nb_dimentions: %d, num: %d\n", + var->w->text->data, array_dim, obj->nb_dimentions, + obj->dimentions[array_dim].num); + + ret = __object_create(e, ast, w, var, obj->dimentions[array_dim].num, Object, NULL, NULL); + + } else if (t->type >= SCF_STRUCT) { + scf_logd("var: %s\n", var->w->text->data); + ret = __object_create(e, ast, w, var, t->scope->vars->size, Object, NULL, NULL); + } else { + scf_logd("var: %s\n", var->w->text->data); + ret = __object_create(e, ast, w, var, 0, Object, init_exprs, init_pos); + } + if (ret < 0) { + scf_expr_free(e); + scf_expr_free(e2); + return ret; + } + + ret = scf_node_add_child((scf_node_t*)ast->current_block, e); + if (ret < 0) { + scf_expr_free(e); + scf_expr_free(e2); + return ret; + } + e = NULL; + + if (t->type >= SCF_STRUCT || array_dim < obj->nb_dimentions) { + // add -> + node = scf_node_alloc(w, SCF_OP_POINTER, NULL); + if (!node) { + scf_expr_free(e2); + return -ENOMEM; + } + OBJ_EXPR_ADD_NODE(e2, node); + + // add members + node = scf_node_alloc(NULL, members->type, members); + if (!node) { + scf_expr_free(e2); + return -ENOMEM; + } + OBJ_EXPR_ADD_NODE(e2, node); + + int i; + int n; + if (array_dim < obj->nb_dimentions) + n = obj->dimentions[array_dim].num; + else + n = t->scope->vars->size; + + for (i = 0; i < n; i++) { + e3 = scf_expr_clone(e2); + if (!e3) { + scf_expr_free(e2); + return -ENOMEM; + } + + node = scf_node_alloc(w, SCF_OP_ARRAY_INDEX, NULL); + if (!node) { + scf_expr_free(e3); + scf_expr_free(e2); + return -ENOMEM; + } + + ret = scf_expr_add_node(e3, node); + if (ret < 0) { + scf_node_free(node); + scf_expr_free(e3); + scf_expr_free(e2); + return ret; + } + + scf_variable_t* v = NULL; + + if (array_dim < obj->nb_dimentions) + ret = scf_ast_add_const_var(ast, node, SCF_VAR_INT, i); + else { + v = t->scope->vars->data[i]; + ret = scf_ast_add_const_var(ast, node, SCF_VAR_INT, v->js_index); + } + if (ret < 0) { + scf_expr_free(e3); + scf_expr_free(e2); + return ret; + } + + dfa_index_t* di = calloc(1, sizeof(dfa_index_t)); + if (!di) { + scf_expr_free(e3); + scf_expr_free(e2); + return -ENOMEM; + } + + ret = scf_vector_add(init_pos, di); + if (ret < 0) { + free(di); + scf_expr_free(e3); + scf_expr_free(e2); + return ret; + } + + if (v) { + di->w = v->w; + di->i = -1; + scf_logi("i: %d, n: %d\n", i, n); + + ret = __object_init(ast, e3, w, v, v, Object, members, array_dim, init_exprs, init_pos); + } else { + di->w = NULL; + di->i = i; + scf_logi("i: %d, n: %d\n", i, n); + + ret = __object_init(ast, e3, w, var, obj, Object, members, array_dim + 1, init_exprs, init_pos); + } + if (ret < 0) { + scf_expr_free(e2); + return ret; + } + + assert(0 == scf_vector_del(init_pos, di)); + free(di); + di = NULL; + + scf_logi("init_pos->size: %d\n", init_pos->size); + } + } + + scf_expr_free(e2); + e2 = NULL; + return 0; +} + +int scf_object_init(scf_ast_t* ast, scf_lex_word_t* w, scf_variable_t* var, scf_variable_t* obj, scf_vector_t* init_exprs) +{ + scf_vector_t* init_pos; + scf_variable_t* members = NULL; + scf_type_t* Object = NULL; + scf_node_t* node; + scf_expr_t* e; + + int ret = scf_ast_find_type(&Object, ast, "Object"); + if (ret < 0) + return ret; + + members = scf_scope_find_variable(Object->scope, "members"); + if (!members) + return -1; + + e = scf_expr_alloc(); + if (!e) + return -ENOMEM; + + node = scf_node_alloc(NULL, var->type, var); + if (!node) { + scf_expr_free(e); + return -ENOMEM; + } + OBJ_EXPR_ADD_NODE(e, node); + + init_pos = scf_vector_alloc(); + if (!init_pos) { + scf_expr_free(e); + return -ENOMEM; + } + + ret = __object_init(ast, e, w, var, obj, Object, members, 0, init_exprs, init_pos); + + scf_vector_free(init_pos); + return ret; +} diff --git a/ui/Makefile b/ui/Makefile index acc5835..fade274 100644 --- a/ui/Makefile +++ b/ui/Makefile @@ -198,6 +198,7 @@ CFILES += ../js/parse/scf_dfa_type.c CFILES += ../js/parse/scf_dfa_identity.c CFILES += ../js/parse/scf_dfa_function.c +CFILES += ../js/parse/scf_dfa_function_js.c CFILES += ../js/parse/scf_dfa_operator.c CFILES += ../js/parse/scf_dfa_var.c -- 2.25.1