void llamarSinRetorno (t_nombre_etiqueta etiqueta){ if(status_check() != EXECUTING) return; t_ret_var * ret_var_addr = calloc(1, sizeof(t_ret_var)); t_stack * stack_index = actual_pcb->stack_index; //1) Creo la nueva entrada del stack t_stack_entry* new_stack_entry = create_new_stack_entry(); //2) Guardo la posicion de PC actual como retpos de la nueva entrada new_stack_entry->ret_pos = actual_pcb->program_counter; //3) Agrego la strack entry a la queue de stack queue_push(actual_pcb->stack_index, new_stack_entry); //4) Asigno el PC a la etiqueta objetivo irAlLabel(etiqueta); }
void llamarSinRetorno(t_nombre_etiqueta etiqueta) { if (SEG_flag == 1) return; printf("llamasSinRetorno\n"); char** partes = string_split(etiqueta, "\n"); etiqueta = partes[0]; //Se arma estructura para solicitar envio de bytes a la UMV t_struct_env_bytes * send_punteros = malloc(sizeof(t_struct_env_bytes)); send_punteros->base = var_seg_stack; send_punteros->offset = temp_cursor_stack + var_tamanio_contexto * 5; send_punteros->tamanio = 2 * sizeof(int); void * temp_buffer = malloc(2 * sizeof(int)); int offset; memcpy(temp_buffer, &temp_cursor_stack, offset = sizeof(int)); memcpy(temp_buffer + offset, &temp_counter, sizeof(int)); send_punteros->buffer = temp_buffer; //Se envia solicitud de envio de bytes a la UMV socket_enviar(sockUMV, D_STRUCT_ENV_BYTES, send_punteros); void * structRecibido; t_tipoEstructura tipoStruct; //Recibe respuesta de la UMV socket_recibir(sockUMV, &tipoStruct, &structRecibido); //Valida respuesta if (tipoStruct != D_STRUCT_NUMERO) { printf("Respuesta en desreferenciar incorrecta\n"); //return 0; } int recepcion = ((t_struct_numero*) structRecibido)->numero; excepcion_UMV(recepcion); temp_cursor_stack = temp_cursor_stack + (var_tamanio_contexto * 5) + 8; irAlLabel(etiqueta); //le asignamos al program_counter la proxima ejecucion a ejecutar dentro del procedimiento log_escribir(archLog,"Se termina de ejecutar una instruccion",INFO,"Se ejecuto llamarSinRetorno"); dictionary_clean_and_destroy_elements(dicc_variables, free); var_tamanio_contexto = 0; //Se libera espacio alocado free(temp_buffer); free(send_punteros); free(partes[0]); free(partes[1]); free(partes); }
void llamarConRetorno(t_nombre_etiqueta etiqueta, t_puntero donde_retornar) { if(status_check() != EXECUTING) return; t_ret_var * ret_var_addr = calloc(1, sizeof(t_ret_var)); //1) Obtengo la direccion a donde apunta la variable de retorno ret_var_addr = armar_direccion_logica_variable(donde_retornar, setup->PAGE_SIZE); t_stack_entry * actual_stack_entry = get_last_entry(actual_pcb->stack_index); //2) Creo la nueva entrada del stack t_stack_entry* new_stack_entry = create_new_stack_entry(); //3) Guardo la posicion de PC actual como retpos de la nueva entrada new_stack_entry->pos = actual_stack_entry->pos + 1; new_stack_entry->ret_pos = actual_pcb->program_counter; //4) Agrego la retvar a la entrada add_ret_var(&new_stack_entry, ret_var_addr); //5) Agrego la strack entry a la queue de stack queue_push(actual_pcb->stack_index, new_stack_entry); // (t_stack_entry*) list_get(actual_pcb->stack_index->elements, 1) //6) Asigno el PC a la etiqueta objetivo irAlLabel(etiqueta); }