From 4e14d9b0383d96a345da55c3f916e49f5adf6c2e Mon Sep 17 00:00:00 2001 From: "yu.dongliang" <18588496441@163.com> Date: Sat, 27 Jun 2026 10:42:01 +0800 Subject: [PATCH] js: support const function array with const index --- examples/js_array_func.html | 21 +++ js/abc_libjs.so | Bin 137328 -> 136968 bytes js/core/scf_variable.c | 9 +- js/core/scf_variable.h | 5 + js/doc.c | 6 + js/parse/scf_dfa_call.c | 181 +++++++++++++++++++---- js/parse/scf_dfa_expr.c | 8 +- js/parse/scf_dfa_init_data.c | 51 ++++++- js/parse/scf_operator_handler_expr.c | 29 ++-- js/parse/scf_operator_handler_semantic.c | 23 +-- js/parse/scf_operator_handler_semantic.h | 1 - 11 files changed, 276 insertions(+), 58 deletions(-) create mode 100644 examples/js_array_func.html diff --git a/examples/js_array_func.html b/examples/js_array_func.html new file mode 100644 index 0000000..a255ccf --- /dev/null +++ b/examples/js_array_func.html @@ -0,0 +1,21 @@ + + + + +

含有javascript的页面

+ +

含有js的页面

