scf_instruction_t* inst;
scf_x64_OpCode_t* lea;
scf_x64_OpCode_t* mov;
+ scf_x64_OpCode_t* xor;
scf_variable_t* v;
v = dn->var;
int size = x64_variable_size(v);
int is_float = scf_variable_float(v);
- if (SCF_FUNCTION_PTR == v->type) {
-
- if (v->func_ptr) {
- assert(v->const_literal_flag);
-
- v->global_flag = 1;
- v->local_flag = 0;
- v->tmp_flag = 0;
-
- scf_rela_t* rela = NULL;
-
- lea = x64_find_OpCode(SCF_X64_LEA, size, size, SCF_X64_E2G);
- inst = x64_make_inst_M2G(&rela, lea, r, NULL, v);
- X64_INST_ADD_CHECK(c->instructions, inst, rela);
- X64_RELA_ADD_CHECK(f->text_relas, rela, c, NULL, v->func_ptr);
-
- } else {
- scf_x64_OpCode_t* xor;
-
- xor = x64_find_OpCode(SCF_X64_XOR, size, size, SCF_X64_G2E);
- inst = x64_make_inst_G2E(xor, r, r);
- X64_INST_ADD_CHECK(c->instructions, inst, NULL);
- }
-
- } else if (scf_variable_const_string(v)) {
-
- scf_rela_t* rela = NULL;
+ scf_rela_t* rela = NULL;
+ if (scf_variable_const_string(v)) {
v->global_flag = 1;
v->local_flag = 0;
v->tmp_flag = 0;
} else if (v->nb_dimentions > 0) {
assert(v->const_literal_flag);
- scf_rela_t* rela = NULL;
-
lea = x64_find_OpCode(SCF_X64_LEA, size, size, SCF_X64_E2G);
inst = x64_make_inst_M2G(&rela, lea, r, NULL, v);
X64_INST_ADD_CHECK(c->instructions, inst, rela);
X64_RELA_ADD_CHECK(f->data_relas, rela, c, v, NULL);
+ } else if (SCF_FUNCTION_PTR == v->type) {
+ if (v->func_ptr) {
+ assert(v->const_literal_flag);
+
+ v->global_flag = 1;
+ v->local_flag = 0;
+ v->tmp_flag = 0;
+
+ lea = x64_find_OpCode(SCF_X64_LEA, size, size, SCF_X64_E2G);
+ inst = x64_make_inst_M2G(&rela, lea, r, NULL, v);
+ X64_INST_ADD_CHECK(c->instructions, inst, rela);
+ X64_RELA_ADD_CHECK(f->text_relas, rela, c, NULL, v->func_ptr);
+ } else {
+ xor = x64_find_OpCode(SCF_X64_XOR, size, size, SCF_X64_G2E);
+ inst = x64_make_inst_G2E(xor, r, r);
+ X64_INST_ADD_CHECK(c->instructions, inst, NULL);
+ }
} else {
mov = x64_find_OpCode(SCF_X64_MOV, size, size, SCF_X64_I2G);
inst = x64_make_inst_I2G(mov, r, (uint8_t*)&v->data, size);
scf_variable_t* var_pf = NULL;
scf_node_t* node_pf = NULL;
scf_type_t* pt = NULL;
-
scf_node_t* node_call = NULL;
scf_operator_t* op = scf_find_base_operator_by_type(SCF_OP_CALL);
scf_stack_pop(d->current_identities);
free(id);
id = NULL;
- } else {
- // f()(), function f should return a function pointer
- scf_loge("\n");
- return SCF_DFA_ERROR;
}
node_call = scf_node_alloc(w1, SCF_OP_CALL, NULL);
scf_logi("d->expr: %p\n", d->expr);
if (cd->parent_expr) {
- scf_expr_add_node(cd->parent_expr, cd->func);
+ if (cd->func)
+ scf_expr_add_node(cd->parent_expr, cd->func);
+
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);
}
if (cd->argv) {
dfa_data_t* d = data;
scf_lex_word_t* w = words->data[words->size - 1];
scf_stack_t* s = d->module_datas[dfa_module_call.index];
-
dfa_call_data_t* cd = scf_stack_top(s);
+
if (!cd) {
scf_loge("\n");
return SCF_DFA_ERROR;
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);