On Mon, Aug 12, 2024 at 9:58 AM John Coggeshall <j...@coggeshall.org> wrote:

>
> > I’m considering adding some C++ enhancements to the Zend API.
>
>
> I would definitely like to see an RFC for this if it was to be considered.
> To me, adding a whole new way of doing things internally without completely
> removing the old way is just asking for a more brittle, potentially less
> secure, and harder to maintain codebase. The win of making it easier /
> "nicer" on a subset of developers who might prefer a C++ interface isn't
> anywhere near worth the risk IMO.
>

You aren't making any sense. Why would we remove the old way? Or why should
that be a prerequisite to improving the current API? How are functions that
simply proxy the C API inherently 'more brittle, potentially less secure,
and harder to maintain'? You haven't even seen the code in question?

```cxx
    TVal(const zval *other) : TVal() { ZVAL_COPY(this, other); }
    TVal(zend_long value) : TVal() { ZVAL_LONG(this, value); }
    TVal(int value) : TVal() { ZVAL_LONG(this, value); }
    TVal(size_t value) : TVal() { ZVAL_LONG(this, value); }
    TVal(bool value) : TVal() { ZVAL_BOOL(this, value); }
    TVal(std::string_view value) : TVal() { ZVAL_STRINGL(this,
value.data(), value.size()); }
    TVal(double value) : TVal() { ZVAL_DOUBLE(this, value); }
    TVal(const char *value) : TVal() { ZVAL_STRING(this, value); }
    TVal(const std::string &value) : TVal() { ZVAL_STRINGL(this,
value.c_str(), value.size()); }
    bool IsNull() const { return Z_TYPE_P(this) == IS_NULL; }
    bool IsTrue() const { return Z_TYPE_P(this) == IS_TRUE; }
    bool IsFalse() const { return Z_TYPE_P(this) == IS_FALSE; }
    bool IsBool() const { return Z_TYPE_P(this) == IS_TRUE ||
Z_TYPE_P(this) == IS_FALSE; }
    bool IsLong() const { return Z_TYPE_P(this) == IS_LONG; }
    bool IsDouble() const { return Z_TYPE_P(this) == IS_DOUBLE; }
    bool IsString() const { return Z_TYPE_P(this) == IS_STRING; }
    bool IsArray() const { return Z_TYPE_P(this) == IS_ARRAY; }
    bool IsObject() const { return Z_TYPE_P(this) == IS_OBJECT; }
    bool IsInstanceOf(zend_class_entry *ce) const {
        return Z_TYPE_P(this) == IS_OBJECT && (ce == Z_OBJCE_P(this) ||
instanceof_function(Z_OBJCE_P(this), ce));
    }
    bool IsCallable() const { return zend_is_callable((zval *) this, 0,
nullptr); }
    bool IsResource() const { return Z_TYPE_P(this) == IS_RESOURCE; }
    bool IsReference() const { return Z_ISREF_P(this); }
```

The above is a snippet from my current implementation, so please elaborate
on which part of that is so crazy to you.

Cheers,
Lanre.

Reply via email to