Пример #1
0
PHP_METHOD(Util, checkMapField) {
  zval* val;
  long key_type, value_type;
  const zend_class_entry* klass = NULL;
  if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zll|C", &val, &key_type,
                            &value_type, &klass) == FAILURE) {
    return;
  }

  if (Z_TYPE_P(val) == IS_ARRAY) {
    HashTable* table = Z_ARRVAL_P(val);
    HashPosition pointer;
    zval key, *map_field;
    void* value;

    map_field_create_with_type(map_field_type, to_fieldtype(key_type),
                               to_fieldtype(value_type), klass,
                               &map_field TSRMLS_CC);
    Map* intern =
        (Map*)zend_object_store_get_object(map_field TSRMLS_CC);

    for (zend_hash_internal_pointer_reset_ex(table, &pointer);
         zend_hash_get_current_data_ex(table, (void**)&value, &pointer) ==
         SUCCESS;
         zend_hash_move_forward_ex(table, &pointer)) {
      zend_hash_get_current_key_zval_ex(table, &key, &pointer);
      map_field_handlers->write_dimension(map_field, &key,
                                          *(zval**)value TSRMLS_CC);
    }

    Z_DELREF_P(map_field);
    RETURN_ZVAL(map_field, 1, 0);
  } else if (Z_TYPE_P(val) == IS_OBJECT) {
    if (!instanceof_function(Z_OBJCE_P(val), map_field_type TSRMLS_CC)) {
      zend_error(E_USER_ERROR, "Given value is not an instance of %s.",
                 map_field_type->name);
      return;
    }
    Map* intern = (Map*)zend_object_store_get_object(val TSRMLS_CC);
    if (to_fieldtype(key_type) != intern->key_type) {
      zend_error(E_USER_ERROR, "Incorrect map field key type.");
      return;
    }
    if (to_fieldtype(value_type) != intern->value_type) {
      zend_error(E_USER_ERROR, "Incorrect map field value type.");
      return;
    }
    if (klass != NULL && intern->msg_ce != klass) {
      zend_error(E_USER_ERROR, "Expect a map field of %s, but %s is given.",
                 klass->name, intern->msg_ce->name);
      return;
    }
    RETURN_ZVAL(val, 1, 0);
  } else {
    zend_error(E_USER_ERROR, "Incorrect map field type.");
    return;
  }
}
Пример #2
0
PHP_METHOD(Util, checkRepeatedField) {
  zval* val;
  long type;
  const zend_class_entry* klass = NULL;
  if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zl|C", &val, &type,
                            &klass) == FAILURE) {
    return;
  }

  if (Z_TYPE_P(val) == IS_ARRAY) {
    HashTable* table = Z_ARRVAL_P(val);
    HashPosition pointer;
    void* memory;
    zval* repeated_field;

    repeated_field_create_with_type(repeated_field_type, to_fieldtype(type),
                                    klass, &repeated_field TSRMLS_CC);
    RepeatedField* intern =
        (RepeatedField*)zend_object_store_get_object(repeated_field TSRMLS_CC);

    for (zend_hash_internal_pointer_reset_ex(table, &pointer);
         zend_hash_get_current_data_ex(table, (void**)&memory, &pointer) ==
         SUCCESS;
         zend_hash_move_forward_ex(table, &pointer)) {
      repeated_field_handlers->write_dimension(repeated_field, NULL,
                                               *(zval**)memory TSRMLS_CC);
    }

    Z_DELREF_P(repeated_field);
    RETURN_ZVAL(repeated_field, 1, 0);

  } else if (Z_TYPE_P(val) == IS_OBJECT) {
    if (!instanceof_function(Z_OBJCE_P(val), repeated_field_type TSRMLS_CC)) {
      zend_error(E_USER_ERROR, "Given value is not an instance of %s.",
                 repeated_field_type->name);
      return;
    }
    RepeatedField* intern =
        (RepeatedField*)zend_object_store_get_object(val TSRMLS_CC);
    if (to_fieldtype(type) != intern->type) {
      zend_error(E_USER_ERROR, "Incorrect repeated field type.");
      return;
    }
    if (klass != NULL && intern->msg_ce != klass) {
      zend_error(E_USER_ERROR,
                 "Expect a repeated field of %s, but %s is given.", klass->name,
                 intern->msg_ce->name);
      return;
    }
    RETURN_ZVAL(val, 1, 0);
  } else {
    zend_error(E_USER_ERROR, "Incorrect repeated field type.");
    return;
  }

}
Пример #3
0
PHP_METHOD(Util, checkRepeatedField) {
  zval* val;
  long type;
  const zend_class_entry* klass = NULL;
  if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Ol|C", &val,
                            repeated_field_type, &type, &klass) == FAILURE) {
    return;
  }

  RepeatedField *intern =
      (RepeatedField *)zend_object_store_get_object(val TSRMLS_CC);
  if (to_fieldtype(type) != intern->type) {
    zend_error(E_USER_ERROR, "Incorrect repeated field type.");
    return;
  }
  if (klass != NULL && intern->msg_ce != klass) {
    zend_error(E_USER_ERROR, "Expect a repeated field of %s, but %s is given.",
               klass->name, intern->msg_ce->name);
    return;
  }
}