struct CYBridgeEntry {
int name_;
const char *value_;
+ void *cache_;
};
%%
EOF
-grep '^[CFV]' "$1" | sed -e 's/^C/0/;s/^F/1/;s/^V/2/' | sed -e 's/"/\\"/g;s/^\([^ ]*\) \([^ ]*\) \(.*\)$/\1\2, "\3"/';
-grep '^[EST]' "$1" | sed -e 's/^S/3/;s/^T/4/;s/^E/5/' | sed -e 's/^5\(.*\)$/4\1 i/;s/"/\\"/g' | sed -e 's/^\([^ ]*\) \([^ ]*\) \(.*\)$/\1\2, "\3"/';
-grep '^:' "$1" | sed -e 's/^: \([^ ]*\) \(.*\)/6\1, "\2"/';
+grep '^[CFV]' "$1" | sed -e 's/^C/0/;s/^F/1/;s/^V/2/' | sed -e 's/"/\\"/g;s/^\([^ ]*\) \([^ ]*\) \(.*\)$/\1\2, "\3", NULL/';
+grep '^[EST]' "$1" | sed -e 's/^S/3/;s/^T/4/;s/^E/5/' | sed -e 's/^5\(.*\)$/4\1 i/;s/"/\\"/g' | sed -e 's/^\([^ ]*\) \([^ ]*\) \(.*\)$/\1\2, "\3", NULL/';
+grep '^:' "$1" | sed -e 's/^: \([^ ]*\) \(.*\)/6\1, "\2", NULL/';
static JSStringRef Result_;
void CYFinalize(JSObjectRef object) {
- delete reinterpret_cast<CYData *>(JSObjectGetPrivate(object));
+ CYData *internal(reinterpret_cast<CYData *>(JSObjectGetPrivate(object)));
+ if (--internal->count_ == 0)
+ delete internal;
}
void Structor_(apr_pool_t *pool, sig::Type *&type) {
return JSObjectMake(context, Pointer_, internal);
}
-static JSObjectRef CYMakeFunctor(JSContextRef context, void (*function)(), const char *type) {
- cy::Functor *internal(new cy::Functor(type, function));
+static JSObjectRef CYMakeFunctor(JSContextRef context, void (*function)(), const char *type, void **cache = NULL) {
+ cy::Functor *internal;
+
+ if (cache != NULL && *cache != NULL) {
+ internal = reinterpret_cast<cy::Functor *>(*cache);
+ ++internal->count_;
+ } else {
+ internal = new cy::Functor(type, function);
+
+ if (cache != NULL) {
+ *cache = internal;
+ ++internal->count_;
+ }
+ }
+
return JSObjectMake(context, Functor_, internal);
}
case '1':
if (void (*symbol)() = reinterpret_cast<void (*)()>(CYCastSymbol(name.data)))
- return CYMakeFunctor(context, symbol, entry->value_);
+ return CYMakeFunctor(context, symbol, entry->value_, &entry->cache_);
else return NULL;
case '2':