source: trunk/disassembler.c @ 1

Last change on this file since 1 was 1, checked in by moo, 8 years ago

initial import to online

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