re-name key word 'create' to 'new'
authoryu.dongliang <18588496441@163.com>
Sat, 11 Oct 2025 08:08:29 +0000 (16:08 +0800)
committeryu.dongliang <18588496441@163.com>
Sat, 11 Oct 2025 08:08:29 +0000 (16:08 +0800)
27 files changed:
core/scf_basic_block.c
core/scf_core_types.h
core/scf_dag.c
core/scf_lex_word.h
core/scf_operator.c
core/scf_operator_handler_3ac.c
core/scf_optimizer.c
core/scf_optimizer_auto_gc.c
core/scf_optimizer_auto_gc_find.c
core/scf_pointer_alias.c
examples/auto_gc_1.c
examples/complex.c
examples/mat.c
examples/ret2_err.c
examples/str.c
examples/string.c
lex/scf_lex.c
lib/scf_complex.c
lib/scf_string.c
parse/Makefile
parse/scf_dfa_call.c
parse/scf_dfa_create.c [deleted file]
parse/scf_dfa_expr.c
parse/scf_dfa_new.c [new file with mode: 0644]
parse/scf_dfa_parse.c
parse/scf_operator_handler_const.c
parse/scf_operator_handler_semantic.c

index b38a2dd2045baedd73a8c0ae0ef459eaa8e7514c..55a642619edc8e1b1fb22205ff72943da1c32345 100644 (file)
@@ -1132,8 +1132,9 @@ int scf_basic_block_active_vars(scf_basic_block_t* bb)
        }
 #endif
 
