+static int __switch_for_Object(scf_ast_t* ast, scf_type_t* Object, scf_node_t* parent, scf_node_t* child, scf_expr_t* e, scf_expr_t* e1, scf_handler_data_t* d,
+ scf_variable_t* v,
+ scf_variable_t* v1)
+{
+ scf_function_t* f = NULL;
+ scf_vector_t* fvec = NULL;
+ scf_vector_t* argv;
+ scf_expr_t* e2;
+ scf_expr_t* e3;
+ scf_expr_t* e4;
+
+ argv = scf_vector_alloc();
+ if (!argv)
+ return -ENOMEM;
+
+ int ret = scf_vector_add(argv, v);
+ if (ret < 0) {
+ scf_vector_free(argv);
+ return ret;
+ }
+
+ ret = scf_vector_add(argv, v1);
+ if (ret < 0) {
+ scf_vector_free(argv);
+ return ret;
+ }
+
+ ret = scf_scope_find_overloaded_functions(&fvec, Object->scope, SCF_OP_EQ, argv);
+ if (ret < 0) {
+ scf_loge("\n");
+ return ret;
+ }
+
+ ret = scf_ast_find_proper_function(&f, ast, fvec, argv);
+ if (ret < 0) {
+ scf_loge("can't find overloaded operator '==' for compare Object, file: %s, line: %d\n",
+ parent->w->file->data, parent->w->line);
+ return -1;
+ }
+
+ scf_vector_free(argv);
+ scf_vector_free(fvec);
+ argv = NULL;
+ fvec = NULL;
+
+ assert(2 == f->argv->size);
+
+ if (!scf_variable_same_type(f->argv->data[1], v1)) {
+ e2 = e1;
+ while (SCF_OP_EXPR == e2->type)
+ e2 = e2->nodes[0];
+
+ ret = _semantic_add_type_cast(ast, &(e2->parent->nodes[0]), f->argv->data[1], e2);
+ if (ret < 0)
+ return ret;
+ }
+
+ e2 = scf_expr_clone(e);
+ if (!e1)
+ return -ENOMEM;
+
+ v = NULL;
+ if (_scf_expr_calculate(ast, e2, &v) < 0) {
+ scf_expr_free(e2);
+ return -1;
+ }
+ scf_variable_free(v);
+ v = NULL;
+
+ e3 = scf_expr_alloc();
+ if (!e3) {
+ scf_expr_free(e2);
+ return -ENOMEM;
+ }
+
+ ret = scf_node_add_child(e3, e2);
+ if (ret < 0) {
+ scf_expr_free(e2);
+ scf_expr_free(e3);
+ return ret;
+ }
+ e2 = NULL;
+
+ ret = scf_node_add_child(e3, e1);
+ if (ret < 0) {
+ scf_expr_free(e3);
+ return ret;
+ }
+ child->nodes[0] = NULL;
+
+ e4 = scf_expr_alloc();
+ if (!e4) {
+ scf_expr_free(e3);
+ return -ENOMEM;
+ }
+
+ ret = scf_node_add_child(e4, e3);
+ if (ret < 0) {
+ scf_expr_free(e3);
+ scf_expr_free(e4);
+ return ret;
+ }
+
+ child->nodes[0] = e4;
+ e4->parent = child;
+
+ d->pret = &e3->result;
+
+ return _semantic_add_call(ast, e3->nodes, e3->nb_nodes, d, f);
+}
+