blob: 32d807a3354e993715599eefe7fa2a07d0c6d1a7 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
/**
* Eval.cpp
*
* This file holds the implementation for the Php::eval() function
*
* @author andot <https://github.com/andot>
*/
/**
* Dependencies
*/
#include "includes.h"
/**
* Open PHP namespace
*/
namespace Php {
/**
* Evaluate a PHP string
* @param phpCode The PHP code to evaluate
* @return Value The result of the evaluation
*/
Value eval(const std::string &phpCode)
{
// we need the tsrm_ls variable
TSRMLS_FETCH();
// the current exception
zval* oldException = EG(exception);
// the return zval
zval* retval = nullptr;
if (zend_eval_stringl_ex((char *)phpCode.c_str(), (int32_t)phpCode.length(), retval, (char *)"", 1 TSRMLS_CC) != SUCCESS)
{
// Do we want to throw an exception here? The original author of this code
// did, but there are some reasons not to:
//
// 1. the PHP eval() function also does not throw exceptions.
//
// 2. the zend_eval_string() function already triggers a
// 'PHP parse error' when an error occurs, which also has
// to be handled. If we also throw an exception here, the
// user will have to write two error checks: for the error
// and the exception.
//
// if we _do_ want to throw an exception, we will first have to
// prevent the original zend_error to occur, and then turn it
// into an exception. An exception would be nicer from a C++
// point of view, but because of the extra complexity, we do not
// this for now.
return nullptr;
}
else
{
// was an exception thrown inside the eval()'ed code? In that case we
// throw a C++ new exception to give the C++ code the chance to catch it
if (oldException != EG(exception) && EG(exception)) throw OrigException(EG(exception) TSRMLS_CC);
// no (additional) exception was thrown
return retval ? Value(retval) : nullptr;
}
}
/**
* End of namespace
*/
}
|