ELEVENWORDINLINE cuándo usarlo?

Siempre me preguntaba qué puedo hacer con esas cosas:

ONEWORDINLINE(w1) TWOWORDINLINE(w1, w2) THREEWORDINLINE(w1, w2, w3) 

hasta

 TENWORDINLINE(w1, w2, w3, w4, w5, w6, w7, w8, w9, w10) ELEVENWORDINLINE(w1, w2, w3, w4, w5, w6, w7, w8, w9, w10, w11) TWELVEWORDINLINE(w1, w2, w3, w4, w5, w6, w7, w8, w9, w10, w11, w12) 
  1. ¿Cómo usar estas macros?
  2. ¿Cuándo usarlos?
  3. ¿Por qué de 1 a 12 y no a … 100 por ejemplo?

Esa es la tecnología muerta hace mucho time de los antiguos progtwigdores de Mac, el centinela de una tumba que no ha sido tocada. Pero, si estás interesado, ¡vamos, valiente aventurero!

Aquí están los #define -s directos de Apple :

 #define ONEWORDINLINE(w1) = w1 #define TWOWORDINLINE(w1,w2) = {w1,w2} #define THREEWORDINLINE(w1,w2,w3) = {w1,w2,w3} /* ...etc... */ #define TWELVEWORDINLINE(w1,w2,w3,w4,w5,w6,w7,w8,w9,w10,w11,w12) = {w1,w2,w3,w4,w5,w6,w7,w8,w9,w10,w11,w12} 

Ahora a algunas explicaciones.

Una pequeña lección de historia: en los times antiguos en los que Mac se implementó para el Motorola 68k (tan antiguo), Apple configuró sus llamadas de sistema de la siguiente manera muy compacta y muy utilizable : las asignaron a palabras que comienzan con 1010b ( 0xA ), ya que fueron reservados por los desarrolladores de Motorola para este uso. Estas sys-llamadas y sus mapeos se llamaron A-Traps para este valor hexadecimal (sin relación con "¡ES UNA TRAPIA!" , Sinceramente). Se veían así en hexadecimal: 0xA869 (este ejemplo es el A-Trap para la FixRatio(short numer, short denom) del sistema FixRatio(short numer, short denom) ). Esta tecnología fue creada originalmente para Mac Toolbox API .

Cuando un comstackdor de orientación de Mac-en-68k (estos deberían establecer las macros TARGET_OS_MAC y TARGET_CPU_68K como 1 o TRUE y TARGET_RT_MAC_CFM como 0 o FALSE , BTW) vio un prototipo de function con una asignación ( = ) después de él, trató el prototipo como haciendo reference a una llamada del sistema A-Trap indicada por el valor de A-Trap a la derecha del operador de asignación, que podría ser un valor integer de una sola palabra literal que comienza con 0xA ( 0xA??? ). Por lo tanto, ONEWORDINLINE era básicamente una elegante macro-forma de decir "¡es una A-Trap!".

Entonces, esto es lo que sería una statement de prototipo de la function sys-call para 68k:

 EXTERN_API(Fixed) FixRatio(short numer, short denom) ONEWORDINLINE(0xA869); 

Esto sería preprocesado para algo como esto:

 extern Fixed FixRatio(short numer, short denom) = 0xA869; 

Ahora, podría estar pensando: si indexamos las llamadas del sistema con una sola palabra y una cuarta parte de esa palabra la toma el enorme 0xA , eso sería solo 4096 funciones como máximo (en realidad había mucho less, como muchas Las A-Traps realmente se asignaron al mismo sistema: llamar a las subrutinas, pero con diferentes parameters), ¿cómo es eso suficiente? Bueno, obviamente, no es así. Ahí es donde entran los selectores .

A-Traps como _HFSDispatch ( 0xA260 ) se llamaban "selectores" porque tenían el trabajo de seleccionar y llamar a otra subrutina determinada por valores en la stack. Por lo tanto, cuando un prototipo de function fue "asignado" a una "matriz" de literales integers de una sola palabra, todos excepto el último (llamado el (los) código (s) selector (es ) fueron empujados a la stack y el último fue tratado como A -Trap selector que agarró las palabras insertadas en la stack y llamó a la subrutina adecuada. El número máximo de palabras en una matriz de este tipo era 12 porque eso era suficiente para Mac Toolbox.

Las macros TWOWORDINLINE través de TWELVEWORDINLINE manejaron el selector A-Traps. Por ejemplo:

 EXTERN_API(OSErr) ActivateTSMDocument(TSMDocumentID idocID) TWOWORDINLINE(0x7002, 0xAA54); 

sería preprocesado a algo así

 extern OSErr ActivateTSMDocument(TSMDocumentID idocID) = {0x7002, 0xAA54}; 

Aquí, 0x7002 es el código selector y 0xAA54 es el selector A-Trap.

Por lo tanto, para resumirlo todo, solo lo necesita si quiere hacer alguna encoding para Mac-s anterior a 1994 que se ejecuta en un Motorola 68k. Entonces ios no está realmente en su lugar aquí;)

Descargo de responsabilidad: Sé esto solo en teoría y es posible que haya cometido un error en alguna parte. Si hay veteranos experimentados con estas cosas, ¡corríjanme si tengo algo mal!