source: trunk/submodules/xc_disassembler.c @ 982

Last change on this file since 982 was 982, checked in by moo, 22 months ago

move files to subdirs

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