You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucy.apache.org by nw...@apache.org on 2013/05/18 21:23:53 UTC
[lucy-commits] [08/15] git commit: refs/heads/install-c-library - Switch from
CHY_INLINE to CFISH_INLINE
Switch from CHY_INLINE to CFISH_INLINE
Project: http://git-wip-us.apache.org/repos/asf/lucy/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy/commit/7c9638eb
Tree: http://git-wip-us.apache.org/repos/asf/lucy/tree/7c9638eb
Diff: http://git-wip-us.apache.org/repos/asf/lucy/diff/7c9638eb
Branch: refs/heads/install-c-library
Commit: 7c9638ebc0d05fedcf9356af76c2054849ef3767
Parents: e7cdce4
Author: Nick Wellnhofer <we...@aevum.de>
Authored: Sat May 18 12:38:40 2013 +0200
Committer: Nick Wellnhofer <we...@aevum.de>
Committed: Sat May 18 19:15:55 2013 +0200
----------------------------------------------------------------------
clownfish/compiler/src/CFCBindCore.c | 6 ++--
clownfish/compiler/src/CFCBindFunction.c | 2 +-
clownfish/compiler/src/CFCBindMethod.c | 2 +-
clownfish/compiler/src/CFCCBlock.h | 2 +-
clownfish/compiler/src/CFCPerl.c | 2 +-
core/Clownfish/Err.cfh | 2 +-
core/Clownfish/Obj.cfh | 6 ++--
core/Clownfish/Util/Atomic.cfh | 12 +++---
core/Clownfish/Util/NumberUtils.cfh | 48 ++++++++++++------------
core/Lucy/Plan/FieldType.cfh | 2 +-
perl/xs/XSBind.h | 6 ++--
11 files changed, 45 insertions(+), 45 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucy/blob/7c9638eb/clownfish/compiler/src/CFCBindCore.c
----------------------------------------------------------------------
diff --git a/clownfish/compiler/src/CFCBindCore.c b/clownfish/compiler/src/CFCBindCore.c
index 4dcaf94..392a5ff 100644
--- a/clownfish/compiler/src/CFCBindCore.c
+++ b/clownfish/compiler/src/CFCBindCore.c
@@ -198,7 +198,7 @@ S_write_parcel_h(CFCBindCore *self) {
"#define CFISH_METHOD_PTR(_vtable, _full_meth) \\\n"
" ((_full_meth ## _t)cfish_method(_vtable, _full_meth ## _OFFSET))\n"
"\n"
- "static CHY_INLINE cfish_method_t\n"
+ "static CFISH_INLINE cfish_method_t\n"
"cfish_method(const void *vtable, size_t offset) {\n"
" union { char *cptr; cfish_method_t *fptr; } ptr;\n"
" ptr.cptr = (char*)vtable + offset;\n"
@@ -212,7 +212,7 @@ S_write_parcel_h(CFCBindCore *self) {
"\n"
"/* Access the function pointer for a given method from the object.\n"
" */\n"
- "static CHY_INLINE cfish_method_t\n"
+ "static CFISH_INLINE cfish_method_t\n"
"cfish_obj_method(const void *object, size_t offset) {\n"
" cfish_Dummy *dummy = (cfish_Dummy*)object;\n"
" return cfish_method(dummy->vtable, offset);\n"
@@ -225,7 +225,7 @@ S_write_parcel_h(CFCBindCore *self) {
" _full_meth ## _OFFSET))\n"
"\n"
"extern CFISH_VISIBLE size_t cfish_VTable_offset_of_parent;\n"
- "static CHY_INLINE cfish_method_t\n"
+ "static CFISH_INLINE cfish_method_t\n"
"cfish_super_method(const void *vtable, size_t offset) {\n"
" char *vt_as_char = (char*)vtable;\n"
" cfish_VTable **parent_ptr\n"
http://git-wip-us.apache.org/repos/asf/lucy/blob/7c9638eb/clownfish/compiler/src/CFCBindFunction.c
----------------------------------------------------------------------
diff --git a/clownfish/compiler/src/CFCBindFunction.c b/clownfish/compiler/src/CFCBindFunction.c
index 2e3ea00..ae71d84 100644
--- a/clownfish/compiler/src/CFCBindFunction.c
+++ b/clownfish/compiler/src/CFCBindFunction.c
@@ -30,7 +30,7 @@ CFCBindFunc_func_declaration(CFCFunction *func) {
const char *full_func_sym = CFCFunction_full_func_sym(func);
const char *param_list_str = CFCParamList_to_c(param_list);
const char *inline_prop = CFCFunction_inline(func)
- ? "static CHY_INLINE "
+ ? "static CFISH_INLINE "
: "";
char *buf = CFCUtil_sprintf("%s%s\n%s(%s);", inline_prop, ret_type_str,
full_func_sym, param_list_str);
http://git-wip-us.apache.org/repos/asf/lucy/blob/7c9638eb/clownfish/compiler/src/CFCBindMethod.c
----------------------------------------------------------------------
diff --git a/clownfish/compiler/src/CFCBindMethod.c b/clownfish/compiler/src/CFCBindMethod.c
index 5832e90..996192a 100644
--- a/clownfish/compiler/src/CFCBindMethod.c
+++ b/clownfish/compiler/src/CFCBindMethod.c
@@ -113,7 +113,7 @@ S_virtual_method_def(CFCMethod *method, CFCClass *klass) {
const char pattern[] =
"extern %sVISIBLE size_t %s;\n"
- "static CHY_INLINE %s\n"
+ "static CFISH_INLINE %s\n"
"%s(const %s *self%s) {\n"
" const %s method = (%s)cfish_obj_method(self, %s);\n"
" %smethod((%s*)self%s);\n"
http://git-wip-us.apache.org/repos/asf/lucy/blob/7c9638eb/clownfish/compiler/src/CFCCBlock.h
----------------------------------------------------------------------
diff --git a/clownfish/compiler/src/CFCCBlock.h b/clownfish/compiler/src/CFCCBlock.h
index 9bb0d46..98ac4d9 100644
--- a/clownfish/compiler/src/CFCCBlock.h
+++ b/clownfish/compiler/src/CFCCBlock.h
@@ -28,7 +28,7 @@
*
* __C__
* #include <stdio.h>
- * static CHY_INLINE void
+ * static CFISH_INLINE void
* crust_Lobster_say_hello(crust_Lobster *self)
* {
* printf("Prepare to die, human scum.\n");
http://git-wip-us.apache.org/repos/asf/lucy/blob/7c9638eb/clownfish/compiler/src/CFCPerl.c
----------------------------------------------------------------------
diff --git a/clownfish/compiler/src/CFCPerl.c b/clownfish/compiler/src/CFCPerl.c
index 419799f..a2634de 100644
--- a/clownfish/compiler/src/CFCPerl.c
+++ b/clownfish/compiler/src/CFCPerl.c
@@ -516,7 +516,7 @@ S_write_callbacks_c(CFCPerl *self) {
" LEAVE;\n"
"}\n"
"\n"
- "static CHY_INLINE SV*\n"
+ "static CFISH_INLINE SV*\n"
"SI_do_callback_sv(const char *meth_name) {\n"
" int count = call_method(meth_name, G_SCALAR);\n"
" if (count != 1) {\n"
http://git-wip-us.apache.org/repos/asf/lucy/blob/7c9638eb/core/Clownfish/Err.cfh
----------------------------------------------------------------------
diff --git a/core/Clownfish/Err.cfh b/core/Clownfish/Err.cfh
index 558c710..777aab2 100644
--- a/core/Clownfish/Err.cfh
+++ b/core/Clownfish/Err.cfh
@@ -228,7 +228,7 @@ __C__
lucy_Err_certify((lucy_Obj*)(_obj), (_vtable), \
__FILE__, __LINE__, CFISH_ERR_FUNC_MACRO)
-static CHY_INLINE void
+static CFISH_INLINE void
lucy_Err_abstract_class_check(lucy_Obj *obj, lucy_VTable *vtable) {
lucy_VTable *const my_vtable = (lucy_VTable*)((cfish_Dummy*)obj)->vtable;
if (my_vtable == vtable) {
http://git-wip-us.apache.org/repos/asf/lucy/blob/7c9638eb/core/Clownfish/Obj.cfh
----------------------------------------------------------------------
diff --git a/core/Clownfish/Obj.cfh b/core/Clownfish/Obj.cfh
index de6c928..a801b48 100644
--- a/core/Clownfish/Obj.cfh
+++ b/core/Clownfish/Obj.cfh
@@ -187,7 +187,7 @@ public class Clownfish::Obj {
}
__C__
-static CHY_INLINE void
+static CFISH_INLINE void
lucy_Obj_super_destroy(lucy_Obj *self, lucy_VTable *vtable) {
Lucy_Obj_Destroy_t super_destroy
= CFISH_SUPER_METHOD_PTR(vtable, Lucy_Obj_Destroy);
@@ -197,7 +197,7 @@ lucy_Obj_super_destroy(lucy_Obj *self, lucy_VTable *vtable) {
#define LUCY_SUPER_DESTROY(_self, _vtable) \
lucy_Obj_super_destroy((lucy_Obj*)_self, _vtable)
-static CHY_INLINE lucy_Obj*
+static CFISH_INLINE lucy_Obj*
lucy_Obj_incref(lucy_Obj *self) {
if (self != NULL) { return Lucy_Obj_Inc_RefCount(self); }
else { return NULL; }
@@ -205,7 +205,7 @@ lucy_Obj_incref(lucy_Obj *self) {
#define CFISH_INCREF(_self) lucy_Obj_incref((lucy_Obj*)_self)
-static CHY_INLINE uint32_t
+static CFISH_INLINE uint32_t
lucy_Obj_decref(lucy_Obj *self) {
if (self != NULL) { return Lucy_Obj_Dec_RefCount(self); }
else { return 0; }
http://git-wip-us.apache.org/repos/asf/lucy/blob/7c9638eb/core/Clownfish/Util/Atomic.cfh
----------------------------------------------------------------------
diff --git a/core/Clownfish/Util/Atomic.cfh b/core/Clownfish/Util/Atomic.cfh
index 774f5a9..91d3d6b 100644
--- a/core/Clownfish/Util/Atomic.cfh
+++ b/core/Clownfish/Util/Atomic.cfh
@@ -26,13 +26,13 @@ __C__
* matches <code>old_value</code>. If it does, set <code>target</code> to
* <code>new_value</code> and return true. Otherwise, return false.
*/
-static CHY_INLINE bool
+static CFISH_INLINE bool
lucy_Atomic_cas_ptr(void *volatile *target, void *old_value, void *new_value);
/************************** Single threaded *******************************/
#ifdef LUCY_NOTHREADS
-static CHY_INLINE bool
+static CFISH_INLINE bool
lucy_Atomic_cas_ptr(void *volatile *target, void *old_value, void *new_value) {
if (*target == old_value) {
*target = new_value;
@@ -47,7 +47,7 @@ lucy_Atomic_cas_ptr(void *volatile *target, void *old_value, void *new_value) {
#elif defined(CHY_HAS_OSATOMIC_CAS_PTR)
#include <libkern/OSAtomic.h>
-static CHY_INLINE bool
+static CFISH_INLINE bool
lucy_Atomic_cas_ptr(void *volatile *target, void *old_value, void *new_value) {
return OSAtomicCompareAndSwapPtr(old_value, new_value, target);
}
@@ -59,7 +59,7 @@ bool
lucy_Atomic_wrapped_cas_ptr(void *volatile *target, void *old_value,
void *new_value);
-static CHY_INLINE bool
+static CFISH_INLINE bool
lucy_Atomic_cas_ptr(void *volatile *target, void *old_value, void *new_value) {
return lucy_Atomic_wrapped_cas_ptr(target, old_value, new_value);
}
@@ -68,7 +68,7 @@ lucy_Atomic_cas_ptr(void *volatile *target, void *old_value, void *new_value) {
#elif defined(CHY_HAS_SYS_ATOMIC_H)
#include <sys/atomic.h>
-static CHY_INLINE bool
+static CFISH_INLINE bool
lucy_Atomic_cas_ptr(void *volatile *target, void *old_value, void *new_value) {
return atomic_cas_ptr(target, old_value, new_value) == old_value;
}
@@ -79,7 +79,7 @@ lucy_Atomic_cas_ptr(void *volatile *target, void *old_value, void *new_value) {
extern pthread_mutex_t lucy_Atomic_mutex;
-static CHY_INLINE bool
+static CFISH_INLINE bool
lucy_Atomic_cas_ptr(void *volatile *target, void *old_value, void *new_value) {
pthread_mutex_lock(&lucy_Atomic_mutex);
if (*target == old_value) {
http://git-wip-us.apache.org/repos/asf/lucy/blob/7c9638eb/core/Clownfish/Util/NumberUtils.cfh
----------------------------------------------------------------------
diff --git a/core/Clownfish/Util/NumberUtils.cfh b/core/Clownfish/Util/NumberUtils.cfh
index 14b699b..11a5afd 100644
--- a/core/Clownfish/Util/NumberUtils.cfh
+++ b/core/Clownfish/Util/NumberUtils.cfh
@@ -180,7 +180,7 @@ __C__
#include <string.h>
-static CHY_INLINE void
+static CFISH_INLINE void
lucy_NumUtil_encode_bigend_u16(uint16_t value, void *dest_ptr) {
uint8_t *dest = *(uint8_t**)dest_ptr;
#ifdef CHY_BIG_END
@@ -192,7 +192,7 @@ lucy_NumUtil_encode_bigend_u16(uint16_t value, void *dest_ptr) {
#endif // CHY_BIG_END (and little endian)
}
-static CHY_INLINE void
+static CFISH_INLINE void
lucy_NumUtil_encode_bigend_u32(uint32_t value, void *dest_ptr) {
uint8_t *dest = *(uint8_t**)dest_ptr;
#ifdef CHY_BIG_END
@@ -206,7 +206,7 @@ lucy_NumUtil_encode_bigend_u32(uint32_t value, void *dest_ptr) {
#endif // CHY_BIG_END (and little endian)
}
-static CHY_INLINE void
+static CFISH_INLINE void
lucy_NumUtil_encode_bigend_u64(uint64_t value, void *dest_ptr) {
uint8_t *dest = *(uint8_t**)dest_ptr;
#ifdef CHY_BIG_END
@@ -224,14 +224,14 @@ lucy_NumUtil_encode_bigend_u64(uint64_t value, void *dest_ptr) {
#endif // CHY_BIG_END (and little endian)
}
-static CHY_INLINE uint16_t
+static CFISH_INLINE uint16_t
lucy_NumUtil_decode_bigend_u16(void *source) {
uint8_t *const buf = (uint8_t*)source;
return (buf[0] << 8) |
(buf[1]);
}
-static CHY_INLINE uint32_t
+static CFISH_INLINE uint32_t
lucy_NumUtil_decode_bigend_u32(void *source) {
uint8_t *const buf = (uint8_t*)source;
return (buf[0] << 24) |
@@ -240,7 +240,7 @@ lucy_NumUtil_decode_bigend_u32(void *source) {
(buf[3]);
}
-static CHY_INLINE uint64_t
+static CFISH_INLINE uint64_t
lucy_NumUtil_decode_bigend_u64(void *source) {
uint8_t *const buf = (uint8_t*)source;
uint64_t high_bits = (buf[0] << 24) |
@@ -256,7 +256,7 @@ lucy_NumUtil_decode_bigend_u64(void *source) {
return retval;
}
-static CHY_INLINE void
+static CFISH_INLINE void
lucy_NumUtil_encode_bigend_f32(float value, void *dest_ptr) {
uint8_t *dest = *(uint8_t**)dest_ptr;
#ifdef CHY_BIG_END
@@ -268,7 +268,7 @@ lucy_NumUtil_encode_bigend_f32(float value, void *dest_ptr) {
#endif
}
-static CHY_INLINE void
+static CFISH_INLINE void
lucy_NumUtil_encode_bigend_f64(double value, void *dest_ptr) {
uint8_t *dest = *(uint8_t**)dest_ptr;
#ifdef CHY_BIG_END
@@ -280,7 +280,7 @@ lucy_NumUtil_encode_bigend_f64(double value, void *dest_ptr) {
#endif
}
-static CHY_INLINE float
+static CFISH_INLINE float
lucy_NumUtil_decode_bigend_f32(void *source) {
union { float f; uint32_t u32; } duo;
memcpy(&duo, source, sizeof(float));
@@ -290,7 +290,7 @@ lucy_NumUtil_decode_bigend_f32(void *source) {
return duo.f;
}
-static CHY_INLINE double
+static CFISH_INLINE double
lucy_NumUtil_decode_bigend_f64(void *source) {
union { double d; uint64_t u64; } duo;
memcpy(&duo, source, sizeof(double));
@@ -303,7 +303,7 @@ lucy_NumUtil_decode_bigend_f64(void *source) {
#define LUCY_NUMUTIL_C32_MAX_BYTES ((sizeof(uint32_t) * 8 / 7) + 1) // 5
#define LUCY_NUMUTIL_C64_MAX_BYTES ((sizeof(uint64_t) * 8 / 7) + 1) // 10
-static CHY_INLINE void
+static CFISH_INLINE void
lucy_NumUtil_encode_c32(uint32_t value, char **out_buf) {
uint8_t buf[LUCY_NUMUTIL_C32_MAX_BYTES];
uint8_t *const limit = buf + sizeof(buf);
@@ -322,7 +322,7 @@ lucy_NumUtil_encode_c32(uint32_t value, char **out_buf) {
*out_buf += num_bytes;
}
-static CHY_INLINE void
+static CFISH_INLINE void
lucy_NumUtil_encode_c64(uint64_t value, char **out_buf) {
uint8_t buf[LUCY_NUMUTIL_C64_MAX_BYTES];
uint8_t *const limit = buf + sizeof(buf);
@@ -341,7 +341,7 @@ lucy_NumUtil_encode_c64(uint64_t value, char **out_buf) {
*out_buf += num_bytes;
}
-static CHY_INLINE void
+static CFISH_INLINE void
lucy_NumUtil_encode_padded_c32(uint32_t value, char **out_buf) {
uint8_t buf[LUCY_NUMUTIL_C32_MAX_BYTES]
= { 0x80, 0x80, 0x80, 0x80, 0x80 };
@@ -368,7 +368,7 @@ lucy_NumUtil_encode_padded_c32(uint32_t value, char **out_buf) {
} \
} while (0)
-static CHY_INLINE uint32_t
+static CFISH_INLINE uint32_t
lucy_NumUtil_decode_c32(char **source_ptr) {
char *source = *source_ptr;
uint32_t decoded;
@@ -377,7 +377,7 @@ lucy_NumUtil_decode_c32(char **source_ptr) {
return decoded;
}
-static CHY_INLINE uint64_t
+static CFISH_INLINE uint64_t
lucy_NumUtil_decode_c64(char **source_ptr) {
char *source = *source_ptr;
uint64_t decoded;
@@ -386,14 +386,14 @@ lucy_NumUtil_decode_c64(char **source_ptr) {
return decoded;
}
-static CHY_INLINE void
+static CFISH_INLINE void
lucy_NumUtil_skip_cint(char **source_ptr) {
uint8_t *ptr = *(uint8_t**)source_ptr;
while ((*ptr++ & 0x80) != 0) { }
*source_ptr = (char*)ptr;
}
-static CHY_INLINE bool
+static CFISH_INLINE bool
lucy_NumUtil_u1get(void *array, uint32_t tick) {
uint8_t *const u8bits = (uint8_t*)array;
const uint32_t byte_offset = tick >> 3;
@@ -401,7 +401,7 @@ lucy_NumUtil_u1get(void *array, uint32_t tick) {
return !((u8bits[byte_offset] & mask) == 0);
}
-static CHY_INLINE void
+static CFISH_INLINE void
lucy_NumUtil_u1set(void *array, uint32_t tick) {
uint8_t *const u8bits = (uint8_t*)array;
const uint32_t byte_offset = tick >> 3;
@@ -409,7 +409,7 @@ lucy_NumUtil_u1set(void *array, uint32_t tick) {
u8bits[byte_offset] |= mask;
}
-static CHY_INLINE void
+static CFISH_INLINE void
lucy_NumUtil_u1clear(void *array, uint32_t tick) {
uint8_t *const u8bits = (uint8_t*)array;
const uint32_t byte_offset = tick >> 3;
@@ -417,7 +417,7 @@ lucy_NumUtil_u1clear(void *array, uint32_t tick) {
u8bits[byte_offset] &= ~mask;
}
-static CHY_INLINE void
+static CFISH_INLINE void
lucy_NumUtil_u1flip(void *array, uint32_t tick) {
uint8_t *const u8bits = (uint8_t*)array;
const uint32_t byte_offset = tick >> 3;
@@ -425,7 +425,7 @@ lucy_NumUtil_u1flip(void *array, uint32_t tick) {
u8bits[byte_offset] ^= mask;
}
-static CHY_INLINE uint8_t
+static CFISH_INLINE uint8_t
lucy_NumUtil_u2get(void *array, uint32_t tick) {
uint8_t *ints = (uint8_t*)array;
uint8_t byte = ints[(tick >> 2)];
@@ -433,7 +433,7 @@ lucy_NumUtil_u2get(void *array, uint32_t tick) {
return (byte >> shift) & 0x3;
}
-static CHY_INLINE void
+static CFISH_INLINE void
lucy_NumUtil_u2set(void *array, uint32_t tick, uint8_t value) {
uint8_t *ints = (uint8_t*)array;
unsigned sub_tick = tick & 0x3;
@@ -445,7 +445,7 @@ lucy_NumUtil_u2set(void *array, uint32_t tick, uint8_t value) {
}
-static CHY_INLINE uint8_t
+static CFISH_INLINE uint8_t
lucy_NumUtil_u4get(void *array, uint32_t tick) {
uint8_t *ints = (uint8_t*)array;
uint8_t byte = ints[(tick >> 1)];
@@ -453,7 +453,7 @@ lucy_NumUtil_u4get(void *array, uint32_t tick) {
return (byte >> shift) & 0xF;
}
-static CHY_INLINE void
+static CFISH_INLINE void
lucy_NumUtil_u4set(void *array, uint32_t tick, uint8_t value) {
uint8_t *ints = (uint8_t*)array;
unsigned sub_tick = tick & 0x1;
http://git-wip-us.apache.org/repos/asf/lucy/blob/7c9638eb/core/Lucy/Plan/FieldType.cfh
----------------------------------------------------------------------
diff --git a/core/Lucy/Plan/FieldType.cfh b/core/Lucy/Plan/FieldType.cfh
index 6e86904..7f3df32 100644
--- a/core/Lucy/Plan/FieldType.cfh
+++ b/core/Lucy/Plan/FieldType.cfh
@@ -167,7 +167,7 @@ public abstract class Lucy::Plan::FieldType cnick FType
__C__
-static CHY_INLINE int32_t
+static CFISH_INLINE int32_t
lucy_FType_null_back_compare_values(lucy_FieldType *self,
lucy_Obj *a, lucy_Obj *b) {
if (a == NULL) {
http://git-wip-us.apache.org/repos/asf/lucy/blob/7c9638eb/perl/xs/XSBind.h
----------------------------------------------------------------------
diff --git a/perl/xs/XSBind.h b/perl/xs/XSBind.h
index 347f5c0..8d6e0ba 100644
--- a/perl/xs/XSBind.h
+++ b/perl/xs/XSBind.h
@@ -50,7 +50,7 @@ cfish_XSBind_new_blank_obj(SV *either_sv);
/** Test whether an SV is defined. Handles "get" magic, unlike SvOK on its
* own.
*/
-static CHY_INLINE bool
+static CFISH_INLINE bool
cfish_XSBind_sv_defined(SV *sv) {
if (!sv || !SvANY(sv)) { return false; }
if (SvGMAGICAL(sv)) { mg_get(sv); }
@@ -81,7 +81,7 @@ cfish_XSBind_maybe_sv_to_cfish_obj(SV *sv, cfish_VTable *vtable,
* The new SV has single refcount for which the caller must take
* responsibility.
*/
-static CHY_INLINE SV*
+static CFISH_INLINE SV*
cfish_XSBind_cfish_obj_to_sv(cfish_Obj *obj) {
return obj ? (SV*)Cfish_Obj_To_Host(obj) : newSV(0);
}
@@ -94,7 +94,7 @@ cfish_XSBind_cfish_obj_to_sv(cfish_Obj *obj) {
* after creating the SV. This is useful when the Clownfish expression creates a new
* refcount, e.g. a call to a constructor.
*/
-static CHY_INLINE SV*
+static CFISH_INLINE SV*
cfish_XSBind_cfish_obj_to_sv_noinc(cfish_Obj *obj) {
SV *retval;
if (obj) {