-       scf_vector_clear(bb->entry_dn_actives, NULL);
-       scf_vector_clear(bb->dn_updateds,      NULL);
+       scf_vector_clear(bb->entry_dn_actives,   NULL);
+       scf_vector_clear(bb->entry_dn_inactives, NULL);
+       scf_vector_clear(bb->dn_updateds,        NULL);
 
        if (!scf_list_empty(&bb->code_list_head)) {
 
@@ -1319,6 +1320,9 @@ int scf_basic_block_loads_saves(scf_basic_block_t* bb, scf_list_t* bb_list_head)
        int ret;
        int i;
 
+       scf_vector_clear(bb->dn_loads, NULL);
+       scf_vector_clear(bb->dn_saves, NULL);
+
        for (i = 0; i < bb->entry_dn_actives->size; i++) {
                dn =        bb->entry_dn_actives->data[i];
 
index 0f66624527800ff24a39cbf8726ce6253fd52d49..960b494f2d071a20466d76175d73ad485f10dc91 100644 (file)
@@ -87,7 +87,7 @@ enum scf_core_types
        SCF_OP_CALL,            // () function call
        SCF_OP_TYPE_CAST,       // (char*) type cast
 
-       SCF_OP_CREATE,      // create
+       SCF_OP_NEW,             // new class object
        SCF_OP_SIZEOF,      // sizeof
 
        SCF_OP_CONTAINER,   // container_of
index eb0438aad2626bb18a2f5c62e952ac0ab85085c0..67e483c6ba3624bac3fe1cf348dae82d2e17b720 100644 (file)
@@ -548,7 +548,7 @@ int scf_dag_node_same(scf_dag_node_t* dn, const scf_node_t* node)
                scf_logd("dag   type: %d, node: %#lx, var: %#lx\n", dn->type, 0xffff & (uintptr_t)dn, 0xffff & (uintptr_t)dn->var);
        }
 
-       if (SCF_OP_CREATE == node->type)
+       if (SCF_OP_NEW == node->type)
                node = node->result_nodes->data[0];
 
        if (dn->type != node->type)
index d37a758eb9dee27fcb7fb20ff94631edf6633d33..543aae6dff3643a27bdc8c7bb44c2e57e1fcd62a 100644 (file)
@@ -60,7 +60,7 @@ enum scf_lex_words
        SCF_LEX_WORD_RA,            // >> right angle brackets
 
        SCF_LEX_WORD_KEY_SIZEOF,    // sizeof
-       SCF_LEX_WORD_KEY_CREATE,    // create class object
+       SCF_LEX_WORD_KEY_NEW,       // create class object
        SCF_LEX_WORD_KEY_CONTAINER, // container_of
        SCF_LEX_WORD_KEY_VA_ARG,    // va_arg
 
index 69351e8a7929952484ad7e2a408273b088bd0b79..270bde422236914ce3390988881f9d17abd697f1 100644 (file)
@@ -15,7 +15,7 @@ static scf_operator_t base_operators[] =
        {"va_end",    NULL,   SCF_OP_VA_END,        1,  1,  SCF_OP_ASSOCIATIVITY_LEFT},
        {"container", NULL,   SCF_OP_CONTAINER,     1,  3,  SCF_OP_ASSOCIATIVITY_LEFT},
 
-       {"create",    NULL,   SCF_OP_CREATE,        2, -1,  SCF_OP_ASSOCIATIVITY_RIGHT},
+       {"new",       NULL,   SCF_OP_NEW,           2, -1,  SCF_OP_ASSOCIATIVITY_RIGHT},
        {"(",         NULL,   SCF_OP_TYPE_CAST,     2,  2,  SCF_OP_ASSOCIATIVITY_RIGHT},
        {"!",         "not",  SCF_OP_LOGIC_NOT,     2,  1,  SCF_OP_ASSOCIATIVITY_RIGHT},
        {"~",         "bnot", SCF_OP_BIT_NOT,       2,  1,  SCF_OP_ASSOCIATIVITY_RIGHT},
index c03304966a10fcd00930619a081e06c55297d602..7ed9cb1f40322248ee111ac8f99fafafda89b10f 100644 (file)
@@ -96,7 +96,7 @@ static int _scf_expr_calculate_internal(scf_ast_t* ast, scf_node_t* node, void*
                return h(ast, node->nodes, node->nb_nodes, d);
 
        } else {
-               if (!scf_type_is_assign(node->op->type) && SCF_OP_ADDRESS_OF != node->op->type && SCF_OP_CREATE != node->op->type) {
+               if (!scf_type_is_assign(node->op->type) && SCF_OP_ADDRESS_OF != node->op->type && SCF_OP_NEW != node->op->type) {
 
                        for (i = node->nb_nodes - 1; i >= 0; i--) {
                                if (_scf_expr_calculate_internal(ast, node->nodes[i], d) < 0) {
@@ -1425,7 +1425,7 @@ int scf_function_to_3ac(scf_ast_t* ast, scf_function_t* f, scf_list_t* _3ac_list
        return 0;
 }
 
-static int _scf_op_create(scf_ast_t* ast, scf_node_t** nodes, int nb_nodes, void* data)
+static int _scf_op_new(scf_ast_t* ast, scf_node_t** nodes, int nb_nodes, void* data)
 {
        assert(nb_nodes > 0);
 
@@ -2391,7 +2391,7 @@ scf_operator_handler_pt  __operator_handlers[SCF_N_3AC_OPS] =
 {
        [SCF_OP_EXPR  ]       = _scf_op_expr,
        [SCF_OP_CALL  ]       = _scf_op_call,
-       [SCF_OP_CREATE]       = _scf_op_create,
+       [SCF_OP_NEW   ]       = _scf_op_new,
 
        [SCF_OP_ARRAY_INDEX]  = _scf_op_array_index,
        [SCF_OP_POINTER    ]  = _scf_op_pointer,
index 79fd61caa1bf84caae66354de00a90afc56c86f7..d8e5da4d9caffd26113f25fa7b19b81accc8ccb4 100644 (file)
@@ -54,6 +54,9 @@ static scf_optimizer_t*  scf_optimizers[] =
        &scf_optimizer_basic_block,
        &scf_optimizer_const_teq,
 
+       &scf_optimizer_active_vars,
+       &scf_optimizer_loads_saves,
+
        &scf_optimizer_dominators,
        &scf_optimizer_loop,
        &scf_optimizer_vla,
index 2b1ab068cd228a9266a5f5fb50f6b2d462456af8..bdc2a9349c2ef6905058e4cca090a8649e6e6bc7 100644 (file)
@@ -743,7 +743,7 @@ static int _auto_gc_retval(scf_dn_status_t* ds_obj, scf_dag_node_t* dn, scf_vect
        if (dn->node->split_flag) {
                parent = dn->node->split_parent;
 
-               assert(SCF_OP_CALL == parent->type || SCF_OP_CREATE == parent->type);
+               assert(SCF_OP_CALL == parent->type || SCF_OP_NEW == parent->type);
 
                for (i = 0; i < parent->result_nodes->size; i++) {
                        result    = parent->result_nodes->data[i];
index f1c9ef89a3c6e8ef2d4f74333af691ab5b96b3cd..5b0ea3dcb72f32e51cae9ebb6830ec4cc92969e3 100644 (file)
@@ -479,7 +479,7 @@ static int _auto_gc_find_ref(scf_dn_status_t* ds_obj, scf_dag_node_t* dn, scf_3a
                if (dn->node->split_flag) {
                        parent = dn->node->split_parent;
 
-                       assert(SCF_OP_CALL == parent->type || SCF_OP_CREATE == parent->type);
+                       assert(SCF_OP_CALL == parent->type || SCF_OP_NEW == parent->type);
 
                        for (i = 0; i < parent->result_nodes->size; i++) {
                                result    = parent->result_nodes->data[i];
index 2232ac77d5b59d2efc5f5f3ba002eaecb0e3e2ff..fde6de772471051699610c283a8be5b6db218c01 100644 (file)
@@ -143,7 +143,7 @@ static int _bb_pointer_initeds(scf_vector_t* initeds, scf_list_t* bb_list_head,
                        scf_logd("dn->node->split_parent: %d, %p\n", dn->node->split_parent->type, dn->node->split_parent);
 
                        assert(dn->node->split_parent->type == SCF_OP_CALL
-                               || dn->node->split_parent->type == SCF_OP_CREATE);
+                               || dn->node->split_parent->type == SCF_OP_NEW);
                        return 0;
                }
 
@@ -242,7 +242,7 @@ static int _bb_pointer_initeds_leak(scf_vector_t* initeds, scf_list_t* bb_list_h
 
                if (dn->node->split_flag) {
                        assert(dn->node->split_parent->type == SCF_OP_CALL
-                               || dn->node->split_parent->type == SCF_OP_CREATE);
+                               || dn->node->split_parent->type == SCF_OP_NEW);
                        return 0;
                }
 
index 9edd1a408d1bbe561990a6cc7d6ff0e9cbe82e6e..f7ad54821249f29762c989507403b09cc3deab15 100644 (file)
@@ -12,7 +12,7 @@ struct Object
 
        Object* operator+(Object* this, Object* that)
        {
-               Object* res = create Object(this->d + that->d);
+               Object* res = new Object(this->d + that->d);
                return res;
        }
 };
@@ -24,8 +24,8 @@ Object* add(Object* x, Object* y)
 
 int main()
 {
-       Object* a = create Object(1.1);
-       Object* b = create Object(2.2);
+       Object* a = new Object(1.1);
+       Object* b = new Object(2.2);
 
        Object* c = add(a, b);
 
index 0eb87764715c0b1ec3996e5d95a933c35d008720..1f551580f38b2888fbad5de678b0b993ea5620ce 100644 (file)
@@ -7,9 +7,9 @@ int main()
        complex* c2;
        complex* c3;
 
-       complex* c0 = create complex(1.0, 2.0);
+       complex* c0 = new complex(1.0, 2.0);
 
-       c1 = create complex(3.0, 4.0);
+       c1 = new complex(3.0, 4.0);
 
        c2 = c0 + c1;
        c3 = c0 * c1;
index aa4f5ef6a0695769dd7ef69babe3ec43bbb35e44..2db49a042eebfce89e360d5d9ec93576e3e0a9b2 100644 (file)
@@ -70,7 +70,7 @@ struct mat
        {
                mat* res;
 
-               res = create mat(MAT_TYPE_DOUBLE, NULL, this->depth, this->width, this->height, this->count);
+               res = new mat(MAT_TYPE_DOUBLE, NULL, this->depth, this->width, this->height, this->count);
                if (!res)
                        return NULL, -1;
 
@@ -144,9 +144,9 @@ int main()
        mat* m3;
        mat* m4;
 
-       m0 = create mat(MAT_TYPE_DOUBLE, (uint8_t*)a, 1, 2, 2, 1);
-       m1 = create mat(MAT_TYPE_DOUBLE, (uint8_t*)b, 1, 2, 2, 1);
-       m2 = create mat(MAT_TYPE_DOUBLE, (uint8_t*)c, 1, 2, 2, 1);
+       m0 = new mat(MAT_TYPE_DOUBLE, (uint8_t*)a, 1, 2, 2, 1);
+       m1 = new mat(MAT_TYPE_DOUBLE, (uint8_t*)b, 1, 2, 2, 1);
+       m2 = new mat(MAT_TYPE_DOUBLE, (uint8_t*)c, 1, 2, 2, 1);
 
        m3 = m0 + m1 + m2;
 
index cdc12ce94bf4b0ea3da42799d2982858ec312259..63a451223a28ce7abbbaadf993b020e5a2aaccdd 100644 (file)
@@ -33,7 +33,7 @@ int main()
        str* p0;
        int  err;
 
-       p0, err = create str();
+       p0, err = new str();
        if (err < 0)
                return -1;
 
index d9a0ff0c2bca730ec1c1247e7dde0545e9dffd6c..978f9d0a4101d1789d524971b363c420aff8e932 100644 (file)
@@ -31,7 +31,7 @@ int main()
        str* p0;
        str* p1;
 
-       p0 = create str();
+       p0 = new str();
        p1 = p0;
 
        printf("%s\n", p1->data);
index 081733eaf904510d3ab6564c4c71190b13c71bae..9262554ab470e131407a61bf0cf9f54707d941de 100644 (file)
@@ -78,7 +78,7 @@ struct string
        {
                string* s;
 
-               s = create string();
+               s = new string();
                if (!s)
                        return NULL, -1;
 
index abd4f23f9f3b86cdb12b54928e6e88e44ff85b1e..923b543c27df94bb4c095ab9a58679a62a4b6364 100644 (file)
@@ -23,7 +23,7 @@ static scf_key_word_t  key_words[] =
 
        {"sizeof",    SCF_LEX_WORD_KEY_SIZEOF},
 
-       {"create",    SCF_LEX_WORD_KEY_CREATE},
+       {"new",       SCF_LEX_WORD_KEY_NEW},
 
        {"operator",  SCF_LEX_WORD_KEY_OPERATOR},
 
index 86ac0e6ea623a7a5284db4d2b1f12192070864b6..c07e5efe6390ca83807bb3a26c6b269720473bad 100644 (file)
@@ -69,7 +69,7 @@ struct complex
 
                complex* res;
 
-               res = create complex(0.0, 0.0);
+               res = new complex(0.0, 0.0);
                if (!res)
                        return NULL, -1;
 
@@ -85,7 +85,7 @@ struct complex
 
                complex* res;
 
-               res = create complex(0.0, 0.0);
+               res = new complex(0.0, 0.0);
                if (!res)
                        return NULL, -1;
 
@@ -101,7 +101,7 @@ struct complex
 
                complex* res;
 
-               res = create complex(0.0, 0.0);
+               res = new complex(0.0, 0.0);
                if (!res)
                        return NULL, -1;
 
@@ -122,7 +122,7 @@ struct complex
 
                complex* res;
 
-               res = create complex(0.0, 0.0);
+               res = new complex(0.0, 0.0);
                if (!res)
                        return NULL, -1;
 
@@ -136,5 +136,3 @@ struct complex
                return res, 0;
        }
 };
-
-
index c45c34f6b1411fef05cc6fb09d6459e11d924a9d..a072f627abd1a0ce8f0d416889b096913ddcfd6c 100644 (file)
@@ -96,7 +96,7 @@ struct string
        {
                string* s;
 
-               s = create string();
+               s = new string();
                if (!s)
                        return NULL, -1;
 
@@ -133,4 +133,3 @@ struct string
                        scf__auto_freep(&this->data, NULL);
        }
 };
-
index 7cb3b8f6a40004d4694183df68c493c1d90ff68f..fdc5dcc04829f877e978caf57b7a05c8fb240222 100644 (file)
@@ -131,7 +131,7 @@ CFILES += scf_dfa_macro.c
 CFILES += scf_dfa_include.c
 
 CFILES += scf_dfa_call.c
-CFILES += scf_dfa_create.c
+CFILES += scf_dfa_new.c
 CFILES += scf_dfa_sizeof.c
 CFILES += scf_dfa_container.c
 CFILES += scf_dfa_va_arg.c
index ad27a5df2cc3648e5b71db31f26ef9f7bb7f4dd8..0c9c5f84201ee01ecb9a438c432c81fb7c6be6f1 100644 (file)
@@ -295,22 +295,22 @@ static int _dfa_init_syntax_call(scf_dfa_t* dfa)
 
        SCF_DFA_GET_MODULE_NODE(dfa, expr,   entry,    expr);
 
-       SCF_DFA_GET_MODULE_NODE(dfa, create, create,   create);
-       SCF_DFA_GET_MODULE_NODE(dfa, create, identity, create_id);
-       SCF_DFA_GET_MODULE_NODE(dfa, create, rp,       create_rp);
+       SCF_DFA_GET_MODULE_NODE(dfa, new,    new,      new);
+       SCF_DFA_GET_MODULE_NODE(dfa, new,    identity, new_id);
+       SCF_DFA_GET_MODULE_NODE(dfa, new,    rp,       new_rp);
 
        // no args
        scf_dfa_node_add_child(lp,       rp);
 
        // have args
 
-       // arg: create class object, such as: list.push(new A);
-       scf_dfa_node_add_child(lp,        create);
-       scf_dfa_node_add_child(create_id, comma);
-       scf_dfa_node_add_child(create_id, rp);
-       scf_dfa_node_add_child(create_rp, comma);
-       scf_dfa_node_add_child(create_rp, rp);
-       scf_dfa_node_add_child(comma,     create);
+       // arg: new class object, such as: list.push(new A);
+       scf_dfa_node_add_child(lp,       new);
+       scf_dfa_node_add_child(new_id,   comma);
+       scf_dfa_node_add_child(new_id,   rp);
+       scf_dfa_node_add_child(new_rp,   comma);
+       scf_dfa_node_add_child(new_rp,   rp);
+       scf_dfa_node_add_child(comma,    new);
 
        scf_dfa_node_add_child(lp,       expr);
        scf_dfa_node_add_child(expr,     comma);
diff --git a/parse/scf_dfa_create.c b/parse/scf_dfa_create.c
deleted file mode 100644 (file)
index 6496de4..0000000
+++ /dev/null
@@ -1,263 +0,0 @@
-#include"scf_dfa.h"
-#include"scf_dfa_util.h"
-#include"scf_parse.h"
-#include"scf_stack.h"
-
-extern scf_dfa_module_t dfa_module_create;
-
-typedef struct {
-
-       int              nb_lps;
-       int              nb_rps;
-
-       scf_node_t*      create;
-
-       scf_expr_t*      parent_expr;
-
-} create_module_data_t;
-
-static int _create_is_create(scf_dfa_t* dfa, void* word)
-{
-       scf_lex_word_t* w = word;
-
-       return SCF_LEX_WORD_KEY_CREATE == w->type;
-}
-
-static int _create_action_lp_stat(scf_dfa_t* dfa, scf_vector_t* words, void* data)
-{
-       dfa_data_t*           d  = data;
-       scf_stack_t*          s  = d->module_datas[dfa_module_create.index];
-       create_module_data_t* md = d->module_datas[dfa_module_create.index];
-
-       md->nb_lps++;
-
-       SCF_DFA_PUSH_HOOK(scf_dfa_find_node(dfa, "create_lp_stat"), SCF_DFA_HOOK_POST);
-
-       return SCF_DFA_NEXT_WORD;
-}
-
-static int _create_action_create(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];
-       create_module_data_t* md    = d->module_datas[dfa_module_create.index];
-
-       SCF_CHECK_ERROR(md->create, SCF_DFA_ERROR, "\n");
-
-       md->create = scf_node_alloc(w, SCF_OP_CREATE, NULL);
-       if (!md->create)
-               return SCF_DFA_ERROR;
-
-       md->nb_lps      = 0;
-       md->nb_rps      = 0;
-       md->parent_expr = d->expr;
-
-       return SCF_DFA_NEXT_WORD;
-}
-
-static int _create_action_identity(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];
-       create_module_data_t* md    = d->module_datas[dfa_module_create.index];
-
-       scf_type_t* t  = NULL;
-       scf_type_t* pt = NULL;
-
-       if (scf_ast_find_type(&t, parse->ast, w->text->data) < 0)
-               return SCF_DFA_ERROR;
-
-       if (!t) {
-               scf_loge("type '%s' not found\n", w->text->data);
-               return SCF_DFA_ERROR;
-       }
-
-       if (scf_ast_find_type_type(&pt, parse->ast, SCF_FUNCTION_PTR) < 0)
-               return SCF_DFA_ERROR;
-       assert(pt);
-
-       scf_variable_t* var = SCF_VAR_ALLOC_BY_TYPE(w, pt, 1, 1, NULL);
-       SCF_CHECK_ERROR(!var, SCF_DFA_ERROR, "var '%s' alloc failed\n", w->text->data);
-       var->const_literal_flag = 1;
-
-       scf_node_t* node = scf_node_alloc(NULL, var->type, var);
-       SCF_CHECK_ERROR(!node, SCF_DFA_ERROR, "node alloc failed\n");
-
-       int ret = scf_node_add_child(md->create, node);
-       SCF_CHECK_ERROR(ret < 0, SCF_DFA_ERROR, "node add child failed\n");
-
-       w = dfa->ops->pop_word(dfa);
-       if (SCF_LEX_WORD_LP != w->type) {
-
-               if (d->expr) {
-                       ret = scf_expr_add_node(d->expr, md->create);
-                       SCF_CHECK_ERROR(ret < 0, SCF_DFA_ERROR, "expr add child failed\n");
-               } else
-                       d->expr = md->create;
-
-               md->create = NULL;
-       }
-       dfa->ops->push_word(dfa, w);
-
-       return SCF_DFA_NEXT_WORD;
-}
-
-static int _create_action_lp(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];
-       create_module_data_t* md    = d->module_datas[dfa_module_create.index];
-
-       scf_logd("d->expr: %p\n", d->expr);
-
-       d->expr = NULL;
-       d->expr_local_flag++;
-
-       SCF_DFA_PUSH_HOOK(scf_dfa_find_node(dfa, "create_rp"),      SCF_DFA_HOOK_POST);
-       SCF_DFA_PUSH_HOOK(scf_dfa_find_node(dfa, "create_comma"),   SCF_DFA_HOOK_POST);
-       SCF_DFA_PUSH_HOOK(scf_dfa_find_node(dfa, "create_lp_stat"), SCF_DFA_HOOK_POST);
-
-       return SCF_DFA_NEXT_WORD;
-}
-
-static int _create_action_rp(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];
-       create_module_data_t* md    = d->module_datas[dfa_module_create.index];
-
-       md->nb_rps++;
-
-       scf_logd("md->nb_lps: %d, md->nb_rps: %d\n", md->nb_lps, md->nb_rps);
-
-       if (md->nb_rps < md->nb_lps) {
-
-               SCF_DFA_PUSH_HOOK(scf_dfa_find_node(dfa, "create_rp"),      SCF_DFA_HOOK_POST);
-               SCF_DFA_PUSH_HOOK(scf_dfa_find_node(dfa, "create_comma"),   SCF_DFA_HOOK_POST);
-               SCF_DFA_PUSH_HOOK(scf_dfa_find_node(dfa, "create_lp_stat"), SCF_DFA_HOOK_POST);
-
-               return SCF_DFA_NEXT_WORD;
-       }
-       assert(md->nb_rps == md->nb_lps);
-
-       if (d->expr) {
-               int ret = scf_node_add_child(md->create, d->expr);
-               d->expr = NULL;
-               SCF_CHECK_ERROR(ret < 0, SCF_DFA_ERROR, "node add child failed\n");
-       }
-
-       d->expr = md->parent_expr;
-       d->expr_local_flag--;
-
-       if (d->expr) {
-               int ret = scf_expr_add_node(d->expr, md->create);
-               SCF_CHECK_ERROR(ret < 0, SCF_DFA_ERROR, "expr add child failed\n");
-       } else
-               d->expr = md->create;
-
-       md->create = NULL;
-
-       scf_logi("d->expr: %p\n", d->expr);
-
-       return SCF_DFA_NEXT_WORD;
-}
-
-static int _create_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     = words->data[words->size - 1];
-       create_module_data_t* md    = d->module_datas[dfa_module_create.index];
-
-       SCF_CHECK_ERROR(!d->expr, SCF_DFA_ERROR, "\n");
-
-       int ret = scf_node_add_child(md->create, d->expr);
-       d->expr = NULL;
-       SCF_CHECK_ERROR(ret < 0, SCF_DFA_ERROR, "node add child failed\n");
-
-       SCF_DFA_PUSH_HOOK(scf_dfa_find_node(dfa, "create_comma"),   SCF_DFA_HOOK_POST);
-       SCF_DFA_PUSH_HOOK(scf_dfa_find_node(dfa, "create_lp_stat"), SCF_DFA_HOOK_POST);
-
-       return SCF_DFA_SWITCH_TO;
-}
-
-static int _dfa_init_module_create(scf_dfa_t* dfa)
-{
-       SCF_DFA_MODULE_NODE(dfa, create, create,    _create_is_create,    _create_action_create);
-
-       SCF_DFA_MODULE_NODE(dfa, create, identity,  scf_dfa_is_identity,  _create_action_identity);
-
-       SCF_DFA_MODULE_NODE(dfa, create, lp,        scf_dfa_is_lp,        _create_action_lp);
-       SCF_DFA_MODULE_NODE(dfa, create, rp,        scf_dfa_is_rp,        _create_action_rp);
-
-       SCF_DFA_MODULE_NODE(dfa, create, lp_stat,   scf_dfa_is_lp,        _create_action_lp_stat);
-
-       SCF_DFA_MODULE_NODE(dfa, create, comma,     scf_dfa_is_comma,     _create_action_comma);
-
-       scf_parse_t*       parse = dfa->priv;
-       dfa_data_t*  d     = parse->dfa_data;
-       create_module_data_t* md    = d->module_datas[dfa_module_create.index];
-
-       assert(!md);
-
-       md = calloc(1, sizeof(create_module_data_t));
-       if (!md) {
-               scf_loge("\n");
-               return SCF_DFA_ERROR;
-       }
-
-       d->module_datas[dfa_module_create.index] = md;
-
-       return SCF_DFA_OK;
-}
-
-static int _dfa_fini_module_create(scf_dfa_t* dfa)
-{
-       scf_parse_t*          parse = dfa->priv;
-       dfa_data_t*           d     = parse->dfa_data;
-       create_module_data_t* md    = d->module_datas[dfa_module_create.index];
-
-       if (md) {
-               free(md);
-               md = NULL;
-               d->module_datas[dfa_module_create.index] = NULL;
-       }
-
-       return SCF_DFA_OK;
-}
-
-static int _dfa_init_syntax_create(scf_dfa_t* dfa)
-{
-       SCF_DFA_GET_MODULE_NODE(dfa, create,  create,    create);
-       SCF_DFA_GET_MODULE_NODE(dfa, create,  identity,  identity);
-       SCF_DFA_GET_MODULE_NODE(dfa, create,  lp,        lp);
-       SCF_DFA_GET_MODULE_NODE(dfa, create,  rp,        rp);
-       SCF_DFA_GET_MODULE_NODE(dfa, create,  comma,     comma);
-
-       SCF_DFA_GET_MODULE_NODE(dfa, expr,    entry,     expr);
-
-       scf_dfa_node_add_child(create,   identity);
-       scf_dfa_node_add_child(identity, lp);
-
-       scf_dfa_node_add_child(lp,       rp);
-
-       scf_dfa_node_add_child(lp,       expr);
-       scf_dfa_node_add_child(expr,     comma);
-       scf_dfa_node_add_child(comma,    expr);
-       scf_dfa_node_add_child(expr,     rp);
-
-       return 0;
-}
-
-scf_dfa_module_t dfa_module_create =
-{
-       .name        = "create",
-       .init_module = _dfa_init_module_create,
-       .init_syntax = _dfa_init_syntax_create,
-
-       .fini_module = _dfa_fini_module_create,
-};
index e8e431e510e9f51470a99ca0b94b239bdda10bc9..240fbcc2b4ac77183cd1d87b342e5ab157abc526 100644 (file)
@@ -662,7 +662,7 @@ int _expr_multi_rets(scf_expr_t* e)
 
                nb_rets = f->rets->size;
 
-       } else if (SCF_OP_CREATE == call->type)
+       } else if (SCF_OP_NEW == call->type)
                nb_rets = 2;
        else
                return 0;
@@ -891,9 +891,9 @@ static int _dfa_init_syntax_expr(scf_dfa_t* dfa)
        SCF_DFA_GET_MODULE_NODE(dfa, sizeof,   _sizeof,     _sizeof);
        SCF_DFA_GET_MODULE_NODE(dfa, sizeof,   rp,          sizeof_rp);
 
-       SCF_DFA_GET_MODULE_NODE(dfa, create,   create,      create);
-       SCF_DFA_GET_MODULE_NODE(dfa, create,   identity,    create_id);
-       SCF_DFA_GET_MODULE_NODE(dfa, create,   rp,          create_rp);
+       SCF_DFA_GET_MODULE_NODE(dfa, new,      new,         new);
+       SCF_DFA_GET_MODULE_NODE(dfa, new,      identity,    new_id);
+       SCF_DFA_GET_MODULE_NODE(dfa, new,      rp,          new_rp);
 
        SCF_DFA_GET_MODULE_NODE(dfa, type,     entry,       type_entry);
        SCF_DFA_GET_MODULE_NODE(dfa, type,     base_type,   base_type);
@@ -925,10 +925,10 @@ static int _dfa_init_syntax_expr(scf_dfa_t* dfa)
        scf_dfa_node_add_child(container_rp, comma);
        scf_dfa_node_add_child(container_rp, semicolon);
 
-       // create class object
-       scf_dfa_node_add_child(expr,       create);
-       scf_dfa_node_add_child(create_id,  semicolon);
-       scf_dfa_node_add_child(create_rp,  semicolon);
+       // new class object
+       scf_dfa_node_add_child(expr,       new);
+       scf_dfa_node_add_child(new_id,     semicolon);
+       scf_dfa_node_add_child(new_rp,     semicolon);
 
        // va_arg(ap, type)
        scf_dfa_node_add_child(expr,       va_arg);
@@ -1002,8 +1002,8 @@ static int _dfa_init_syntax_expr(scf_dfa_t* dfa)
        scf_dfa_node_add_child(binary_op,  number);
        scf_dfa_node_add_child(binary_op,  identity);
 
-       // create class object
-       scf_dfa_node_add_child(binary_op,  create);
+       // new class object
+       scf_dfa_node_add_child(binary_op,  new);
        scf_dfa_node_add_child(binary_op,  expr);
 
        scf_dfa_node_add_child(unary_post, rp);
diff --git a/parse/scf_dfa_new.c b/parse/scf_dfa_new.c
new file mode 100644 (file)
index 0000000..5920c8b
--- /dev/null
@@ -0,0 +1,260 @@
+#include"scf_dfa.h"
+#include"scf_dfa_util.h"
+#include"scf_parse.h"
+#include"scf_stack.h"
+
+extern scf_dfa_module_t dfa_module_new;
+
+typedef struct {
+
+       int              nb_lps;
+       int              nb_rps;
+
+       scf_node_t*      new;
+
+       scf_expr_t*      parent_expr;
+
+} new_module_data_t;
+
+static int _new_is_new(scf_dfa_t* dfa, void* word)
+{
+       scf_lex_word_t* w = word;
+
+       return SCF_LEX_WORD_KEY_NEW == w->type;
+}
+
+static int _new_action_lp_stat(scf_dfa_t* dfa, scf_vector_t* words, void* data)
+{
+       dfa_data_t*         d  = data;
+       scf_stack_t*        s  = d->module_datas[dfa_module_new.index];
+       new_module_data_t*  md = d->module_datas[dfa_module_new.index];
+
+       md->nb_lps++;
+
+       SCF_DFA_PUSH_HOOK(scf_dfa_find_node(dfa, "new_lp_stat"), SCF_DFA_HOOK_POST);
+
+       return SCF_DFA_NEXT_WORD;
+}
+
+static int _new_action_new(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];
+       new_module_data_t*  md    = d->module_datas[dfa_module_new.index];
+
+       SCF_CHECK_ERROR(md->new, SCF_DFA_ERROR, "\n");
+
+       md->new = scf_node_alloc(w, SCF_OP_NEW, NULL);
+       if (!md->new)
+               return SCF_DFA_ERROR;
+
+       md->nb_lps      = 0;
+       md->nb_rps      = 0;
+       md->parent_expr = d->expr;
+
+       return SCF_DFA_NEXT_WORD;
+}
+
+static int _new_action_identity(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];
+       new_module_data_t*  md    = d->module_datas[dfa_module_new.index];
+
+       scf_type_t* t  = NULL;
+       scf_type_t* pt = NULL;
+
+       if (scf_ast_find_type(&t, parse->ast, w->text->data) < 0)
+               return SCF_DFA_ERROR;
+
+       if (!t) {
+               scf_loge("type '%s' not found\n", w->text->data);
+               return SCF_DFA_ERROR;
+       }
+
+       if (scf_ast_find_type_type(&pt, parse->ast, SCF_FUNCTION_PTR) < 0)
+               return SCF_DFA_ERROR;
+       assert(pt);
+
+       scf_variable_t* var = SCF_VAR_ALLOC_BY_TYPE(w, pt, 1, 1, NULL);
+       SCF_CHECK_ERROR(!var, SCF_DFA_ERROR, "var '%s' alloc failed\n", w->text->data);
+       var->const_literal_flag = 1;
+
+       scf_node_t* node = scf_node_alloc(NULL, var->type, var);
+       SCF_CHECK_ERROR(!node, SCF_DFA_ERROR, "node alloc failed\n");
+
+       int ret = scf_node_add_child(md->new, node);
+       SCF_CHECK_ERROR(ret < 0, SCF_DFA_ERROR, "node add child failed\n");
+
+       w = dfa->ops->pop_word(dfa);
+       if (SCF_LEX_WORD_LP != w->type) {
+
+               if (d->expr) {
+                       ret = scf_expr_add_node(d->expr, md->new);
+                       SCF_CHECK_ERROR(ret < 0, SCF_DFA_ERROR, "expr add child failed\n");
+               } else
+                       d->expr = md->new;
+
+               md->new = NULL;
+       }
+       dfa->ops->push_word(dfa, w);
+
+       return SCF_DFA_NEXT_WORD;
+}
+
+static int _new_action_lp(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];
+       new_module_data_t*  md    = d->module_datas[dfa_module_new.index];
+
+       scf_logd("d->expr: %p\n", d->expr);
+
+       d->expr = NULL;
+       d->expr_local_flag++;
+
+       SCF_DFA_PUSH_HOOK(scf_dfa_find_node(dfa, "new_rp"),      SCF_DFA_HOOK_POST);
+       SCF_DFA_PUSH_HOOK(scf_dfa_find_node(dfa, "new_comma"),   SCF_DFA_HOOK_POST);
+       SCF_DFA_PUSH_HOOK(scf_dfa_find_node(dfa, "new_lp_stat"), SCF_DFA_HOOK_POST);
+
+       return SCF_DFA_NEXT_WORD;
+}
+
+static int _new_action_rp(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];
+       new_module_data_t*  md    = d->module_datas[dfa_module_new.index];
+
+       md->nb_rps++;
+
+       scf_logd("md->nb_lps: %d, md->nb_rps: %d\n", md->nb_lps, md->nb_rps);
+
+       if (md->nb_rps < md->nb_lps) {
+
+               SCF_DFA_PUSH_HOOK(scf_dfa_find_node(dfa, "new_rp"),      SCF_DFA_HOOK_POST);
+               SCF_DFA_PUSH_HOOK(scf_dfa_find_node(dfa, "new_comma"),   SCF_DFA_HOOK_POST);
+               SCF_DFA_PUSH_HOOK(scf_dfa_find_node(dfa, "new_lp_stat"), SCF_DFA_HOOK_POST);
+
+               return SCF_DFA_NEXT_WORD;
+       }
+       assert(md->nb_rps == md->nb_lps);
+
+       if (d->expr) {
+               int ret = scf_node_add_child(md->new, d->expr);
+               d->expr = NULL;
+               SCF_CHECK_ERROR(ret < 0, SCF_DFA_ERROR, "node add child failed\n");
+       }
+
+       d->expr = md->parent_expr;
+       d->expr_local_flag--;
+
+       if (d->expr) {
+               int ret = scf_expr_add_node(d->expr, md->new);
+               SCF_CHECK_ERROR(ret < 0, SCF_DFA_ERROR, "expr add child failed\n");
+       } else
+               d->expr = md->new;
+
+       md->new = NULL;
+
+       scf_logi("d->expr: %p\n", d->expr);
+
+       return SCF_DFA_NEXT_WORD;
+}
+
+static int _new_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     = words->data[words->size - 1];
+       new_module_data_t*  md    = d->module_datas[dfa_module_new.index];
+
+       SCF_CHECK_ERROR(!d->expr, SCF_DFA_ERROR, "\n");
+
+       int ret = scf_node_add_child(md->new, d->expr);
+       d->expr = NULL;
+       SCF_CHECK_ERROR(ret < 0, SCF_DFA_ERROR, "node add child failed\n");
+
+       SCF_DFA_PUSH_HOOK(scf_dfa_find_node(dfa, "new_comma"),   SCF_DFA_HOOK_POST);
+       SCF_DFA_PUSH_HOOK(scf_dfa_find_node(dfa, "new_lp_stat"), SCF_DFA_HOOK_POST);
+
+       return SCF_DFA_SWITCH_TO;
+}
+
+static int _dfa_init_module_new(scf_dfa_t* dfa)
+{
+       SCF_DFA_MODULE_NODE(dfa, new, new,       _new_is_new,          _new_action_new);
+       SCF_DFA_MODULE_NODE(dfa, new, identity,  scf_dfa_is_identity,  _new_action_identity);
+
+       SCF_DFA_MODULE_NODE(dfa, new, lp,        scf_dfa_is_lp,        _new_action_lp);
+       SCF_DFA_MODULE_NODE(dfa, new, rp,        scf_dfa_is_rp,        _new_action_rp);
+       SCF_DFA_MODULE_NODE(dfa, new, lp_stat,   scf_dfa_is_lp,        _new_action_lp_stat);
+       SCF_DFA_MODULE_NODE(dfa, new, comma,     scf_dfa_is_comma,     _new_action_comma);
+
+       scf_parse_t*        parse = dfa->priv;
+       dfa_data_t*         d     = parse->dfa_data;
+       new_module_data_t*  md    = d->module_datas[dfa_module_new.index];
+
+       assert(!md);
+
+       md = calloc(1, sizeof(new_module_data_t));
+       if (!md) {
+               scf_loge("\n");
+               return SCF_DFA_ERROR;
+       }
+
+       d->module_datas[dfa_module_new.index] = md;
+
+       return SCF_DFA_OK;
+}
+
+static int _dfa_fini_module_new(scf_dfa_t* dfa)
+{
+       scf_parse_t*        parse = dfa->priv;
+       dfa_data_t*         d     = parse->dfa_data;
+       new_module_data_t*  md    = d->module_datas[dfa_module_new.index];
+
+       if (md) {
+               free(md);
+               md = NULL;
+               d->module_datas[dfa_module_new.index] = NULL;
+       }
+
+       return SCF_DFA_OK;
+}
+
+static int _dfa_init_syntax_new(scf_dfa_t* dfa)
+{
+       SCF_DFA_GET_MODULE_NODE(dfa, new,  new,       new);
+       SCF_DFA_GET_MODULE_NODE(dfa, new,  identity,  identity);
+       SCF_DFA_GET_MODULE_NODE(dfa, new,  lp,        lp);
+       SCF_DFA_GET_MODULE_NODE(dfa, new,  rp,        rp);
+       SCF_DFA_GET_MODULE_NODE(dfa, new,  comma,     comma);
+
+       SCF_DFA_GET_MODULE_NODE(dfa, expr, entry,     expr);
+
+       scf_dfa_node_add_child(new,      identity);
+       scf_dfa_node_add_child(identity, lp);
+
+       scf_dfa_node_add_child(lp,       rp);
+
+       scf_dfa_node_add_child(lp,       expr);
+       scf_dfa_node_add_child(expr,     comma);
+       scf_dfa_node_add_child(comma,    expr);
+       scf_dfa_node_add_child(expr,     rp);
+
+       return 0;
+}
+
+scf_dfa_module_t dfa_module_new =
+{
+       .name        = "new",
+       .init_module = _dfa_init_module_new,
+       .init_syntax = _dfa_init_syntax_new,
+
+       .fini_module = _dfa_fini_module_new,
+};
index 495c411fb6840cc4f44f06683da43a731d47c6dc..21dfc9b5982e892758f1867f3fb5f1c7643ba45d 100644 (file)
@@ -7,7 +7,7 @@ extern scf_dfa_module_t  dfa_module_include;
 extern scf_dfa_module_t  dfa_module_identity;
 
 extern scf_dfa_module_t  dfa_module_expr;
