source: trunk/disassembler.c @ 709

Last change on this file since 709 was 709, checked in by moo, 4 years ago

disassembler: don't dump builtin functions

  • Property svn:eol-style set to native
File size: 4.1 KB
RevLine 
[1]1#include "disassembler.h"
2#include "xcache.h"
3#include "utils.h"
4#include "processor.h"
5
6#define return_value dst
7
[709]8/* sandbox {{{ */
9#undef TG
10#undef OG
11#define TG(x) (sandbox->tmp_##x)
12#define OG(x) (sandbox->orig_##x)
13/* }}} */
14
[8]15#ifndef HAVE_XCACHE_OPCODE_SPEC_DEF
16#error disassembler cannot be built without xcache/opcode_spec_def.h
17#endif
[709]18static void xc_dasm(xc_sandbox_t *sandbox, zval *dst, zend_op_array *op_array TSRMLS_DC) /* {{{ */
[1]19{
20    Bucket *b;
21    zval *zv, *list;
22    xc_compile_result_t cr;
23    int bufsize = 2;
24    char *buf;
25    int keysize;
26
27    xc_compile_result_init_cur(&cr, op_array TSRMLS_CC);
28
29    xc_apply_op_array(&cr, (apply_func_t) xc_undo_pass_two TSRMLS_CC);
30    xc_apply_op_array(&cr, (apply_func_t) xc_fix_opcode TSRMLS_CC);
31
32    /* go */
33    array_init(dst);
34
35    ALLOC_INIT_ZVAL(zv);
36    array_init(zv);
37    xc_dasm_zend_op_array(zv, op_array TSRMLS_CC);
38    add_assoc_zval_ex(dst, ZEND_STRS("op_array"), zv);
39
40    ALLOC_INIT_ZVAL(list);
41    array_init(list);
[709]42    b = TG(internal_function_tail) ? TG(internal_function_tail)->pListNext : TG(function_table).pListHead;
43    for (; b; b = b->pListNext) {
44        ALLOC_INIT_ZVAL(zv);
45        array_init(zv);
46        xc_dasm_zend_function(zv, b->pData TSRMLS_CC);
47
48        add_u_assoc_zval_ex(list, BUCKET_KEY_TYPE(b), b->arKey, b->nKeyLength, zv);
49    }
[1]50    add_assoc_zval_ex(dst, ZEND_STRS("function_table"), list);
51   
52    buf = emalloc(bufsize);
53    ALLOC_INIT_ZVAL(list);
54    array_init(list);
[709]55    b = TG(internal_class_tail) ? TG(internal_class_tail)->pListNext : TG(class_table).pListHead;
56    for (; b; b = b->pListNext) {
[1]57        ALLOC_INIT_ZVAL(zv);
58        array_init(zv);
59        xc_dasm_zend_class_entry(zv, CestToCePtr(*(xc_cest_t *)b->pData) TSRMLS_CC);
60
61        keysize = BUCKET_KEY_SIZE(b) + 2;
62        if (keysize > bufsize) {
63            do {
64                bufsize *= 2;
65            } while (keysize > bufsize);
66            buf = erealloc(buf, bufsize);
67        }
[200]68        memcpy(buf, BUCKET_KEY_S(b), keysize);
[1]69        buf[keysize - 2] = buf[keysize - 1] = ""[0];
70        keysize = b->nKeyLength;
71#ifdef IS_UNICODE
72        if (BUCKET_KEY_TYPE(b) == IS_UNICODE) {
73            if (buf[0] == ""[0] && buf[1] == ""[0]) {
74                keysize ++;
75            }
76        } else
77#endif
78        {
79            if (buf[0] == ""[0]) {
80                keysize ++;
81            }
82        }
[504]83        add_u_assoc_zval_ex(list, BUCKET_KEY_TYPE(b), ZSTR(buf), b->nKeyLength, zv);
[1]84    }
85    efree(buf);
86    add_assoc_zval_ex(dst, ZEND_STRS("class_table"), list);
87
88    /*xc_apply_op_array(&cr, (apply_func_t) xc_redo_pass_two TSRMLS_CC);*/
89    xc_compile_result_free(&cr);
90
91    return;
92}
93/* }}} */
94void xc_dasm_string(zval *dst, zval *source TSRMLS_DC) /* {{{ */
95{
96    int catched;
97    zend_op_array *op_array = NULL;
98    xc_sandbox_t sandbox;
99    char *eval_name = zend_make_compiled_string_description("runtime-created function" TSRMLS_CC);
100
101    xc_sandbox_init(&sandbox, eval_name TSRMLS_CC);
102
103    catched = 0;
104    zend_try {
105        op_array = compile_string(source, eval_name TSRMLS_CC);
106    } zend_catch {
107        catched = 1;
108    } zend_end_try();
109
110    if (catched || !op_array) {
111        goto err_compile;
112    }
113
[709]114    xc_dasm(&sandbox, dst, op_array TSRMLS_CC);
[1]115
116    /* free */
117    efree(eval_name);
[289]118#ifdef ZEND_ENGINE_2
[1]119    destroy_op_array(op_array TSRMLS_CC);
[289]120#else
121    destroy_op_array(op_array);
122#endif
[1]123    efree(op_array);
124    xc_sandbox_free(&sandbox, 0 TSRMLS_CC);
125    return;
126
127err_compile:
128    efree(eval_name);
129    xc_sandbox_free(&sandbox, 0 TSRMLS_CC);
130
131    RETURN_FALSE;
132}
133/* }}} */
134void xc_dasm_file(zval *dst, const char *filename TSRMLS_DC) /* {{{ */
135{
136    int catched;
137    zend_op_array *op_array = NULL;
138    xc_sandbox_t sandbox;
139    zval *zfilename;
140
141    MAKE_STD_ZVAL(zfilename);
142    zfilename->value.str.val = estrdup(filename);
143    zfilename->value.str.len = strlen(filename);
144    zfilename->type = IS_STRING;
145
146    xc_sandbox_init(&sandbox, zfilename->value.str.val TSRMLS_CC);
147
148    catched = 0;
149    zend_try {
150        op_array = compile_filename(ZEND_REQUIRE, zfilename TSRMLS_CC);
151    } zend_catch {
152        catched = 1;
153    } zend_end_try();
154
155    if (catched || !op_array) {
156        goto err_compile;
157    }
158
[709]159    xc_dasm(&sandbox, dst, op_array TSRMLS_CC);
[1]160
161    /* free */
[289]162#ifdef ZEND_ENGINE_2
[1]163    destroy_op_array(op_array TSRMLS_CC);
[289]164#else
165    destroy_op_array(op_array);
166#endif
[1]167    efree(op_array);
168    xc_sandbox_free(&sandbox, 0 TSRMLS_CC);
169    zval_dtor(zfilename);
170    FREE_ZVAL(zfilename);
171    return;
172
173err_compile:
174    xc_sandbox_free(&sandbox, 0 TSRMLS_CC);
175
176    zval_dtor(zfilename);
177    FREE_ZVAL(zfilename);
178    RETURN_FALSE;
179}
180/* }}} */
Note: See TracBrowser for help on using the repository browser.