/* * 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); } }
int ChFunctionOptvarToolsJS::VectorToOptVariables(ChFunction* funct, ChMatrix<>* mv, int offset) { ChList<chjs_propdata> mtree; ChList<chjs_fullnamevar> mlist; double mval=0; int ind= 0; jsval vp; funct->MakeOptVariableTree(&mtree); funct->VariableTreeToFullNameVar(&mtree, &mlist); ChGLOBALS_JS().chjsEngine->chjs_contextclass = chjs_cast_funct(funct); ChGLOBALS_JS().chjsEngine->chjs_contextdata = funct; // *** ...INTO CONTEXT for (ChNode<chjs_fullnamevar>* mnode = mlist.GetHead(); mnode; mnode=mnode->next) { jsdouble jsd = mv->GetElement(offset+ind,0); JS_NewDoubleValue(ChGLOBALS_JS().chjsEngine->cx, jsd, &vp); JS_SetProperty(ChGLOBALS_JS().chjsEngine->cx, ChGLOBALS_JS().chjsEngine->jglobalObj, mnode->data->propname, &vp); ind++; } ChGLOBALS_JS().chjsEngine->chjs_contextclass = NULL; ChGLOBALS_JS().chjsEngine->chjs_contextdata = NULL; // *** ...OUT FROM CONTEXT return ind; }
void ChFunction_Jscript::Set_Variable (char* variablename, double value) { jsdouble jsd = value; jsval vp; JS_NewDoubleValue(ChGLOBALS_JS().chjsEngine->cx, jsd, &vp); JS_SetProperty(ChGLOBALS_JS().chjsEngine->cx, ChGLOBALS_JS().chjsEngine->jglobalObj, variablename, &vp); }
/* * Convert a Java object to a number by attempting to call the * doubleValue() method on a Java object to get a double result. * This usually only works on instances of java.lang.Double, but the code * is generalized to work with any Java object that supports this method. * * Returns JS_TRUE if the call was successful. * Returns JS_FALSE if conversion is not possible or an error occurs. */ JSBool jsj_ConvertJavaObjectToJSNumber(JSContext *cx, JNIEnv *jEnv, JavaClassDescriptor *class_descriptor, jobject java_obj, jsval *vp) { jdouble d; jmethodID doubleValue; jclass java_class; java_class = class_descriptor->java_class; doubleValue = (*jEnv)->GetMethodID(jEnv, java_class, "doubleValue", "()D"); if (!doubleValue) { /* There is no doubleValue() method for the object. Try toString() instead and the JS engine will attempt to convert the result to a number. */ (*jEnv)->ExceptionClear(jEnv); return jsj_ConvertJavaObjectToJSString(cx, jEnv, class_descriptor, java_obj, vp); } d = (*jEnv)->CallDoubleMethod(jEnv, java_obj, doubleValue); if ((*jEnv)->ExceptionOccurred(jEnv)) { jsj_UnexpectedJavaError(cx, jEnv, "doubleValue() method failed"); return JS_FALSE; } return JS_NewDoubleValue(cx, d, vp); }
// This function sets the value of the variable int ChOptVar::SetVarValue(double mval, void* database) { jsdouble jsd = mval; jsval vp; JS_NewDoubleValue(CHGLOBALS_JS().chjsEngine->cx, jsd, &vp); JS_SetProperty(CHGLOBALS_JS().chjsEngine->cx, CHGLOBALS_JS().chjsEngine->jglobalObj, this->GetVarName(), &vp); return TRUE; }
void ChOptVar::SetVarName (char myname[]) { strcpy (varname, myname); compiled = FALSE; double mvalue; if (!CHGLOBALS_JS().chjsEngine->chjs_Eval(this->GetVarName(),&mvalue)) { jsdouble jsd = 0.0; jsval vp; JS_NewDoubleValue(CHGLOBALS_JS().chjsEngine->cx, jsd, &vp); JS_SetProperty(CHGLOBALS_JS().chjsEngine->cx, CHGLOBALS_JS().chjsEngine->jglobalObj, this->GetVarName(), &vp); } }
// // Native method FileGetSize // JSBool PR_CALLBACK InstallFileOpFileGetSize(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { nsInstall *nativeThis = GetNativeThis(cx, obj, argv); if (!nativeThis) return JS_FALSE; PRInt64 nativeRet; JSObject *jsObj; nsInstallFolder *folder; *rval = INT_TO_JSVAL(nsInstall::UNEXPECTED_ERROR); // public int FileGetSize (String NativeFolderPath); if (argc == 0 || argv[0] == JSVAL_NULL || !JSVAL_IS_OBJECT(argv[0])) //argv[0] MUST be a jsval { *rval = INT_TO_JSVAL(nsInstall::INVALID_ARGUMENTS); return JS_TRUE; } jsObj = JSVAL_TO_OBJECT(argv[0]); if (!JS_InstanceOf(cx, jsObj, &FileSpecObjectClass, nsnull)) { *rval = INT_TO_JSVAL(nsInstall::INVALID_ARGUMENTS); return JS_TRUE; } folder = (nsInstallFolder*)JS_GetPrivate(cx, jsObj); if(!folder || NS_OK != nativeThis->FileOpFileGetSize(*folder, &nativeRet)) { return JS_TRUE; } PRFloat64 f; /* jsdouble's *are* PRFloat64's */ LL_L2F( f, nativeRet ); /* make float which is same type for js and nspr (native double) */ JS_NewDoubleValue( cx, f, rval ); return JS_TRUE; }
// // Native method FileGetDiskSpaceAvailable // JSBool PR_CALLBACK InstallFileOpFileGetDiskSpaceAvailable(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { nsInstall *nativeThis = GetNativeThis(cx, obj, argv); if (!nativeThis) return JS_FALSE; PRInt64 nativeRet; JSObject *jsObj; nsInstallFolder *folder; *rval = INT_TO_JSVAL(nsInstall::UNEXPECTED_ERROR); // public int FileGetDiskSpaceAvailable (String NativeFolderPath); if (argc == 0 || argv[0] == JSVAL_NULL || !JSVAL_IS_OBJECT(argv[0])) //argv[0] MUST be a jsval { *rval = INT_TO_JSVAL(nsInstall::INVALID_ARGUMENTS); return JS_TRUE; } jsObj = JSVAL_TO_OBJECT(argv[0]); if (!JS_InstanceOf(cx, jsObj, &FileSpecObjectClass, nsnull)) { *rval = INT_TO_JSVAL(nsInstall::INVALID_ARGUMENTS); return JS_TRUE; } folder = (nsInstallFolder*)JS_GetPrivate(cx, jsObj); if(!folder || NS_OK != nativeThis->FileOpFileGetDiskSpaceAvailable(*folder, &nativeRet)) { return JS_TRUE; } double d; LL_L2D(d, nativeRet); JS_NewDoubleValue( cx, d, rval ); return JS_TRUE; }
/* * Convert a Java object to a number by attempting to call the * doubleValue() method on a Java object to get a double result. * This usually only works on instances of java.lang.Double, but the code * is generalized to work with any Java object that supports this method. * * Returns JS_TRUE if the call was successful. * Returns JS_FALSE if conversion is not possible or an error occurs. */ JSBool jsj_ConvertJavaObjectToJSNumber(JSContext *cx, JNIEnv *jEnv, JavaClassDescriptor *class_descriptor, jobject java_obj, jsval *vp) { jdouble d; jmethodID doubleValue; jclass java_class; java_class = class_descriptor->java_class; doubleValue = (*jEnv)->GetMethodID(jEnv, java_class, "doubleValue", "()D"); if (!doubleValue) { /* There is no doubleValue() method for the object. Try toString() instead and the JS engine will attempt to convert the result to a number. */ (*jEnv)->ExceptionClear(jEnv); return jsj_ConvertJavaObjectToJSString(cx, jEnv, class_descriptor, java_obj, vp); } /* * Sun Java-Plugin team work around bug to be fixed in JRE1.5, where GetMethodID * called with a non-existent method name returns a non-null result. * See Mozilla bug 201164. */ if ((*jEnv)->ExceptionOccurred(jEnv)) { jsj_UnexpectedJavaError(cx, jEnv, "No doubleValue() method for class %s!", class_descriptor->name); return JS_FALSE; } d = (*jEnv)->CallDoubleMethod(jEnv, java_obj, doubleValue); if ((*jEnv)->ExceptionOccurred(jEnv)) { jsj_UnexpectedJavaError(cx, jEnv, "doubleValue() method failed"); return JS_FALSE; } return JS_NewDoubleValue(cx, d, vp); }
static JSBool convert_float_or_bignum_to_js(JohnsonRuntime* runtime, VALUE float_or_bignum, jsval* retval) { JSContext * context = johnson_get_current_context(runtime); return JS_NewDoubleValue(context, NUM2DBL(float_or_bignum), retval); }
/* Converts perl values to equivalent JS values */ JSBool PJS_ReflectPerl2JS( pTHX_ JSContext *cx, JSObject *pobj, SV *ref, jsval *rval ) { PJS_Context *pcx = PJS_GET_CONTEXT(cx); JSObject *newobj = NULL; if(++pcx->svconv % 2000 == 0) { JSErrorReporter older; ENTER; SAVETMPS; /* Scope for finalizers */ older = JS_SetErrorReporter(cx, NULL); if(pcx->svconv > 10000) { JS_GC(cx); pcx->svconv = 0; } else JS_MaybeGC(cx); JS_SetErrorReporter(cx, older); FREETMPS; LEAVE; } if(SvROK(ref)) { MAGIC *mg; /* First check old jsvisitors */ if((newobj = PJS_IsPerlVisitor(aTHX_ pcx, SvRV(ref)))) { PJS_DEBUG("Old jsvisitor returns\n"); *rval = OBJECT_TO_JSVAL(newobj); return JS_TRUE; } if(SvMAGICAL(SvRV(ref)) && (mg = mg_find(SvRV(ref), PERL_MAGIC_tied)) && mg->mg_obj && sv_derived_from(mg->mg_obj, PJS_BOXED_PACKAGE)) { PJS_DEBUG1("A magical ref %s, shortcircuit!\n", SvPV_nolen((SV*)mg->mg_obj)); ref = mg->mg_obj; } if(sv_derived_from(ref, PJS_BOXED_PACKAGE)) { SV **fref = av_fetch((AV *)SvRV(SvRV(ref)), 2, 0); assert(sv_derived_from(*fref, PJS_RAW_JSVAL)); *rval = (jsval)SvIV(SvRV(*fref)); return JS_TRUE; } if(sv_derived_from(ref, PJS_BOOLEAN)) { *rval = SvTRUE(SvRV(ref)) ? JSVAL_TRUE : JSVAL_FALSE; return JS_TRUE; } if(sv_isobject(ref)) { newobj = PJS_NewPerlObject(aTHX_ cx, pobj, ref); if(newobj) { *rval = OBJECT_TO_JSVAL(newobj); return JS_TRUE; } return JS_FALSE; } } SvGETMAGIC(ref); if(!SvOK(ref)) /* undef */ *rval = JSVAL_VOID; else if(SvIOK(ref) || SvIOKp(ref)) { if(SvIV(ref) <= JSVAL_INT_MAX) *rval = INT_TO_JSVAL(SvIV(ref)); else JS_NewDoubleValue(cx, (double) SvIV(ref), rval); } else if(SvNOK(ref)) JS_NewDoubleValue(cx, SvNV(ref), rval); else if(SvPOK(ref) || SvPOKp(ref)) { STRLEN len; char *str; SV *temp=NULL; if(SvREADONLY(ref)) { temp = newSVsv(ref); str = PJS_SvPV(temp, len); } else str = PJS_SvPV(ref, len); JSString *jstr = ((int)len >= 0) ? JS_NewStringCopyN(cx, str, len) : JS_NewUCStringCopyN(cx, (jschar *)str, -(int)len); sv_free(temp); if(!jstr) return JS_FALSE; *rval = STRING_TO_JSVAL(jstr); } else if(SvROK(ref)) { /* Plain reference */ I32 type = SvTYPE(SvRV(ref)); if(type == SVt_PVHV) newobj = PJS_NewPerlHash(aTHX_ cx, pobj, ref); else if(type == SVt_PVAV) newobj = PJS_NewPerlArray(aTHX_ cx, pobj, ref); else if(type == SVt_PVCV) newobj = PJS_NewPerlSub(aTHX_ cx, pobj, ref); else newobj = PJS_NewPerlScalar(aTHX_ cx, pobj, ref); if(!newobj) return JS_FALSE; *rval = OBJECT_TO_JSVAL(newobj); } else { warn("I have no idea what perl send us (it's of type %i), I'll pretend it's undef", SvTYPE(ref)); *rval = JSVAL_VOID; } return JS_TRUE; }