SEXP pycall__funname(SEXP Rmodule_name, SEXP Rfun_name, SEXP Rargv_list, SEXP Rargv_dict) { #ifdef REMBEDPY_DEBUG Rprintf("funname\n"); #endif std::string fun_name(Rcpp::as<std::string>(Rfun_name)), module_name(Rcpp::as<std::string>(Rmodule_name)); boost::python::object callable(RembedPy::extract_pyobj(fun_name, module_name)); boost::python::list argv_list(RembedPy::extract_argv_list(Rargv_list)); boost::python::dict argv_dict(RembedPy::extract_argv_dict(Rargv_dict)); return RembedPy::pycall(callable, argv_list, argv_dict); }
static int cmd_bt(char *args) { swaddr_t prev_ebp=cpu.ebp; swaddr_t ret_addr=swaddr_read(prev_ebp+4, 4, R_SS); //printf("prev_ebp:%x, addr:%x\n",prev_ebp,ret_addr); int count=1; int n=4; char* NowName=fun_name(cpu.eip); if (NowName!=NULL) printf("#0 0x%x in %s(",ret_addr+1,NowName); swaddr_t var_addr=prev_ebp+8; while (n>0) { printf("%d,",swaddr_read(var_addr, 4, R_SS)); var_addr+=4; n--; } printf("\b)\n"); while (prev_ebp!=0){ prev_ebp=swaddr_read(prev_ebp, 4, R_SS); //ret_addr=swaddr_read(prev_ebp+4,4); if (prev_ebp==0) break; printf("#%d 0x%x in ",count++,ret_addr+1); char* FunName=fun_name(ret_addr); if (FunName!=NULL) printf("%s(",FunName); var_addr=prev_ebp+8; n=5; while (n>0) { printf("%d,",swaddr_read(var_addr, 4, R_SS)); var_addr+=4; n--; } printf("\b)\n"); //prev_ebp=swaddr_read(prev_ebp,4); ret_addr=swaddr_read(prev_ebp+4, 4, R_SS); } return 0; }