summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-10-04 23:33:15 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-10-04 23:33:15 +0000
commit163cb5b43de68cef7ae4fa053d710098399d1359 (patch)
tree52b20b455e2ed0292535f73926518fa5c402efc7 /ext
parent1e46f02394fdce76e51d5304f1ad1beffc0b9e77 (diff)
openssl: typed data
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@47799 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext')
-rw-r--r--ext/openssl/ossl_bn.c23
-rw-r--r--ext/openssl/ossl_cipher.c27
2 files changed, 43 insertions, 7 deletions
diff --git a/ext/openssl/ossl_bn.c b/ext/openssl/ossl_bn.c
index 2528f1c..0af7d63 100644
--- a/ext/openssl/ossl_bn.c
+++ b/ext/openssl/ossl_bn.c
@@ -15,11 +15,11 @@
if (!(bn)) { \
ossl_raise(rb_eRuntimeError, "BN wasn't initialized!"); \
} \
- (obj) = Data_Wrap_Struct((klass), 0, BN_clear_free, (bn)); \
+ (obj) = TypedData_Wrap_Struct((klass), &ossl_bn_type, (bn)); \
} while (0)
#define GetBN(obj, bn) do { \
- Data_Get_Struct((obj), BIGNUM, (bn)); \
+ TypedData_Get_Struct((obj), BIGNUM, &ossl_bn_type, (bn)); \
if (!(bn)) { \
ossl_raise(rb_eRuntimeError, "BN wasn't initialized!"); \
} \
@@ -30,6 +30,25 @@
GetBN((obj), (bn)); \
} while (0)
+static void
+ossl_bn_free(void *ptr)
+{
+ BN_clear_free(ptr);
+}
+
+static size_t
+ossl_bn_size(const void *ptr)
+{
+ return sizeof(BIGNUM);
+}
+
+static const rb_data_type_t ossl_bn_type = {
+ "OpenSSL/BN",
+ {0, ossl_bn_free, ossl_bn_size,},
+ NULL, NULL,
+ RUBY_TYPED_FREE_IMMEDIATELY,
+};
+
/*
* Classes
*/
diff --git a/ext/openssl/ossl_cipher.c b/ext/openssl/ossl_cipher.c
index 1cd185e..0efadd1 100644
--- a/ext/openssl/ossl_cipher.c
+++ b/ext/openssl/ossl_cipher.c
@@ -11,13 +11,13 @@
#include "ossl.h"
#define WrapCipher(obj, klass, ctx) \
- (obj) = Data_Wrap_Struct((klass), 0, ossl_cipher_free, (ctx))
+ (obj) = TypedData_Wrap_Struct((klass), &ossl_cipher_type, (ctx))
#define MakeCipher(obj, klass, ctx) \
- (obj) = Data_Make_Struct((klass), EVP_CIPHER_CTX, 0, ossl_cipher_free, (ctx))
+ (obj) = TypedData_Make_Struct((klass), EVP_CIPHER_CTX, &ossl_cipher_type, (ctx))
#define AllocCipher(obj, ctx) \
- memset(DATA_PTR(obj) = (ctx) = ALLOC(EVP_CIPHER_CTX), 0, sizeof(EVP_CIPHER_CTX))
+ (DATA_PTR(obj) = (ctx) = ZALLOC(EVP_CIPHER_CTX))
#define GetCipherInit(obj, ctx) do { \
- Data_Get_Struct((obj), EVP_CIPHER_CTX, (ctx)); \
+ TypedData_Get_Struct((obj), EVP_CIPHER_CTX, &ossl_cipher_type, (ctx)); \
} while (0)
#define GetCipher(obj, ctx) do { \
GetCipherInit((obj), (ctx)); \
@@ -37,6 +37,15 @@ VALUE cCipher;
VALUE eCipherError;
static VALUE ossl_cipher_alloc(VALUE klass);
+static void ossl_cipher_free(void *ptr);
+static size_t ossl_cipher_memsize(const void *ptr);
+
+static const rb_data_type_t ossl_cipher_type = {
+ "OpenSSL/Cipher",
+ {0, ossl_cipher_free, ossl_cipher_memsize,},
+ NULL, NULL,
+ RUBY_TYPED_FREE_IMMEDIATELY,
+};
/*
* PUBLIC
@@ -70,14 +79,22 @@ ossl_cipher_new(const EVP_CIPHER *cipher)
* PRIVATE
*/
static void
-ossl_cipher_free(EVP_CIPHER_CTX *ctx)
+ossl_cipher_free(void *ptr)
{
+ EVP_CIPHER_CTX *ctx = ptr;
if (ctx) {
EVP_CIPHER_CTX_cleanup(ctx);
ruby_xfree(ctx);
}
}
+static size_t
+ossl_cipher_memsize(const void *ptr)
+{
+ const EVP_CIPHER_CTX *ctx = ptr;
+ return ctx ? sizeof(*ctx) : 0;
+}
+
static VALUE
ossl_cipher_alloc(VALUE klass)
{