static void add_long(void *opaque, void *parent, const char *name, long v) { if(v <= INT32_MAX && v >= INT32_MIN && INT_FITS_IN_JSVAL(v)) add_item(opaque, parent, name, INT_TO_JSVAL(v)); else add_double(opaque, parent, name, v); }
/* * Convert a Java value (primitive or object) to a JS value. * * This is usually an infallible operation, but JS_FALSE is returned * on an out-of-memory condition and the error reporter is called. */ JSBool jsj_ConvertJavaValueToJSValue(JSContext *cx, JNIEnv *jEnv, JavaSignature *signature, jvalue *java_value, jsval *vp) { int32 ival32; switch (signature->type) { case JAVA_SIGNATURE_VOID: *vp = JSVAL_VOID; return JS_TRUE; case JAVA_SIGNATURE_BYTE: *vp = INT_TO_JSVAL((jsint)java_value->b); return JS_TRUE; case JAVA_SIGNATURE_CHAR: *vp = INT_TO_JSVAL((jsint)java_value->c); return JS_TRUE; case JAVA_SIGNATURE_SHORT: *vp = INT_TO_JSVAL((jsint)java_value->s); return JS_TRUE; case JAVA_SIGNATURE_INT: ival32 = java_value->i; if (INT_FITS_IN_JSVAL(ival32)) { *vp = INT_TO_JSVAL((jsint) ival32); return JS_TRUE; } else { return JS_NewDoubleValue(cx, ival32, vp); } case JAVA_SIGNATURE_BOOLEAN: *vp = BOOLEAN_TO_JSVAL((JSBool) java_value->z); return JS_TRUE; case JAVA_SIGNATURE_LONG: return JS_NewDoubleValue(cx, jlong_to_jdouble(java_value->j), vp); case JAVA_SIGNATURE_FLOAT: return JS_NewDoubleValue(cx, java_value->f, vp); case JAVA_SIGNATURE_DOUBLE: return JS_NewDoubleValue(cx, java_value->d, vp); case JAVA_SIGNATURE_UNKNOWN: JS_ASSERT(0); return JS_FALSE; /* Non-primitive (reference) type */ default: JS_ASSERT(IS_REFERENCE_TYPE(signature->type)); return jsj_ConvertJavaObjectToJSValue(cx, jEnv, java_value->l, vp); } }
void js_set_prop_int(JSContext *cx, JSObject *o, const char *prop, int v) { jsval val; if(v <= INT32_MAX && v >= INT32_MIN && INT_FITS_IN_JSVAL(v)) val = INT_TO_JSVAL(v); else { jsdouble *d = JS_NewDouble(cx, v); if(d == NULL) return; val = DOUBLE_TO_JSVAL(d); } js_set_prop_jsval(cx, o, prop, val); }
static JSBool req_status(JSContext* cx, JSObject* obj, jsval idval, jsval* vp) { int status = http_status(cx, obj); if(status < 0) return JS_FALSE; if(INT_FITS_IN_JSVAL(status)) { JS_SET_RVAL(cx, vp, INT_TO_JSVAL(status)); return JS_TRUE; } else { JS_ReportError(cx, "Invalid HTTP status."); return JS_FALSE; } }
static JSBool status(JSContext* cx, JSObject* obj, jsval idval, jsval* vp) { HTTPData* http = (HTTPData*) JS_GetPrivate(cx, obj); if(!http) { JS_ReportError(cx, "Invalid CouchHTTP instance."); return JS_FALSE; } if(INT_FITS_IN_JSVAL(http->last_status)) { *vp = INT_TO_JSVAL(http->last_status); return JS_TRUE; } else { JS_ReportError(cx, "INTERNAL: Invalid last_status"); return JS_FALSE; } }
static jsval jsval_from_htsmsgfield(JSContext *cx, htsmsg_field_t *f) { jsdouble *d; switch(f->hmf_type) { case HMF_STR: return STRING_TO_JSVAL(JS_NewStringCopyZ(cx, f->hmf_str)); case HMF_S64: if(f->hmf_s64 <= INT32_MAX && f->hmf_s64 >= INT32_MIN && INT_FITS_IN_JSVAL(f->hmf_s64)) return INT_TO_JSVAL(f->hmf_s64); if((d = JS_NewDouble(cx, f->hmf_s64)) != NULL) return DOUBLE_TO_JSVAL(d); break; case HMF_DBL: if((d = JS_NewDouble(cx, f->hmf_dbl)) != NULL) return DOUBLE_TO_JSVAL(d); break; } return JSVAL_NULL; }