+ + + + + diff --git a/js/abc_libjs.so b/js/abc_libjs.so index 41cb04229299873b80d908997fabfdbde5a3b993..b48ed9ea0730dbe663f35e6eb65884fe72a2e158 100755 GIT binary patch delta 37839 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 delta 38883 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 VJfxkXAK8Sfl2mpYiH@L||GzK~N)`YB diff --git a/js/core/scf_variable.c b/js/core/scf_variable.c index cc8935f..39ba592 100644 --- a/js/core/scf_variable.c +++ b/js/core/scf_variable.c @@ -379,10 +379,13 @@ int scf_variable_same_type(scf_variable_t* v0, scf_variable_t* v1) } if (SCF_FUNCTION_PTR == v0->type) { - assert(v0->func_ptr); - assert(v1->func_ptr); + if (!v0->func_ptr) + assert(v0->arg_flag); - if (!scf_function_same_type(v0->func_ptr, v1->func_ptr)) + else if (!v1->func_ptr) + assert(v1->arg_flag); + + else if (!scf_function_same_type(v0->func_ptr, v1->func_ptr)) return 0; } } else { diff --git a/js/core/scf_variable.h b/js/core/scf_variable.h index b6a57eb..1197f94 100644 --- a/js/core/scf_variable.h +++ b/js/core/scf_variable.h @@ -7,6 +7,8 @@ typedef struct { scf_expr_t* vla; // variable length array int num; // const length array + + scf_vector_t* vars; } scf_dimention_t; struct scf_variable_s { @@ -67,6 +69,9 @@ struct scf_variable_s { scf_string_t* signature; + scf_dimention_t* js_dimentions; // this var point to a js array + int js_nb_dimentions; + uint32_t const_literal_flag:1; uint32_t const_flag :1; uint32_t static_flag :1; diff --git a/js/doc.c b/js/doc.c index f8ea145..2f46d82 100644 --- a/js/doc.c +++ b/js/doc.c @@ -132,6 +132,12 @@ struct Object return 0; } + int __init(Object* this, const char* name, int length, const funcptr* f) + { + printf("this: %p, f: %p\n", this, f); + return 0; + } + int __init(Object* this, const char* name, int length, const char* s) { printf("this: %p, name: %s\n", this, name); diff --git a/js/parse/scf_dfa_call.c b/js/parse/scf_dfa_call.c index 47b0754..4779ac0 100644 --- a/js/parse/scf_dfa_call.c +++ b/js/parse/scf_dfa_call.c @@ -125,10 +125,6 @@ static int _call_action_lp(scf_dfa_t* dfa, scf_vector_t* words, void* data) scf_stack_pop(d->current_identities); free(id); id = NULL; - } else { - // f()(), function f should return a function pointer - scf_logw("\n"); -// return SCF_DFA_ERROR; } node_call = scf_node_alloc(w1, SCF_OP_CALL, NULL); @@ -383,6 +379,74 @@ int _call_add_obj(scf_ast_t* ast, scf_lex_word_t* w, scf_node_t* call, scf_expr_ return 0; } +static int _call_get_func(scf_function_t** pf, scf_node_t* array, scf_vector_t* indexes) +{ + scf_variable_t* base = _scf_operand_get(array); + scf_variable_t* v; + int i; + int j; + + if (indexes) { + for (i = indexes->size - 1; i >= 0; i--) { + v = indexes->data[i]; + j = v->data.i64; + + if (!base->js_dimentions + || base->js_nb_dimentions <= 0 + || base->js_dimentions[0].num <= j) + return -EINVAL; + + if (!base->js_dimentions[0].vars || j >= base->js_dimentions[0].vars->size) + return -EINVAL; + + base = base->js_dimentions[0].vars->data[j]; + if (!base) + return -EINVAL; + } + } + + if (SCF_FUNCTION_PTR == base->type) { + + if (!base->const_literal_flag || !base->func_ptr) { + scf_loge("function obj '%s' is not const\n", base->w->text->data); + return -EINVAL; + } + + *pf = base->func_ptr; + } + + return 0; +} + +static int _call_use_func(scf_ast_t* ast, scf_node_t* call, scf_function_t* f) +{ + scf_variable_t* v; + scf_node_t* pf; + scf_expr_t* e; + scf_type_t* t = NULL; + + int ret = scf_ast_find_type_type(&t, ast, SCF_FUNCTION_PTR); + if (ret < 0) + return ret; + + v = SCF_VAR_ALLOC_BY_TYPE(f->node.w, t, 1, 1, f); + if (!v) + return -ENOMEM; + v->const_literal_flag = 1; + + pf = scf_node_alloc(NULL, v->type, v); + scf_variable_free(v); + v = NULL; + if (!pf) + return -ENOMEM; + + scf_node_free(call->nodes[0]); + call->nodes[0] = pf; + + pf->parent = call; + return 0; +} + static int _call_action_rp(scf_dfa_t* dfa, scf_vector_t* words, void* data) { if (words->size < 2) { @@ -425,37 +489,84 @@ static int _call_action_rp(scf_dfa_t* dfa, scf_vector_t* words, void* data) scf_expr_add_node(cd->parent_expr, cd->call); } else { - scf_node_add_child(cd->call, cd->func); + if (cd->func) + scf_node_add_child(cd->call, cd->func); } - scf_variable_t* r; - scf_function_t* f = NULL; - scf_type_t* Object = NULL; - scf_node_t* pf = cd->call->nodes[0]; + scf_variable_t* base; + scf_variable_t* index; + scf_function_t* f; + scf_vector_t* indexes = NULL; + scf_type_t* Object = NULL; + scf_node_t* pf = cd->call->nodes[0]; scf_expr_t* e; + scf_type_t* t; - while (SCF_OP_EXPR == pf->type) - pf = pf->nodes[0]; + int ret; - if (SCF_OP_POINTER == pf->type) - pf = pf->nodes[1]; + while (1) { + if (SCF_OP_EXPR == pf->type) + pf = pf->nodes[0]; - int ret = scf_ast_find_type(&Object, ast, "Object"); + else if (SCF_OP_POINTER == pf->type) { + pf = pf->nodes[1]; + break; + + } else if (SCF_OP_ARRAY_INDEX == pf->type) { + index = NULL; + + ret = scf_expr_calculate(ast, pf->nodes[1], &index); + if (ret < 0) + goto error; + + if (!scf_variable_const_integer(index)) { + scf_loge("\n"); + + scf_variable_free(index); + ret = -EINVAL; + goto error; + } + + if (!indexes) { + indexes = scf_vector_alloc(); + + if (!indexes) { + scf_variable_free(index); + ret = -ENOMEM; + goto error; + } + } + + ret = scf_vector_add(indexes, index); + if (ret < 0) { + scf_variable_free(index); + goto error; + } + + pf = pf->nodes[0]; + } else + break; + } + + f = NULL; + ret = _call_get_func(&f, pf, indexes); if (ret < 0) - return ret; + goto error; + + ret = scf_ast_find_type(&Object, ast, "Object"); + if (ret < 0) + goto error; int js_flag = 1; int timer_flag = 0; - if (SCF_FUNCTION_PTR == pf->type) { - f = pf->var->func_ptr; - + if (f) { js_flag = f->js_flag; if (!strcmp(f->node.w->text->data, "setTimeout")) timer_flag = 1; - scf_logd("f: %s, f->js_flag: %d, timer_flag: %d\n", f->node.w->text->data, f->js_flag, timer_flag); + scf_logi("f: %s, f->js_flag: %d, timer_flag: %d\n", f->node.w->text->data, f->js_flag, timer_flag); } else assert(Object->node.type == pf->type); @@ -468,7 +579,7 @@ static int _call_action_rp(scf_dfa_t* dfa, scf_vector_t* words, void* data) { ret = _call_add_obj(ast, w, cd->call, e, Object); if (ret < 0) - return ret; + goto error; } scf_node_add_child(cd->call, e); @@ -484,7 +595,7 @@ static int _call_action_rp(scf_dfa_t* dfa, scf_vector_t* words, void* data) { ret = _call_add_obj(ast, w, cd->call, d->expr, Object); if (ret < 0) - return ret; + goto error; } scf_node_add_child(cd->call, d->expr); @@ -493,8 +604,10 @@ static int _call_action_rp(scf_dfa_t* dfa, scf_vector_t* words, void* data) if (js_flag || timer_flag) { e = scf_expr_alloc(); - if (!e) - return -ENOMEM; + if (!e) { + ret = -ENOMEM; + goto error; + } if (js_flag) ret = _call_add_arguments(ast, w, cd->call->nb_nodes - 1, e, Object); @@ -502,13 +615,13 @@ static int _call_action_rp(scf_dfa_t* dfa, scf_vector_t* words, void* data) ret = scf_ast_add_const_var(ast, e, SCF_VAR_INT, cd->call->nb_nodes - 3); if (ret < 0) { scf_expr_free(e); - return ret; + goto error; } ret = scf_node_add_child(cd->call, e); if (ret < 0) { scf_expr_free(e); - return ret; + goto error; } int i; @@ -519,6 +632,12 @@ static int _call_action_rp(scf_dfa_t* dfa, scf_vector_t* words, void* data) e = NULL; } + if (indexes) { + ret = _call_use_func(ast, cd->call, f); + if (ret < 0) + goto error; + } + if (cd->parent_expr) d->expr = cd->parent_expr; else @@ -526,10 +645,16 @@ static int _call_action_rp(scf_dfa_t* dfa, scf_vector_t* words, void* data) assert(--d->expr_local_flag >= 0); - free(cd); - cd = NULL; + ret = SCF_DFA_NEXT_WORD; - return SCF_DFA_NEXT_WORD; +error: + if (indexes) { + scf_vector_clear(indexes, ( void (*)(void*) ) scf_variable_free); + scf_vector_free (indexes); + } + + free(cd); + return ret; } static int _call_action_comma(scf_dfa_t* dfa, scf_vector_t* words, void* data) diff --git a/js/parse/scf_dfa_expr.c b/js/parse/scf_dfa_expr.c index 5b4d206..083c160 100644 --- a/js/parse/scf_dfa_expr.c +++ b/js/parse/scf_dfa_expr.c @@ -182,7 +182,8 @@ int _expr_add_var(scf_parse_t* parse, dfa_data_t* d) d->current_function->vargs_flag = 1; } - 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); + scf_logi("var: %s: %p, var->dimentions: %p, nb_dimentions: %d, member_flag: %d, js_type: %d, line: %d, pos: %d\n", + var->w->text->data, var, var->dimentions, var->nb_dimentions, var->member_flag, var->js_type, var->w->line, var->w->pos); if (md->current_var && md->current_var->js_type >= 0 @@ -736,6 +737,8 @@ static int _expr_action_ls(scf_dfa_t* dfa, scf_vector_t* words, void* data) if (scf_ast_find_type(&t, parse->ast, "Object") < 0) return SCF_DFA_ERROR; + scf_logi("-------- md->current_var: %s\n", md->current_var->w->text->data); + v = scf_scope_find_variable(t->scope, "members"); if (!v) { scf_logw("var 'members' not found in struct '%s'\n", t->name->data); @@ -1191,8 +1194,9 @@ static int _dfa_init_syntax_expr(scf_dfa_t* dfa) scf_dfa_node_add_child(expr, rs); scf_dfa_node_add_child(ls, rs); scf_dfa_node_add_child(rs, ls); - scf_dfa_node_add_child(rs, binary_op); + scf_dfa_node_add_child(rs, call_lp); + scf_dfa_node_add_child(rs, binary_op); scf_dfa_node_add_child(rs, unary_post); scf_dfa_node_add_child(rs, rp); scf_dfa_node_add_child(identity, unary_post); diff --git a/js/parse/scf_dfa_init_data.c b/js/parse/scf_dfa_init_data.c index 8d61fbe..5021949 100644 --- a/js/parse/scf_dfa_init_data.c +++ b/js/parse/scf_dfa_init_data.c @@ -39,8 +39,12 @@ static int _do_data_init(scf_ast_t* ast, dfa_data_t* d, scf_variable_t* obj) init_module_data_t* md = d->module_datas[dfa_module_init_data.index]; dfa_init_expr_t* ie; int i; + int ret = 0; - int ret = scf_object_init(ast, md->assign, d->current_var, obj, md->init_exprs); + if (SCF_FUNCTION_PTR != obj->type) { + + 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]; @@ -50,6 +54,12 @@ static int _do_data_init(scf_ast_t* ast, dfa_data_t* d, scf_variable_t* obj) ie = NULL; } + d->current_var->js_dimentions = obj->dimentions; + d->current_var->js_nb_dimentions = obj->nb_dimentions; + + obj->dimentions = NULL; + obj->nb_dimentions = 0; + md->assign = NULL; scf_vector_free(md->init_exprs); @@ -125,7 +135,10 @@ 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; + + v->member_flag = 1; + v->const_flag = r->const_flag; + v->const_literal_flag = r->const_literal_flag; if (r->nb_dimentions > 0) { v->nb_dimentions = r->nb_dimentions; @@ -159,6 +172,7 @@ static int _add_array_member(scf_ast_t* ast, dfa_data_t* d, scf_variable_t* r) init_module_data_t* md = d->module_datas[dfa_module_init_data.index]; scf_lex_word_t* w; scf_variable_t* obj = scf_stack_top(md->init_objs); + scf_variable_t* v; if (!r) { int ret = scf_expr_calculate(ast, d->expr, &r); @@ -180,6 +194,12 @@ static int _add_array_member(scf_ast_t* ast, dfa_data_t* d, scf_variable_t* r) return -ENOMEM; } + obj->dimentions[0].vars = scf_vector_alloc(); + if (!obj->dimentions[0].vars) { + scf_variable_free(r); + return -ENOMEM; + } + obj->dimentions[0].num = 1; } else obj->dimentions[0].num++; @@ -191,11 +211,30 @@ static int _add_array_member(scf_ast_t* ast, dfa_data_t* d, scf_variable_t* r) if (obj->dimentions[i + 1].num < r->dimentions[i].num) obj->dimentions[i + 1].num = r->dimentions[i].num; - scf_logi("obj: %p, obj->dimentions[%d].num: %d\n", obj, i + 1, obj->dimentions[i + 1].num); + scf_logi("obj: %p, obj->dimentions[%d].num: %d, r->dimentions[%d].num: %d\n", + obj, i + 1, obj->dimentions[i + 1].num, + i, r->dimentions[i].num); } + v = scf_variable_clone(r); + scf_variable_free(r); r = NULL; + if (!v) + return -ENOMEM; + + int ret = scf_vector_add(obj->dimentions[0].vars, v); + if (ret < 0) { + scf_variable_free(v); + return ret; + } + + if (v && SCF_FUNCTION_PTR == v->type && v->func_ptr) { + scf_function_t* f = v->func_ptr; + + scf_loge("%s()\n", f->node.w->text->data); + } + #if 0 if (d->current_var->nb_dimentions < md->current_n) { @@ -626,9 +665,11 @@ static int _data_action_rs(scf_dfa_t* dfa, scf_vector_t* words, void* data) if (md->init_objs->size <= 0) { d->expr_local_flag = 0; - scf_logi("----------- type: %d, nb_pointers: %d\n\n", d->current_var->type, d->current_var->nb_pointers); + if (obj->type >= SCF_STRUCT) + d->current_var->js_type = obj->type; - d->current_var->js_type = obj->type; + scf_logi("----------- type: %d, js_type: %d, SCF_FUNCTION_PTR: %d, nb_pointers: %d\n\n", + d->current_var->type, d->current_var->js_type, SCF_FUNCTION_PTR, d->current_var->nb_pointers); ret = _do_data_init(parse->ast, d, obj); if (ret < 0) diff --git a/js/parse/scf_operator_handler_expr.c b/js/parse/scf_operator_handler_expr.c index d5f6437..db0ef5a 100644 --- a/js/parse/scf_operator_handler_expr.c +++ b/js/parse/scf_operator_handler_expr.c @@ -706,24 +706,33 @@ scf_operator_handler_pt scf_find_expr_operator_handler(const int type) int scf_expr_calculate(scf_ast_t* ast, scf_expr_t* e, scf_variable_t** pret) { - if (!e || !e->nodes || e->nb_nodes <= 0) - return -1; + if (!e) + return -EINVAL; - if (scf_expr_semantic_analysis(ast, e) < 0) - return -1; + scf_handler_data_t d = {0}; + scf_variable_t* v; + + int ret = scf_expr_semantic_analysis(ast, e); + if (ret < 0) + return ret; - scf_handler_data_t d = {0}; - scf_variable_t* v; + scf_node_t* node = e; - if (!scf_type_is_var(e->nodes[0]->type)) { + if (SCF_OP_EXPR == e->type) { - if (_scf_expr_calculate_internal(ast, e->nodes[0], &d) < 0) { + if (!e->nodes || e->nb_nodes != 1) { scf_loge("\n"); - return -1; + return -EINVAL; } + + node = e->nodes[0]; } - v = _scf_operand_get(e->nodes[0]); + ret = _scf_expr_calculate_internal(ast, node, &d); + if (ret < 0) + return ret; + + v = _scf_operand_get(node); if (pret) *pret = scf_variable_ref(v); diff --git a/js/parse/scf_operator_handler_semantic.c b/js/parse/scf_operator_handler_semantic.c index 5742ece..a9d32a2 100644 --- a/js/parse/scf_operator_handler_semantic.c +++ b/js/parse/scf_operator_handler_semantic.c @@ -2873,7 +2873,7 @@ static int _semantic_multi_rets_assign(scf_ast_t* ast, scf_node_t** nodes, int n scf_variable_t* v1 = _scf_operand_get(call->result_nodes->data[i]); if (!scf_variable_same_type(v0, v1)) { - scf_loge("\n"); + scf_loge("i: %d\n", i); return -1; } @@ -3565,17 +3565,22 @@ int scf_expr_semantic_analysis(scf_ast_t* ast, scf_expr_t* e) { scf_handler_data_t d = {0}; - if (!e->nodes || e->nb_nodes != 1) { - scf_loge("\n"); - return -1; - } + scf_node_t* node = e; - int ret = _scf_expr_calculate_internal(ast, e->nodes[0], &d); - if (ret < 0) { - scf_loge("\n"); - return -1; + if (SCF_OP_EXPR == e->type) { + + if (!e->nodes || e->nb_nodes != 1) { + scf_loge("\n"); + return -EINVAL; + } + + node = e->nodes[0]; } + int ret = _scf_expr_calculate_internal(ast, node, &d); + if (ret < 0) + return ret; + return 0; } diff --git a/js/parse/scf_operator_handler_semantic.h b/js/parse/scf_operator_handler_semantic.h index 92ab2e8..25f1710 100644 --- a/js/parse/scf_operator_handler_semantic.h +++ b/js/parse/scf_operator_handler_semantic.h @@ -12,4 +12,3 @@ int scf_expr_semantic_analysis(scf_ast_t* ast, scf_expr_t* e); int scf_semantic_analysis(scf_ast_t* ast); #endif - -- 2.25.1