-extern scf_dfa_module_t  dfa_module_create;
+extern scf_dfa_module_t  dfa_module_new;
 extern scf_dfa_module_t  dfa_module_call;
 extern scf_dfa_module_t  dfa_module_sizeof;
 extern scf_dfa_module_t  dfa_module_container;
@@ -49,7 +49,7 @@ scf_dfa_module_t* dfa_modules[] =
        &dfa_module_identity,
 
        &dfa_module_expr,
-       &dfa_module_create,
+       &dfa_module_new,
        &dfa_module_call,
        &dfa_module_sizeof,
        &dfa_module_container,
index b3bb01095240f2f72bfed1e5b54ddd13930a7099..f1dfa570506595637df83a5ab7d3b09c42d98d63 100644 (file)
@@ -109,7 +109,7 @@ static int _scf_expr_calculate_internal(scf_ast_t* ast, scf_node_t* node, void*
        return 0;
 }
 
-static int _scf_op_const_create(scf_ast_t* ast, scf_node_t** nodes, int nb_nodes, void* data)
+static int _scf_op_const_new(scf_ast_t* ast, scf_node_t** nodes, int nb_nodes, void* data)
 {
        assert(nb_nodes > 3);
 
@@ -923,7 +923,7 @@ scf_operator_handler_pt  const_operator_handlers[SCF_N_OPS] =
 
        [SCF_OP_ARRAY_INDEX]  =   _scf_op_const_array_index,
        [SCF_OP_POINTER    ]  =   _scf_op_const_pointer,
-       [SCF_OP_CREATE     ]  =   _scf_op_const_create,
+       [SCF_OP_NEW        ]  =   _scf_op_const_new,
 
        [SCF_OP_VA_START   ]  =   _scf_op_const_va_start,
        [SCF_OP_VA_ARG     ]  =   _scf_op_const_va_arg,
index 9e1974eb127b598e5d5c7a83d84dfe240e9e4d12..e05302ec8d4aca4c94a44b1c4689b3e5673d2545 100644 (file)
@@ -479,7 +479,7 @@ static int _semantic_do_overloaded_assign(scf_ast_t* ast, scf_node_t** nodes, in
        return ret;
 }
 
-static int _semantic_do_create(scf_ast_t* ast, scf_node_t** nodes, int nb_nodes, scf_handler_data_t* d)
+static int _semantic_do_new(scf_ast_t* ast, scf_node_t** nodes, int nb_nodes, scf_handler_data_t* d)
 {
        scf_variable_t* v0;
        scf_variable_t* v_pf;
@@ -489,7 +489,7 @@ static int _semantic_do_create(scf_ast_t* ast, scf_node_t** nodes, int nb_nodes,
        scf_node_t*     parent  = nodes[0]->parent;
        scf_node_t*     node0   = nodes[0];
        scf_node_t*     node1   = nodes[1];
-       scf_node_t*     create  = NULL;
+       scf_node_t*     new     = NULL;
        scf_node_t*     node_pf = NULL;
 
        v0 = _scf_operand_get(nodes[0]);
@@ -503,8 +503,8 @@ static int _semantic_do_create(scf_ast_t* ast, scf_node_t** nodes, int nb_nodes,
        assert(t);
        assert(pt);
 
-       create = scf_node_alloc(parent->w, SCF_OP_CREATE, NULL);
-       if (!create)
+       new = scf_node_alloc(parent->w, SCF_OP_NEW, NULL);
+       if (!new)
                return -ENOMEM;
 
        v_pf = SCF_VAR_ALLOC_BY_TYPE(t->w, pt, 1, 1, NULL);
@@ -516,15 +516,15 @@ static int _semantic_do_create(scf_ast_t* ast, scf_node_t** nodes, int nb_nodes,
        if (!node_pf)
                return -ENOMEM;
 
-       ret = scf_node_add_child(create, node_pf);
+       ret = scf_node_add_child(new, node_pf);
        if (ret < 0)
                return ret;
 
-       ret = scf_node_add_child(create, node1);
+       ret = scf_node_add_child(new, node1);
        if (ret < 0)
                return ret;
-       create->parent   = parent;
-       parent->nodes[1] = create;
+       new->parent      = parent;
+       parent->nodes[1] = new;
 
        b = scf_block_alloc_cstr("multi_rets");
        if (!b)
@@ -719,7 +719,7 @@ static int _semantic_add_var(scf_node_t** pp, scf_ast_t* ast, scf_node_t* parent
        return 0;
 }
 
-static int _scf_op_semantic_create(scf_ast_t* ast, scf_node_t** nodes, int nb_nodes, void* data)
+static int _scf_op_semantic_new(scf_ast_t* ast, scf_node_t** nodes, int nb_nodes, void* data)
 {
        assert(nb_nodes >= 1);
 
@@ -2645,7 +2645,7 @@ static int _semantic_multi_rets_assign(scf_ast_t* ast, scf_node_t** nodes, int n
                        break;
        }
 
-       if (SCF_OP_CALL != call->type && SCF_OP_CREATE != call->type) {
+       if (SCF_OP_CALL != call->type && SCF_OP_NEW != call->type) {
                scf_loge("\n");
                return -1;
        }
@@ -2821,7 +2821,7 @@ static int _scf_op_semantic_assign(scf_ast_t* ast, scf_node_t** nodes, int nb_no
 
                        if (scf_scope_find_function(t->scope, "__init")) {
 
-                               int ret = _semantic_do_create(ast, nodes, nb_nodes, d);
+                               int ret = _semantic_do_new(ast, nodes, nb_nodes, d);
                                if (0 == ret)
                                        return 0;
 
@@ -3148,7 +3148,7 @@ scf_operator_handler_pt  semantic_operator_handlers[SCF_N_OPS] =
 
        [SCF_OP_ARRAY_INDEX]  =  _scf_op_semantic_array_index,
        [SCF_OP_POINTER    ]  =  _scf_op_semantic_pointer,
-       [SCF_OP_CREATE     ]  =  _scf_op_semantic_create,
+       [SCF_OP_NEW        ]  =  _scf_op_semantic_new,
 
        [SCF_OP_VA_START   ]  =  _scf_op_semantic_va_start,
        [SCF_OP_VA_ARG     ]  =  _scf_op_semantic_va_arg,