}
#ifndef ZTS
-static inline int prepare_string_for_scanning(zval *str)
+static inline int prepare_string_for_scanning(zval *str, char *filename)
#else
-static inline int prepare_string_for_scanning(zval *str, istrstream **input_stream CLS_DC)
+static inline int prepare_string_for_scanning(zval *str, istrstream **input_stream, char *filename CLS_DC)
#endif
{
#ifndef ZTS
CG(ZFL)->switch_streams(*input_stream, &cout);
#endif
- zend_set_compiled_filename("Eval code");
+ zend_set_compiled_filename(filename);
CG(zend_lineno) = 1;
return SUCCESS;
}
-zend_op_array *compile_string(zval *source_string CLS_DC)
+zend_op_array *compile_string(zval *source_string, char *filename CLS_DC)
{
zend_lex_state original_lex_state;
zend_op_array *op_array = (zend_op_array *) emalloc(sizeof(zend_op_array));
save_lexical_state(&original_lex_state CLS_CC);
#ifndef ZTS
- if (prepare_string_for_scanning(source_string)==FAILURE) {
+ if (prepare_string_for_scanning(source_string, filename)==FAILURE) {
#else
- if (prepare_string_for_scanning(source_string, &input_stream CLS_CC)==FAILURE) {
+ if (prepare_string_for_scanning(source_string, &input_stream, filename CLS_CC)==FAILURE) {
#endif
efree(op_array);
retval = NULL;
return SUCCESS;
}
-
-int highlight_string(zval *str, zend_syntax_highlighter_ini *syntax_highlighter_ini)
+int highlight_string(zval *str, zend_syntax_highlighter_ini *syntax_highlighter_ini, char *str_name)
{
zend_lex_state original_lex_state;
zval tmp = *str;
zval_copy_ctor(str);
save_lexical_state(&original_lex_state CLS_CC);
#ifndef ZTS
- if (prepare_string_for_scanning(str)==FAILURE) {
+ if (prepare_string_for_scanning(str, str_name)==FAILURE) {
#else
- if (prepare_string_for_scanning(str, &input_stream CLS_CC)==FAILURE) {
+ if (prepare_string_for_scanning(str, &input_stream, str_name CLS_CC)==FAILURE) {
#endif
return FAILURE;
}
return SUCCESS;
}
+#define COMPILED_STRING_DESCRIPTION_FORMAT "%s(%d) : %s"
+
+ZEND_API char *zend_make_compiled_string_description(char *name)
+{
+ char *cur_filename;
+ int cur_lineno;
+ char *compiled_string_description;
+ CLS_FETCH();
+ ELS_FETCH();
+
+ if (zend_is_compiling()) {
+ cur_filename = zend_get_compiled_filename(CLS_C);
+ cur_lineno = zend_get_compiled_lineno(CLS_C);
+ } else if (zend_is_executing()) {
+ cur_filename = zend_get_executed_filename(ELS_C);
+ cur_lineno = zend_get_executed_lineno(ELS_C);
+ } else {
+ cur_filename = "Unknown";
+ cur_lineno = 0;
+ }
+
+ compiled_string_description = emalloc(sizeof(COMPILED_STRING_DESCRIPTION_FORMAT)+strlen(name)+strlen(cur_filename)+MAX_LENGTH_OF_LONG);
+ sprintf(compiled_string_description, COMPILED_STRING_DESCRIPTION_FORMAT, cur_filename, cur_lineno, name);
+ return compiled_string_description;
+}
+
int eval_code_length, function_name_length;
zval **z_function_args, **z_function_code;
int retval;
+ char *eval_name;
CLS_FETCH();
if (ZEND_NUM_ARGS()!=2 || zend_get_parameters_ex(2, &z_function_args, &z_function_code)==FAILURE) {
eval_code = (char *) emalloc(eval_code_length);
sprintf(eval_code, "function " LAMBDA_TEMP_FUNCNAME "(%s){%s}", Z_STRVAL_PP(z_function_args), Z_STRVAL_PP(z_function_code));
- retval = zend_eval_string(eval_code, NULL CLS_CC ELS_CC);
+ eval_name = zend_make_compiled_string_description("runtime-created function");
+ retval = zend_eval_string(eval_code, NULL, eval_name CLS_CC ELS_CC);
efree(eval_code);
+ efree(eval_name);
+
if (retval==SUCCESS) {
zend_function *func;
/* helper functions in zend-scanner.l */
ZEND_API zend_op_array *compile_file(zend_file_handle *file_handle, int type CLS_DC);
-ZEND_API zend_op_array *compile_string(zval *source_string CLS_DC);
+ZEND_API zend_op_array *compile_string(zval *source_string, char *filename CLS_DC);
ZEND_API zend_op_array *compile_filename(int type, zval *filename CLS_DC ELS_DC);
ZEND_API int zend_execute_scripts(int type CLS_DC ELS_DC, int file_count, ...);
ZEND_API int open_file_for_scanning(zend_file_handle *file_handle CLS_DC);
int pass_two(zend_op_array *op_array);
zend_brk_cont_element *get_next_brk_cont_element(zend_op_array *op_array);
ZEND_API zend_bool zend_is_compiling(void);
+ZEND_API char *zend_make_compiled_string_description(char *name);
int zendlex(znode *zendlval CLS_DC);
break;
case ZEND_INCLUDE:
case ZEND_REQUIRE:
- {
new_op_array = compile_filename(opline->op2.u.constant.value.lval, inc_filename CLS_CC ELS_CC);
break;
- }
- case ZEND_EVAL:
- new_op_array = compile_string(inc_filename CLS_CC);
+ case ZEND_EVAL: {
+ char *eval_desc = zend_make_compiled_string_description("eval()'d code");
+
+ new_op_array = compile_string(inc_filename, eval_desc CLS_CC);
+ efree(eval_desc);
+ }
break;
EMPTY_SWITCH_DEFAULT_CASE()
}
;
#endif
-ZEND_API int zend_eval_string(char *str, zval *retval_ptr CLS_DC ELS_DC);
+ZEND_API int zend_eval_string(char *str, zval *retval_ptr, char *string_name CLS_DC ELS_DC);
ZEND_API inline int i_zend_is_true(zval *op)
#if defined(C9X_INLINE_SEMANTICS)
{
}
-ZEND_API int zend_eval_string(char *str, zval *retval_ptr CLS_DC ELS_DC)
+ZEND_API int zend_eval_string(char *str, zval *retval_ptr, char *string_name CLS_DC ELS_DC)
{
zval pv;
zend_op_array *new_op_array;
original_handle_op_arrays = CG(handle_op_arrays);
CG(handle_op_arrays) = 0;
- new_op_array = compile_string(&pv CLS_CC);
+ new_op_array = compile_string(&pv, string_name CLS_CC);
CG(handle_op_arrays) = original_handle_op_arrays;
if (new_op_array) {
BEGIN_EXTERN_C()
ZEND_API void zend_highlight(zend_syntax_highlighter_ini *syntax_highlighter_ini);
int highlight_file(char *filename, zend_syntax_highlighter_ini *syntax_highlighter_ini);
-int highlight_string(zval *str, zend_syntax_highlighter_ini *syntax_highlighter_ini);
+int highlight_string(zval *str, zend_syntax_highlighter_ini *syntax_highlighter_ini, char *str_name);
ZEND_API void zend_html_putc(char c);
ZEND_API void zend_html_puts(char *s, uint len);
END_EXTERN_C()