source: branches/1.3/disassembler.c @ 622

Last change on this file since 622 was 622, checked in by moo, 5 years ago

merged r504:513 from trunk

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