2011-10-04 1 views
1

Nous avons fait une extension de Zend que nous voulons écrire les adresses de l'écho de zval est censé écrire, mais nous ne pouvons pas comprendre comment les recevoir car nous avons remarqué qu'il y a une différence entre écho "test"; et $ a = "test"; echo $ a; Comment obtenir les arguments, peu importe s'il s'agit d'une variable ou non?Extension Zend, obtenez des arguments d'écho?

+0

Voir ma réponse. Bien que cela devrait fonctionner, je me demande pourquoi vous en avez besoin? Peut-être que vous prenez la mauvaise approche, ou la bonne approche du mauvais problème. – Flavius

+0

Eh bien, Nous essayons d'implémenter une sorte d'altération dans un module, et notre approche est la suivante (pour un TRÈS SIMPLE) 1. Au démarrage de l'exécution, obtenir l'adresse des zvals pour les éléments $ _GET (DONE) 2 Sur écho, obtenez l'adresse de l'adresse du zval en écho et vérifiez si c'est l'un des zvals de _GET. (NON FAIT - Avoir le crochet sur l'écho) Est-ce que cela semble légitime? –

+0

Oui, c'est le cas, pour une teinture TRES SIMPLE, comme vous l'avez dit - ma solution devrait fonctionner. Dans mon (petit) temps libre, je travaille sur quelque chose en rapport: une extension qui va permettre aux scripts php d'utiliser des fonctions d'analyse de code statique, ce qui peut être intéressant pour vous aussi. – Flavius

Répondre

0

Le gestionnaire d'écho est

static int ZEND_FASTCALL ZEND_ECHO_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) 
{ 
    zend_op *opline = EX(opline); 

    zval z_copy; 
    zval *z = &opline->op1.u.constant; 

    if (IS_CONST != IS_CONST && 
     Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get_method != NULL && 
     zend_std_cast_object_tostring(z, &z_copy, IS_STRING TSRMLS_CC) == SUCCESS) { 
     zend_print_variable(&z_copy); 
     zval_dtor(&z_copy); 
    } else { 
     zend_print_variable(z); 
    } 

    ZEND_VM_NEXT_OPCODE(); 
} 

de Zend/zend_vm_execute.h, et comme vous pouvez voir tout ce qu'il fait essentiellement est d'appeler zend_print_variable().

Accrocher cette fonction et vous devriez être sur la bonne voie.

Bonus: cela fonctionne également pour les instructions print.

+0

Maintenant, je commence à me perdre dans le code Zend, j'utilise zend_set_user_opcode_handler (ZEND_ECHO, echo_handler); méthode de hook sur écho, qui est déclenchée à chaque fois comme prévu, mais le opline-> op1.op_type est 4 (IS_VAR) et ce qui signifie que op1.u.contant ne tiendra pas le zval avec la valeur, mais je découvre comment l'extraire de execute_data ... Existe-t-il une documentation disponible pour la structure de execute_data en plus du code source? –

+0

EDIT: Je n'arrive pas à comprendre comment extraire le zval de execute_data, quand op1.op_type est IS_VAR –

+0

Je suis toujours perdu:/Le gestionnaire auquel vous faites référence est seulement pour quand op1.optype est IS_CONST, mais le ZEND_ECHO_SPEC_VAR_HANDLER utilise une autre façon d'accéder au zval de l'écho, cependant si j'utilise la même approche que ZEND_ECHO_SPEC_VAR_HANDLER, il essaie d'accéder à certaines données "aléatoires", car le pointeur semble être non défini/jamais défini. Est-il possible de se connecter directement au ZEND_ECHO_SPEC_VAR_HANDLER plutôt qu'à un opcode echo? –

Questions connexes