Ejemplo n.º 1
0
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);

}
Ejemplo n.º 3
0
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);
}