#define DECNUMDIGITS 34 /* DECQUAD_Pmax */
#include "ionc/ion.h"
+static decContext g_dec_ctx;
+static ION_INT *g_ion_int_zend_max, *g_ion_int_zend_min;
+static ION_DECIMAL g_ion_dec_zend_max, g_ion_dec_zend_min;
+
#include "php_ion.h"
#define ZEND_ARG_VARIADIC_OBJ_TYPE_MASK(pass_by_ref, name, classname, type_mask, default_value) \
{ #name, ZEND_TYPE_INIT_CLASS_CONST_MASK(#classname, type_mask | _ZEND_ARG_INFO_FLAGS(pass_by_ref, 1, 0)), default_value },
if (!sym->value) {
RETURN_EMPTY_STRING();
}
- RETURN_STR(sym->value);
+ RETURN_STR_COPY(sym->value);
}
ZEND_METHOD(ion_Timestamp, __construct)
{
RETURN_BOOL(ion_decimal_is_integer(&obj->dec));
}
+ZEND_METHOD(ion_LOB, __construct)
+{
+ zend_string *value;
+ zend_object *type = NULL;
+ ZEND_PARSE_PARAMETERS_START(1, 2)
+ Z_PARAM_STR(value)
+ Z_PARAM_OPTIONAL
+ Z_PARAM_OBJ_OF_CLASS(type, ce_Type)
+ ZEND_PARSE_PARAMETERS_END();
+
+ if (!type) {
+ type = zend_enum_get_case_cstr(ce_Type, "CLob");
+ }
+ update_property_obj(Z_OBJ_P(ZEND_THIS), ZEND_STRL("type"), type);
+ zend_update_property_str(Z_OBJCE_P(ZEND_THIS), Z_OBJ_P(ZEND_THIS), ZEND_STRL("value"), value);
+}
ZEND_METHOD(ion_Reader_Options, __construct)
{
php_ion_reader_options *opt = php_ion_obj(reader_options, Z_OBJ_P(ZEND_THIS));
ZEND_PARSE_PARAMETERS_NONE();
- php_ion_unserialize_int(obj, return_value);
+ php_ion_reader_read_int(obj->reader, return_value);
}
ZEND_METHOD(ion_Reader_Reader, readFloat)
{
ZEND_PARSE_PARAMETERS_NONE();
- php_ion_unserialize_timestamp(obj, return_value);
+ php_ion_reader_read_timestamp(obj->reader, obj->opt ? &php_ion_obj(reader_options, obj->opt)->opt : NULL, return_value);
}
ZEND_METHOD(ion_Reader_Reader, readSymbol)
{
ZEND_PARSE_PARAMETERS_NONE();
- php_ion_unserialize_lob(obj, return_value);
+ php_ion_reader_read_lob(obj->reader, return_value);
}
ZEND_METHOD(ion_Reader_Reader, readLobPart)
{
RETURN_RES(obj->stream.ptr->res);
}
-ZEND_METHOD(ion_PHP_Serializer, __construct)
+ZEND_METHOD(ion_Serializer_PHP, __construct)
{
- zend_object *obj = Z_OBJ_P(ZEND_THIS);
+ php_ion_serializer_php *obj = php_ion_obj(serializer_php, Z_OBJ_P(ZEND_THIS));
+ PTR_CHECK(obj);
- zend_object *writer_obj;
- zend_bool call_magic = true;
- zend_string *call_custom = NULL;
- ZEND_PARSE_PARAMETERS_START(1, 3)
- Z_PARAM_OBJ_OF_CLASS(writer_obj, ce_Writer)
+ ZEND_PARSE_PARAMETERS_START(0, 3)
Z_PARAM_OPTIONAL
- Z_PARAM_BOOL(call_magic)
- Z_PARAM_STR_OR_NULL(call_custom)
+ Z_PARAM_OBJ_OF_CLASS_OR_NULL(obj->opt, ce_Writer_Options)
+ Z_PARAM_BOOL(obj->serializer.call_magic)
+ Z_PARAM_STR_OR_NULL(obj->serializer.call_custom)
ZEND_PARSE_PARAMETERS_END();
- update_property_obj(obj, ZEND_STRL("writer"), writer_obj);
- zend_update_property_bool(obj->ce, obj, ZEND_STRL("callMagicSerialize"),
- php_ion_obj(writer, writer_obj)->php.call_magic_serialize = call_magic);
- if (call_custom) {
- zend_update_property_str(obj->ce, obj, ZEND_STRL("callCustomSerialize"), call_custom);
- php_ion_obj(writer, writer_obj)->php.custom_serialize = zend_string_tolower(call_custom);
- } else {
- zend_update_property_null(obj->ce, obj, ZEND_STRL("callCustomSerialize"));
- }
+ php_ion_serializer_php_ctor(obj);
}
-ZEND_METHOD(ion_PHP_Serializer, __invoke)
+ZEND_METHOD(ion_Serializer_PHP, __invoke)
{
zend_object *obj = Z_OBJ_P(ZEND_THIS);
Z_PARAM_ZVAL(data)
ZEND_PARSE_PARAMETERS_END();
- zval tmp, *zwriter;
- if ((zwriter = zend_read_property(obj->ce, obj, ZEND_STRL("writer"), 0, &tmp))) {
- if (Z_OBJCE_P(zwriter) == ce_Writer_Buffer_Writer || Z_OBJCE_P(zwriter) == ce_Writer_Stream_Writer) {
- php_ion_writer *writer = php_ion_obj(writer, Z_OBJ_P(zwriter));
- php_ion_serialize(writer, data, &writer->buffer.val);
- RETURN_STR_COPY(writer->buffer.str.s);
- } else {
- zend_call_method_with_1_params(obj, obj->ce, NULL /* TODO */, "serialize", return_value, data);
- }
+ if (obj->ce == ce_Serializer_PHP) {
+ // default, fast path
+ php_ion_serialize(&php_ion_obj(serializer_php, obj)->serializer, data, return_value);
+ } else {
+ zend_call_method_with_1_params(obj, obj->ce, NULL /* TODO */, "serialize", return_value, data);
}
}
-ZEND_METHOD(ion_PHP_Serializer, serialize)
+ZEND_FUNCTION(ion_serialize)
{
- //zend_object *obj = Z_OBJ_P(ZEND_THIS);
-
zval *data;
- ZEND_PARSE_PARAMETERS_START(1, 1)
+ zend_object *zo_ser = NULL;
+ ZEND_PARSE_PARAMETERS_START(1, 2)
Z_PARAM_ZVAL(data)
- ZEND_PARSE_PARAMETERS_END();
-
- // TODO
-}
-ZEND_METHOD(ion_PHP_Unserializer, __construct)
-{
- zend_object *obj = Z_OBJ_P(ZEND_THIS);
-
- zend_object *reader_obj;
- zend_bool call_magic = true;
- zend_string *call_custom = NULL;
- ZEND_PARSE_PARAMETERS_START(1, 3)
- Z_PARAM_OBJ_OF_CLASS(reader_obj, ce_Reader)
Z_PARAM_OPTIONAL
- Z_PARAM_BOOL(call_magic)
- Z_PARAM_STR_OR_NULL(call_custom)
+ Z_PARAM_OBJ_OF_CLASS_OR_NULL(zo_ser, ce_Serializer)
ZEND_PARSE_PARAMETERS_END();
- update_property_obj(obj, ZEND_STRL("reader"), reader_obj);
- zend_update_property_bool(obj->ce, obj, ZEND_STRL("callMagicUnserialize"),
- php_ion_obj(reader, reader_obj)->php.call_magic_unserialize = call_magic);
- if (call_custom) {
- zend_update_property_str(obj->ce, obj, ZEND_STRL("callCustomUnserialize"), call_custom);
- php_ion_obj(reader, reader_obj)->php.custom_unserialize = zend_string_tolower(call_custom);
+ if (!zo_ser || zo_ser->ce == ce_Serializer_PHP) {
+ // default, fast path
+ php_ion_serializer *ser = zo_ser ? &php_ion_obj(serializer_php, zo_ser)->serializer : NULL;
+ php_ion_serialize(ser, data, return_value);
} else {
- zend_update_property_null(obj->ce, obj, ZEND_STRL("callCustomUnserialize"));
- }
-}
-ZEND_METHOD(ion_PHP_Unserializer, __invoke)
-{
- zend_object *obj = Z_OBJ_P(ZEND_THIS);
-
- zval zreader;
- if (zend_read_property(obj->ce, obj, ZEND_STRL("reader"), 0, &zreader)) {
- if (Z_OBJCE(zreader) == ce_Reader_Buffer_Reader || Z_OBJCE(zreader) == ce_Reader_Stream_Reader) {
- php_ion_unserialize(php_ion_obj(reader, Z_OBJ(zreader)), NULL, return_value);
- } else {
- zend_call_method_with_0_params(obj, obj->ce, NULL /* TODO */, "unserialize", return_value);
- }
+ zend_call_method_with_1_params(zo_ser, NULL, NULL, "__invoke", return_value, data);
}
}
-ZEND_METHOD(ion_PHP_Unserializer, unserialize)
+ZEND_METHOD(ion_Serializer_PHP, serialize)
{
//zend_object *obj = Z_OBJ_P(ZEND_THIS);
- ZEND_PARSE_PARAMETERS_NONE();
+ zval *data;
+ ZEND_PARSE_PARAMETERS_START(1, 1)
+ Z_PARAM_ZVAL(data)
+ ZEND_PARSE_PARAMETERS_END();
// TODO
+ zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "Not implemented");
}
-ZEND_FUNCTION(ion_serialize)
+ZEND_METHOD(ion_Unserializer_PHP, __construct)
{
- zval *zv;
- zend_object *zo_opt = NULL;
- ZEND_PARSE_PARAMETERS_START(1, 2)
- Z_PARAM_ZVAL(zv)
+ php_ion_unserializer_php *obj = php_ion_obj(unserializer_php, Z_OBJ_P(ZEND_THIS));
+
+ ZEND_PARSE_PARAMETERS_START(0, 3)
Z_PARAM_OPTIONAL
- Z_PARAM_OBJ_OF_CLASS_OR_NULL(zo_opt, ce_Writer_Options)
+ Z_PARAM_OBJ_OF_CLASS_OR_NULL(obj->opt, ce_Reader_Options)
+ Z_PARAM_BOOL(obj->unserializer.call_magic)
+ Z_PARAM_STR_OR_NULL(obj->unserializer.call_custom)
ZEND_PARSE_PARAMETERS_END();
- zval zwriter;
- object_init_ex(&zwriter, ce_Writer_Buffer_Writer);
+ php_ion_unserializer_php_ctor(obj);
+}
+ZEND_METHOD(ion_Unserializer_PHP, __invoke)
+{
+ zend_object *obj = Z_OBJ_P(ZEND_THIS);
- php_ion_writer *obj = php_ion_obj(writer, Z_OBJ(zwriter));
- obj->opt = zo_opt;
- obj->type = BUFFER_WRITER;
- obj->php.call_magic_serialize = true;
- php_ion_writer_ctor(obj);
+ zval *data;
+ ZEND_PARSE_PARAMETERS_START(1, 1)
+ Z_PARAM_ZVAL(data)
+ ZEND_PARSE_PARAMETERS_END();
- php_ion_serialize(obj, zv, return_value);
- zval_ptr_dtor(&zwriter);
+ if (obj->ce == ce_Unserializer_PHP) {
+ php_ion_unserialize(&php_ion_obj(unserializer_php, obj)->unserializer, data, return_value);
+ } else {
+ zend_call_method_with_1_params(obj, obj->ce, NULL /* TODO */, "unserialize", return_value, data);
+ }
}
ZEND_FUNCTION(ion_unserialize)
{
- zend_string *zstr;
- zend_object *zo_opt = NULL;
+ zval *data;
+ zend_object *zo_ser = NULL;
ZEND_PARSE_PARAMETERS_START(1, 2)
- Z_PARAM_STR(zstr)
+ Z_PARAM_ZVAL(data)
Z_PARAM_OPTIONAL
- Z_PARAM_OBJ_OF_CLASS_OR_NULL(zo_opt, ce_Reader_Options)
+ Z_PARAM_OBJ_OF_CLASS_OR_NULL(zo_ser, ce_Unserializer)
ZEND_PARSE_PARAMETERS_END();
- zval zreader;
- object_init_ex(&zreader, ce_Reader_Buffer_Reader);
+ if (!zo_ser || zo_ser->ce == ce_Unserializer_PHP) {
+ // default, fast path
+ php_ion_unserializer *ser = zo_ser ? &php_ion_obj(unserializer_php, zo_ser)->unserializer : NULL;
+ php_ion_unserialize(ser, data, return_value);
+ } else {
+ zend_call_method_with_1_params(zo_ser, NULL, NULL, "__invoke", return_value, data);
+ }
+}
+ZEND_METHOD(ion_Unserializer_PHP, unserialize)
+{
+ //zend_object *obj = Z_OBJ_P(ZEND_THIS);
+
+ zval *data;
+ ZEND_PARSE_PARAMETERS_START(1, 1)
+ Z_PARAM_ZVAL(data)
+ ZEND_PARSE_PARAMETERS_END();
- php_ion_reader *obj = php_ion_obj(reader, Z_OBJ(zreader));
- obj->opt = zo_opt;
- obj->type = BUFFER_READER;
- obj->buffer = zend_string_copy(zstr);
- obj->php.call_magic_unserialize = true;
- php_ion_reader_ctor(obj);
- php_ion_unserialize(obj, NULL, return_value);
- zval_ptr_dtor(&zreader);
+ // TODO
+ zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "Not implemented");
}
PHP_RINIT_FUNCTION(ion)
return SUCCESS;
}
-php_ion_decl(type, Type);
-php_ion_decl(symbol, Symbol, php_ion_symbol_dtor(obj));
-php_ion_decl(symbol_iloc, Symbol_ImportLocation, php_ion_symbol_iloc_dtor(obj));
-php_ion_decl(symbol_table, Symbol_Table);
-php_ion_decl(decimal, Decimal, php_ion_decimal_dtor(obj));
-php_ion_decl(decimal_ctx, Decimal_Context);
-php_ion_decl(timestamp, Timestamp, php_ion_timestamp_dtor(obj));
-php_ion_decl(catalog, Catalog);
-php_ion_decl(reader_options, Reader_Options);
-php_ion_decl(reader, Reader_Reader, php_ion_reader_dtor(obj));
-php_ion_decl(writer_options, Writer_Options);
-php_ion_decl(writer, Writer_Writer, php_ion_writer_dtor(obj));
-
PHP_MINIT_FUNCTION(ion)
{
+ if (!g_ion_int_zend_max) {
+ decContextDefault(&g_dec_ctx, DEC_INIT_DECIMAL64);
+
+ ion_int_alloc(NULL, &g_ion_int_zend_max);
+ ion_int_from_long(g_ion_int_zend_max, ZEND_LONG_MAX);
+ ion_decimal_from_ion_int(&g_ion_dec_zend_max, &g_dec_ctx, g_ion_int_zend_max);
+
+ ion_int_alloc(NULL, &g_ion_int_zend_min);
+ ion_int_from_long(g_ion_int_zend_min, ZEND_LONG_MIN);
+ ion_decimal_from_ion_int(&g_ion_dec_zend_min, &g_dec_ctx, g_ion_int_zend_min);
+ }
+
ce_Annotation = register_class_ion_Annotation();
php_ion_register(type, Type);
ce_Symbol_System_SID = register_class_ion_Symbol_System_SID();
ce_Collection = register_class_ion_Collection();
+ ce_LOB = register_class_ion_LOB();
php_ion_register(decimal, Decimal);
php_ion_register(decimal_ctx, Decimal_Context);
ce_Writer_Stream = register_class_ion_Writer_Stream(ce_Writer);
ce_Writer_Stream_Writer = register_class_ion_Writer_Stream_Writer(ce_Writer_Writer, ce_Writer_Stream);
- ce_PHP_Serializer = register_class_ion_PHP_Serializer();
- ce_PHP_Unserializer = register_class_ion_PHP_Unserializer();
+ ce_Serializer = register_class_ion_Serializer();
+ php_ion_register(serializer_php, Serializer_PHP, ce_Serializer);
+ ce_Unserializer = register_class_ion_Unserializer();
+ php_ion_register(unserializer_php, Unserializer_PHP, ce_Unserializer);
return SUCCESS;
}
+PHP_MSHUTDOWN_FUNCTION(ion)
+{
+ if (g_ion_int_zend_max) {
+ ion_int_free(g_ion_int_zend_max);
+ ion_int_free(g_ion_int_zend_min);
+ }
+ return SUCCESS;
+}
PHP_MINFO_FUNCTION(ion)
{
php_info_print_table_start();
"ion", /* Extension name */
ext_functions, /* zend_function_entry */
PHP_MINIT(ion), /* PHP_MINIT - Module initialization */
- NULL, /* PHP_MSHUTDOWN - Module shutdown */
+ PHP_MSHUTDOWN(ion), /* PHP_MSHUTDOWN - Module shutdown */
PHP_RINIT(ion), /* PHP_RINIT - Request initialization */
PHP_RSHUTDOWN(ion), /* PHP_RSHUTDOWN - Request shutdown */
PHP_MINFO(ion), /* PHP_MINFO - Module info */