Ver Mensaje Individual
  #2  
Antiguo 12-08-2008
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Reputación: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
¡Hola!

Hasta hoy me entero de la palabra reservada At. Es interesante lo que dice la ayuda al respecto:
Cita:
Use this option to raise the exception from an earlier point in the stack than the one where the error actually occurred.
[Utilice esta opción para elevar la excepción desde un punto previo en la pila que desde donde ocurrió realmente el error.]

Todavía no lo tengo claro del todo, pero, al buscar la expresión regular "Raise .* At " en la carpeta C:\Archivos de programa\Borland\Delphi7\Source, encontré que Borland lo utilizó en varias ocasiones.

Al ver el código fuente del famoso procedimiento Abort en la unidad SysUtils:
Código Delphi [-]
procedure Abort;

  function ReturnAddr: Pointer;
  asm
          MOV     EAX,[EBP + 4]
  end;

begin
  raise EAbort.CreateRes(@SOperationAborted) at ReturnAddr;
end;
Se observa que la excepción es elevada en la dirección de memoria devuelta por la función anidada ReturnAddr. Esta función le asigna al registro de la CPU EAX el valor que se encuentra en la dirección de memoria EBP + 4. Y ese es el valor que devuelve, ya que normalmente una función regresa el valor que se encuentra en el registro EAX. Ahora sólo habría que investigar qué suele guardar el registro de CPU EBP en Delphi para tener una idea más precisa de qué dirección en concreto se está usando para elevar la excepción.

Mientras tanto infiero que al ejecutar el procedimiento Abort de esta manera:
Código Delphi [-]
Procedure MiRutina;
Begin
  ...
  Abort;
la excepción se elevará en la dirección de memoria donde hemos hecho la llamada a Abort y no donde Abort ejecuta la instrucción Raise. Lo cual, para fines de depuración es muy conveniente, ya que el depurador nos dirá que se elevó una excepción formalmente dentro de MiRutina y no dentro del procedimiento Abort. Abort es un procedimiento utilitario para simplificar la elevación de una excepción silenciosa, pero la manera en que hace dicha elevación (con At), ayuda a que suceda como si en lugar de Abort hubiésemos escrito nosotros mismos una instrucción Raise, según parece.

Encontré este interesante artículo relacionado con el tema:
http://www.latiumsoftware.com/es/pascal/0014.php

Y este par de referencias adicionales que hablan del registro EBP:
http://akimpech.izt.uam.mx/Web_jr/ami05/convC.pdf
http://www.hackemate.com.ar/ezines/d...nts004/0X1.txt

Espero haber ayudado.

Al.

Última edición por Al González fecha: 12-08-2008 a las 16:38:30.
Responder Con Cita