assert(id && id->identity);
w = id->identity;
+ if (!d->expr) {
+ d->expr = scf_expr_alloc();
+ if (!d->expr)
+ return -ENOMEM;
+ }
+
if (scf_ast_find_variable(&var, parse->ast, w->text->data) < 0)
return SCF_DFA_ERROR;
scf_logi("md->current_var: %s, var: %s, member_flag: %d, line: %d, pos: %d\n",
md->current_var->w->text->data, var->w->text->data, var->member_flag, var->w->line, var->w->pos);
+ 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 = 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)
if (!node)
return -ENOMEM;
- if (!d->expr) {
- d->expr = scf_expr_alloc();
- if (!d->expr)
- return -ENOMEM;
- }
-
scf_logd("d->expr: %p, node: %p\n", d->expr, node);
if (scf_expr_add_node(d->expr, node) < 0) {
return SCF_DFA_ERROR;
}
- if (scf_function_signature(f) < 0)
+ if (scf_function_signature(parse->ast, f) < 0)
return SCF_DFA_ERROR;
w->text->data[2] = '\0';
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;
+ scf_loge("t: %p, js_type: %d\n", t, t->type);
parse->ast->current_block = (scf_block_t*)t;
}
}
scf_vector_t* init_exprs;
scf_stack_t* init_objs;
+ scf_block_t* parent_block;
+
+ scf_variable_t* current_var;
dfa_index_t* current_index;
int current_n;
int current_dim;
md->nb_lbs = 0;
md->nb_rbs = 0;
- d->current_var = NULL;
+ md->current_var = NULL;
+ d ->current_var = NULL;
return ret;
}
return SCF_DFA_SWITCH_TO;
}
+static int _data_action_func(scf_dfa_t* dfa, scf_vector_t* words, void* data)
+{
+ scf_parse_t* parse = dfa->priv;
+ dfa_data_t* d = data;
+ init_module_data_t* md = d->module_datas[dfa_module_init_data.index];
+
+ d->expr_local_flag = 0;
+
+ SCF_DFA_PUSH_HOOK(scf_dfa_find_node(dfa, "init_data_func_end"), SCF_DFA_HOOK_END);
+
+ return SCF_DFA_CONTINUE;
+}
+
+static int _data_action_func_end(scf_dfa_t* dfa, scf_vector_t* words, void* data)
+{
+ scf_parse_t* parse = dfa->priv;
+ scf_ast_t* ast = parse->ast;
+ dfa_data_t* d = data;
+ 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_type_t* t;
+
+ d->expr_local_flag = 1;
+ d->current_var = md->current_var;
+
+ assert(SCF_VAR_VAR != obj->type);
+
+ int ret = scf_ast_find_type_type(&t, ast, obj->type);
+ if (ret < 0)
+ return ret;
+
+ w = md->current_index[md->current_dim].w;
+ assert(w);
+ md->current_index[md->current_dim].w = NULL;
+
+ scf_logi("add member '%s()' to '%s_%d_%d'\n", w->text->data, obj->w->text->data, obj->w->line, obj->w->pos);
+
+ assert(d->current_function);
+
+ ret = scf_string_copy(d->current_function->node.w->text, w->text);
+ if (ret < 0)
+ return ret;
+
+ d->current_function = NULL;
+ return SCF_DFA_SWITCH_TO;
+}
+
static int _data_action_entry(scf_dfa_t* dfa, scf_vector_t* words, void* data)
{
assert(words->size >= 2);
scf_parse_t* parse = dfa->priv;
+ scf_ast_t* ast = parse->ast;
dfa_data_t* d = data;
scf_lex_word_t* w = words->data[words->size - 2];
init_module_data_t* md = d->module_datas[dfa_module_init_data.index];
d->expr_local_flag = 1;
+ md->current_var = d->current_var;
+ md->parent_block = ast->current_block;
+
+ scf_dfa_del_hook_by_name(&(dfa->hooks[SCF_DFA_HOOK_POST]), "var_semicolon");
return SCF_DFA_CONTINUE;
}
static int _data_action_lb(scf_dfa_t* dfa, scf_vector_t* words, void* data)
{
scf_parse_t* parse = dfa->priv;
+ scf_ast_t* ast = parse->ast;
dfa_data_t* d = data;
init_module_data_t* md = d->module_datas[dfa_module_init_data.index];
scf_variable_t* obj;
+ scf_type_t* s;
md->nb_lbs++;
obj = scf_stack_top(md->init_objs);
- scf_logi("obj: %p, md->nb_lbs: %d\n", obj, md->nb_lbs);
+ assert(SCF_VAR_VAR == obj->type);
+
+ s = scf_type_alloc(obj->w, obj->w->text->data, SCF_STRUCT + ast->nb_structs, 0);
+ if (!s) {
+ scf_loge("\n");
+ return SCF_DFA_ERROR;
+ }
+
+ s->scope = scf_scope_alloc(obj->w, "class");
+
+ ast->nb_structs++;
+ s->node.class_flag = 1;
+ scf_scope_push_type(md->parent_block->scope, s);
+ scf_node_add_child((scf_node_t*)md->parent_block, (scf_node_t*)s);
+
+ if (ast->current_block == md->parent_block)
+ d->current_var->js_type = s->type;
+
+ ast->current_block = (scf_block_t*)s;
+
+ obj->type = s->type;
+ obj->js_type = s->type;
+
+ scf_loge("s: %p, js_type: %d, obj: %p, obj->w: %s, md->nb_lbs: %d\n", s, s->type, obj, obj->w->text->data, md->nb_lbs);
SCF_DFA_PUSH_HOOK(scf_dfa_find_node(dfa, "init_data_comma"), SCF_DFA_HOOK_POST);
static int _data_action_rb(scf_dfa_t* dfa, scf_vector_t* words, void* data)
{
scf_parse_t* parse = dfa->priv;
+ scf_ast_t* ast = parse->ast;
dfa_data_t* d = data;
scf_type_t* t = NULL;
init_module_data_t* md = d->module_datas[dfa_module_init_data.index];
md->nb_rbs++;
md->current_dim--;
- scf_logd("md->current_dim: %d, md->current_n: %d\n", md->current_dim, md->current_n);
+ scf_logi("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++) {
obj = scf_stack_pop(md->init_objs);
- int ret = scf_ast_find_type_type(&t, parse->ast, obj->type);
+ int ret = scf_ast_find_type_type(&t, ast, obj->type);
if (ret < 0)
- return ret;
+ goto error;
- if (_class_calculate_size(dfa, t) < 0)
- return SCF_DFA_ERROR;
+ ret = _class_calculate_size(dfa, t);
+ if (ret < 0)
+ goto error;
if (md->nb_rbs == md->nb_lbs) {
d->expr_local_flag = 0;
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;
- d->current_var->nb_pointers = obj->nb_pointers;
- 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);
+ ast->current_block = md->parent_block;
+ md->parent_block = NULL;
+
+ ret = _do_data_init(ast, d, obj);
if (ret < 0)
- return ret;
-#endif
+ goto error;
+
scf_dfa_del_hook_by_name(&(dfa->hooks[SCF_DFA_HOOK_POST]), "init_data_comma");
} else {
w = md->current_index[md->current_dim].w;
if (w)
- ret = _add_struct_member(parse->ast, d, obj);
+ ret = _add_struct_member(ast, d, obj);
else
- ret = _add_array_member(parse->ast, d, obj);
- if (ret < 0) {
- scf_variable_free(obj);
- return ret;
- }
+ ret = _add_array_member(ast, d, obj);
+ if (ret < 0)
+ goto error;
}
scf_variable_free(obj);
obj = NULL;
+
+ obj = scf_stack_top(md->init_objs);
+ if (obj) {
+ ret = scf_ast_find_type_type(&t, ast, obj->type);
+ if (ret < 0)
+ return ret;
+
+ ast->current_block = (scf_block_t*)t;
+ }
+
return SCF_DFA_NEXT_WORD;
+
+error:
+ scf_variable_free(obj);
+ return ret;
}
static int _data_action_rs(scf_dfa_t* dfa, scf_vector_t* words, void* data)
static int _dfa_init_module_init_data(scf_dfa_t* dfa)
{
- SCF_DFA_MODULE_NODE(dfa, init_data, entry, _data_is_entry, _data_action_entry);
- SCF_DFA_MODULE_NODE(dfa, init_data, member, scf_dfa_is_identity, _data_action_member);
+ SCF_DFA_MODULE_NODE(dfa, init_data, entry, _data_is_entry, _data_action_entry);
+ SCF_DFA_MODULE_NODE(dfa, init_data, member, scf_dfa_is_identity, _data_action_member);
- SCF_DFA_MODULE_NODE(dfa, init_data, colon, scf_dfa_is_colon, scf_dfa_action_next);
- SCF_DFA_MODULE_NODE(dfa, init_data, comma, scf_dfa_is_comma, _data_action_comma);
+ SCF_DFA_MODULE_NODE(dfa, init_data, colon, scf_dfa_is_colon, scf_dfa_action_next);
+ SCF_DFA_MODULE_NODE(dfa, init_data, comma, scf_dfa_is_comma, _data_action_comma);
+ SCF_DFA_MODULE_NODE(dfa, init_data, func, scf_dfa_is_func, _data_action_func);
+ SCF_DFA_MODULE_NODE(dfa, init_data, func_end, scf_dfa_is_entry, _data_action_func_end);
- SCF_DFA_MODULE_NODE(dfa, init_data, lb, scf_dfa_is_lb, _data_action_lb);
- SCF_DFA_MODULE_NODE(dfa, init_data, rb, scf_dfa_is_rb, _data_action_rb);
+ SCF_DFA_MODULE_NODE(dfa, init_data, lb, scf_dfa_is_lb, _data_action_lb);
+ SCF_DFA_MODULE_NODE(dfa, init_data, rb, scf_dfa_is_rb, _data_action_rb);
- SCF_DFA_MODULE_NODE(dfa, init_data, ls, scf_dfa_is_ls, _data_action_ls);
- SCF_DFA_MODULE_NODE(dfa, init_data, rs, scf_dfa_is_rs, _data_action_rs);
+ SCF_DFA_MODULE_NODE(dfa, init_data, ls, scf_dfa_is_ls, _data_action_ls);
+ SCF_DFA_MODULE_NODE(dfa, init_data, rs, scf_dfa_is_rs, _data_action_rs);
scf_parse_t* parse = dfa->priv;
dfa_data_t* d = parse->dfa_data;
static int _dfa_init_syntax_init_data(scf_dfa_t* dfa)
{
- SCF_DFA_GET_MODULE_NODE(dfa, init_data, entry, entry);
- SCF_DFA_GET_MODULE_NODE(dfa, init_data, comma, comma);
- SCF_DFA_GET_MODULE_NODE(dfa, init_data, colon, colon);
- SCF_DFA_GET_MODULE_NODE(dfa, init_data, member, member);
+ SCF_DFA_GET_MODULE_NODE(dfa, init_data, entry, entry);
+ SCF_DFA_GET_MODULE_NODE(dfa, init_data, comma, comma);
+ SCF_DFA_GET_MODULE_NODE(dfa, init_data, colon, colon);
+ SCF_DFA_GET_MODULE_NODE(dfa, init_data, member, member);
+ SCF_DFA_GET_MODULE_NODE(dfa, init_data, func, func);
+ SCF_DFA_GET_MODULE_NODE(dfa, init_data, func_end, func_end);
- SCF_DFA_GET_MODULE_NODE(dfa, init_data, lb, lb);
- SCF_DFA_GET_MODULE_NODE(dfa, init_data, rb, rb);
+ SCF_DFA_GET_MODULE_NODE(dfa, init_data, lb, lb);
+ SCF_DFA_GET_MODULE_NODE(dfa, init_data, rb, rb);
- SCF_DFA_GET_MODULE_NODE(dfa, init_data, ls, ls);
- SCF_DFA_GET_MODULE_NODE(dfa, init_data, rs, rs);
+ SCF_DFA_GET_MODULE_NODE(dfa, init_data, ls, ls);
+ SCF_DFA_GET_MODULE_NODE(dfa, init_data, rs, rs);
- SCF_DFA_GET_MODULE_NODE(dfa, expr, entry, expr);
+ SCF_DFA_GET_MODULE_NODE(dfa, function_js, func, func_js);
+ SCF_DFA_GET_MODULE_NODE(dfa, expr, entry, expr);
// empty init, use 0 to fill the data
scf_dfa_node_add_child(entry, lb);
// init member of object
scf_dfa_node_add_child(lb, member);
scf_dfa_node_add_child(member, colon);
+
+ // init member function()
+ scf_dfa_node_add_child(colon, func);
+ scf_dfa_node_add_child(func, func_js);
+ scf_dfa_node_add_child(func_end, member);
+ scf_dfa_node_add_child(func_end, rb);
+
scf_dfa_node_add_child(colon, expr);
scf_dfa_node_add_child(expr, comma);
-
scf_dfa_node_add_child(comma, member);
scf_dfa_node_add_child(colon, lb);
scf_dfa_node_add_child(expr, rb);