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