struct value * value_x_unop (struct value *arg1, enum exp_opcode op, enum noside noside) { struct gdbarch *gdbarch = get_type_arch (value_type (arg1)); struct value **argvec; char *ptr, *mangle_ptr; char tstr[13], mangle_tstr[13]; int static_memfuncp, nargs; arg1 = coerce_ref (arg1); /* now we know that what we have to do is construct our arg vector and find the right function to call it with. */ if (TYPE_CODE (check_typedef (value_type (arg1))) != TYPE_CODE_STRUCT) error (_("Can't do that unary op on that type")); /* FIXME be explicit */ argvec = (struct value **) alloca (sizeof (struct value *) * 4); argvec[1] = value_addr (arg1); argvec[2] = 0; nargs = 1; /* Make the right function name up. */ strcpy (tstr, "operator__"); ptr = tstr + 8; strcpy (mangle_tstr, "__"); mangle_ptr = mangle_tstr + 2; switch (op) { case UNOP_PREINCREMENT: strcpy (ptr, "++"); break; case UNOP_PREDECREMENT: strcpy (ptr, "--"); break; case UNOP_POSTINCREMENT: strcpy (ptr, "++"); argvec[2] = value_from_longest (builtin_type (gdbarch)->builtin_int, 0); argvec[3] = 0; nargs ++; break; case UNOP_POSTDECREMENT: strcpy (ptr, "--"); argvec[2] = value_from_longest (builtin_type (gdbarch)->builtin_int, 0); argvec[3] = 0; nargs ++; break; case UNOP_LOGICAL_NOT: strcpy (ptr, "!"); break; case UNOP_COMPLEMENT: strcpy (ptr, "~"); break; case UNOP_NEG: strcpy (ptr, "-"); break; case UNOP_PLUS: strcpy (ptr, "+"); break; case UNOP_IND: strcpy (ptr, "*"); break; case STRUCTOP_PTR: strcpy (ptr, "->"); break; default: error (_("Invalid unary operation specified.")); } argvec[0] = value_user_defined_op (&arg1, argvec + 1, tstr, &static_memfuncp, nargs); if (argvec[0]) { if (static_memfuncp) { argvec[1] = argvec[0]; nargs --; argvec++; } if (noside == EVAL_AVOID_SIDE_EFFECTS) { struct type *return_type; return_type = TYPE_TARGET_TYPE (check_typedef (value_type (argvec[0]))); return value_zero (return_type, VALUE_LVAL (arg1)); } return call_function_by_hand (argvec[0], nargs, argvec + 1); } throw_error (NOT_FOUND_ERROR, _("member function %s not found"), tstr); return 0; /* For lint -- never reached */ }
struct value * value_x_unop (struct value *arg1, enum exp_opcode op, enum noside noside) { struct gdbarch *gdbarch = get_type_arch (value_type (arg1)); char *ptr; char tstr[13], mangle_tstr[13]; int static_memfuncp, nargs; arg1 = coerce_ref (arg1); /* now we know that what we have to do is construct our arg vector and find the right function to call it with. */ if (TYPE_CODE (check_typedef (value_type (arg1))) != TYPE_CODE_STRUCT) error (_("Can't do that unary op on that type")); /* FIXME be explicit */ value *argvec_storage[3]; gdb::array_view<value *> argvec = argvec_storage; argvec[1] = value_addr (arg1); argvec[2] = 0; nargs = 1; /* Make the right function name up. */ strcpy (tstr, "operator__"); ptr = tstr + 8; strcpy (mangle_tstr, "__"); switch (op) { case UNOP_PREINCREMENT: strcpy (ptr, "++"); break; case UNOP_PREDECREMENT: strcpy (ptr, "--"); break; case UNOP_POSTINCREMENT: strcpy (ptr, "++"); argvec[2] = value_from_longest (builtin_type (gdbarch)->builtin_int, 0); nargs ++; break; case UNOP_POSTDECREMENT: strcpy (ptr, "--"); argvec[2] = value_from_longest (builtin_type (gdbarch)->builtin_int, 0); nargs ++; break; case UNOP_LOGICAL_NOT: strcpy (ptr, "!"); break; case UNOP_COMPLEMENT: strcpy (ptr, "~"); break; case UNOP_NEG: strcpy (ptr, "-"); break; case UNOP_PLUS: strcpy (ptr, "+"); break; case UNOP_IND: strcpy (ptr, "*"); break; case STRUCTOP_PTR: strcpy (ptr, "->"); break; default: error (_("Invalid unary operation specified.")); } argvec[0] = value_user_defined_op (&arg1, argvec.slice (1, nargs), tstr, &static_memfuncp, noside); if (argvec[0]) { if (static_memfuncp) { argvec[1] = argvec[0]; argvec = argvec.slice (1); } if (TYPE_CODE (value_type (argvec[0])) == TYPE_CODE_XMETHOD) { /* Static xmethods are not supported yet. */ gdb_assert (static_memfuncp == 0); if (noside == EVAL_AVOID_SIDE_EFFECTS) { struct type *return_type = result_type_of_xmethod (argvec[0], argvec[1]); if (return_type == NULL) error (_("Xmethod is missing return type.")); return value_zero (return_type, VALUE_LVAL (arg1)); } return call_xmethod (argvec[0], argvec[1]); } if (noside == EVAL_AVOID_SIDE_EFFECTS) { struct type *return_type; return_type = TYPE_TARGET_TYPE (check_typedef (value_type (argvec[0]))); return value_zero (return_type, VALUE_LVAL (arg1)); } return call_function_by_hand (argvec[0], NULL, argvec.slice (1, nargs)); } throw_error (NOT_FOUND_ERROR, _("member function %s not found"), tstr); }
struct value * value_x_binop (struct value *arg1, struct value *arg2, enum exp_opcode op, enum exp_opcode otherop, enum noside noside) { struct value **argvec; char *ptr; char tstr[13]; int static_memfuncp; arg1 = coerce_ref (arg1); arg2 = coerce_ref (arg2); /* now we know that what we have to do is construct our arg vector and find the right function to call it with. */ if (TYPE_CODE (check_typedef (value_type (arg1))) != TYPE_CODE_STRUCT) error (_("Can't do that binary op on that type")); /* FIXME be explicit */ argvec = (struct value **) alloca (sizeof (struct value *) * 4); argvec[1] = value_addr (arg1); argvec[2] = arg2; argvec[3] = 0; /* Make the right function name up. */ strcpy (tstr, "operator__"); ptr = tstr + 8; switch (op) { case BINOP_ADD: strcpy (ptr, "+"); break; case BINOP_SUB: strcpy (ptr, "-"); break; case BINOP_MUL: strcpy (ptr, "*"); break; case BINOP_DIV: strcpy (ptr, "/"); break; case BINOP_REM: strcpy (ptr, "%"); break; case BINOP_LSH: strcpy (ptr, "<<"); break; case BINOP_RSH: strcpy (ptr, ">>"); break; case BINOP_BITWISE_AND: strcpy (ptr, "&"); break; case BINOP_BITWISE_IOR: strcpy (ptr, "|"); break; case BINOP_BITWISE_XOR: strcpy (ptr, "^"); break; case BINOP_LOGICAL_AND: strcpy (ptr, "&&"); break; case BINOP_LOGICAL_OR: strcpy (ptr, "||"); break; case BINOP_MIN: strcpy (ptr, "<?"); break; case BINOP_MAX: strcpy (ptr, ">?"); break; case BINOP_ASSIGN: strcpy (ptr, "="); break; case BINOP_ASSIGN_MODIFY: switch (otherop) { case BINOP_ADD: strcpy (ptr, "+="); break; case BINOP_SUB: strcpy (ptr, "-="); break; case BINOP_MUL: strcpy (ptr, "*="); break; case BINOP_DIV: strcpy (ptr, "/="); break; case BINOP_REM: strcpy (ptr, "%="); break; case BINOP_BITWISE_AND: strcpy (ptr, "&="); break; case BINOP_BITWISE_IOR: strcpy (ptr, "|="); break; case BINOP_BITWISE_XOR: strcpy (ptr, "^="); break; case BINOP_MOD: /* invalid */ default: error (_("Invalid binary operation specified.")); } break; case BINOP_SUBSCRIPT: strcpy (ptr, "[]"); break; case BINOP_EQUAL: strcpy (ptr, "=="); break; case BINOP_NOTEQUAL: strcpy (ptr, "!="); break; case BINOP_LESS: strcpy (ptr, "<"); break; case BINOP_GTR: strcpy (ptr, ">"); break; case BINOP_GEQ: strcpy (ptr, ">="); break; case BINOP_LEQ: strcpy (ptr, "<="); break; case BINOP_MOD: /* invalid */ default: error (_("Invalid binary operation specified.")); } argvec[0] = value_user_defined_op (&arg1, argvec + 1, tstr, &static_memfuncp, 2); if (argvec[0]) { if (static_memfuncp) { argvec[1] = argvec[0]; argvec++; } if (noside == EVAL_AVOID_SIDE_EFFECTS) { struct type *return_type; return_type = TYPE_TARGET_TYPE (check_typedef (value_type (argvec[0]))); return value_zero (return_type, VALUE_LVAL (arg1)); } return call_function_by_hand (argvec[0], 2 - static_memfuncp, argvec + 1); } throw_error (NOT_FOUND_ERROR, _("member function %s not found"), tstr); #ifdef lint return call_function_by_hand (argvec[0], 2 - static_memfuncp, argvec + 1); #endif }
struct value * value_x_binop (struct value *arg1, struct value *arg2, enum exp_opcode op, enum exp_opcode otherop, enum noside noside) { char *ptr; char tstr[13]; int static_memfuncp; arg1 = coerce_ref (arg1); arg2 = coerce_ref (arg2); /* now we know that what we have to do is construct our arg vector and find the right function to call it with. */ if (TYPE_CODE (check_typedef (value_type (arg1))) != TYPE_CODE_STRUCT) error (_("Can't do that binary op on that type")); /* FIXME be explicit */ value *argvec_storage[3]; gdb::array_view<value *> argvec = argvec_storage; argvec[1] = value_addr (arg1); argvec[2] = arg2; /* Make the right function name up. */ strcpy (tstr, "operator__"); ptr = tstr + 8; switch (op) { case BINOP_ADD: strcpy (ptr, "+"); break; case BINOP_SUB: strcpy (ptr, "-"); break; case BINOP_MUL: strcpy (ptr, "*"); break; case BINOP_DIV: strcpy (ptr, "/"); break; case BINOP_REM: strcpy (ptr, "%"); break; case BINOP_LSH: strcpy (ptr, "<<"); break; case BINOP_RSH: strcpy (ptr, ">>"); break; case BINOP_BITWISE_AND: strcpy (ptr, "&"); break; case BINOP_BITWISE_IOR: strcpy (ptr, "|"); break; case BINOP_BITWISE_XOR: strcpy (ptr, "^"); break; case BINOP_LOGICAL_AND: strcpy (ptr, "&&"); break; case BINOP_LOGICAL_OR: strcpy (ptr, "||"); break; case BINOP_MIN: strcpy (ptr, "<?"); break; case BINOP_MAX: strcpy (ptr, ">?"); break; case BINOP_ASSIGN: strcpy (ptr, "="); break; case BINOP_ASSIGN_MODIFY: switch (otherop) { case BINOP_ADD: strcpy (ptr, "+="); break; case BINOP_SUB: strcpy (ptr, "-="); break; case BINOP_MUL: strcpy (ptr, "*="); break; case BINOP_DIV: strcpy (ptr, "/="); break; case BINOP_REM: strcpy (ptr, "%="); break; case BINOP_BITWISE_AND: strcpy (ptr, "&="); break; case BINOP_BITWISE_IOR: strcpy (ptr, "|="); break; case BINOP_BITWISE_XOR: strcpy (ptr, "^="); break; case BINOP_MOD: /* invalid */ default: error (_("Invalid binary operation specified.")); } break; case BINOP_SUBSCRIPT: strcpy (ptr, "[]"); break; case BINOP_EQUAL: strcpy (ptr, "=="); break; case BINOP_NOTEQUAL: strcpy (ptr, "!="); break; case BINOP_LESS: strcpy (ptr, "<"); break; case BINOP_GTR: strcpy (ptr, ">"); break; case BINOP_GEQ: strcpy (ptr, ">="); break; case BINOP_LEQ: strcpy (ptr, "<="); break; case BINOP_MOD: /* invalid */ default: error (_("Invalid binary operation specified.")); } argvec[0] = value_user_defined_op (&arg1, argvec.slice (1), tstr, &static_memfuncp, noside); if (argvec[0]) { if (static_memfuncp) { argvec[1] = argvec[0]; argvec = argvec.slice (1); } if (TYPE_CODE (value_type (argvec[0])) == TYPE_CODE_XMETHOD) { /* Static xmethods are not supported yet. */ gdb_assert (static_memfuncp == 0); if (noside == EVAL_AVOID_SIDE_EFFECTS) { struct type *return_type = result_type_of_xmethod (argvec[0], argvec.slice (1)); if (return_type == NULL) error (_("Xmethod is missing return type.")); return value_zero (return_type, VALUE_LVAL (arg1)); } return call_xmethod (argvec[0], argvec.slice (1)); } if (noside == EVAL_AVOID_SIDE_EFFECTS) { struct type *return_type; return_type = TYPE_TARGET_TYPE (check_typedef (value_type (argvec[0]))); return value_zero (return_type, VALUE_LVAL (arg1)); } return call_function_by_hand (argvec[0], NULL, argvec.slice (1, 2 - static_memfuncp)); } throw_error (NOT_FOUND_ERROR, _("member function %s not found"), tstr); }