Cette semaine j'ai fait fonctionner l'extensibilité des objets. Les
tableaux et les objets peuvent donc maintenant avoir une taille
arbitraire (dans la limite de la mémoire disponible sur la machine). En
tout et partout, cela a pris 8.5h au lieu des 24h prévues.
J'en suis à réviser l'implémentation de la librairie standard en
javascript pour la porter à Photon. Étant donné la quantité de code
limitée, je pense implémenter les opérations majeures directement en
fonction du modèle objet de Photon. Comme il manquait le support pour
"call" et "apply" c'est ce que je suis en train de faire. "call"
fonctionne et est directement implémenté en JavaScript étendu:
Function.prototype.call = function ()
{
let (t = this, i = 0)
{
if ($arguments_length === 0)
{
this = @{["ref", photon.global]}@;
} else
{
this = $arguments[@0];
for (i=1; i < $arguments_length; ++i)
{
$arguments[@i-1] = $arguments[@i];
}
$arguments_length -= 1;
}
$closure = t;
}
@{["code",
[_op("pop", _EBP),
_op("jmp", _EAX)]]}@;
};
Je réfléchis à l'implémentation de "apply" étant donné que la taille du
"stack frame" n'est connu qu'à l'exécution. J'aurais pu écrire une
routine en assembleur créant le stack frame à partir du tableau
d'arguments mais pour éviter d'utiliser le stack pendant son exécution
pour l'envoi de messages, il faudrait que je fixe la représentation des
tableaux, ce qui contradit l'objectif premier de Photon, c'est-à-dire de
permettre la flexibilité dynamique au niveau de la représentation des
objets. Je regarde donc d'autres alternatives.
Avec mon voyage à Rimouski et les préparatifs des fêtes j'ai eu moins de
temps que prévu pour travailler sur Photon. Si tout se passe bien dans
les 3 prochains jours, je pense terminer le support pour la librairie
standard et le reste de JavaScript nécessaire pour le bootstrap. Je
n'aurai cependant pas le temps de valider le bootstrap à proprement parler.
Erick