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 69 70 71 72 73 74
|
/*
* MessagePack for Ruby
*
* Copyright (C) 2008-2015 Sadayuki Furuhashi
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "packer_ext_registry.h"
void msgpack_packer_ext_registry_init(VALUE owner, msgpack_packer_ext_registry_t* pkrg)
{
RB_OBJ_WRITE(owner, &pkrg->hash, Qnil);
RB_OBJ_WRITE(owner, &pkrg->cache, Qnil);
}
void msgpack_packer_ext_registry_mark(msgpack_packer_ext_registry_t* pkrg)
{
rb_gc_mark(pkrg->hash);
rb_gc_mark(pkrg->cache);
}
void msgpack_packer_ext_registry_borrow(VALUE owner, msgpack_packer_ext_registry_t* src,
msgpack_packer_ext_registry_t* dst)
{
if(RTEST(src->hash)) {
if(rb_obj_frozen_p(src->hash)) {
// If the type registry is frozen we can safely share it, and share the cache as well.
RB_OBJ_WRITE(owner, &dst->hash, src->hash);
RB_OBJ_WRITE(owner, &dst->cache, src->cache);
} else {
RB_OBJ_WRITE(owner, &dst->hash, rb_hash_dup(src->hash));
RB_OBJ_WRITE(owner, &dst->cache, NIL_P(src->cache) ? Qnil : rb_hash_dup(src->cache));
}
} else {
RB_OBJ_WRITE(owner, &dst->hash, Qnil);
RB_OBJ_WRITE(owner, &dst->cache, Qnil);
}
}
void msgpack_packer_ext_registry_dup(VALUE owner, msgpack_packer_ext_registry_t* src,
msgpack_packer_ext_registry_t* dst)
{
RB_OBJ_WRITE(owner, &dst->hash, NIL_P(src->hash) ? Qnil : rb_hash_dup(src->hash));
RB_OBJ_WRITE(owner, &dst->cache, NIL_P(src->cache) ? Qnil : rb_hash_dup(src->cache));
}
void msgpack_packer_ext_registry_put(VALUE owner, msgpack_packer_ext_registry_t* pkrg,
VALUE ext_module, int ext_type, int flags, VALUE proc)
{
if(NIL_P(pkrg->hash)) {
RB_OBJ_WRITE(owner, &pkrg->hash, rb_hash_new());
}
if(NIL_P(pkrg->cache)) {
RB_OBJ_WRITE(owner, &pkrg->cache, rb_hash_new());
} else {
/* clear lookup cache not to miss added type */
rb_hash_clear(pkrg->cache);
}
VALUE entry = rb_ary_new3(3, INT2FIX(ext_type), proc, INT2FIX(flags));
rb_hash_aset(pkrg->hash, ext_module, entry);
}
|