Mercurial > hg > truffle
comparison src/share/vm/prims/whitebox.cpp @ 20249:0c48231c5c84
8038756: new WB API :: get/setVMFlag
Reviewed-by: vlivanov, sla
author | iignatyev |
---|---|
date | Fri, 30 May 2014 17:20:48 +0400 |
parents | 78bbf4d43a14 |
children | 2c6ef90f030a |
comparison
equal
deleted
inserted
replaced
20248:009de2b033fc | 20249:0c48231c5c84 |
---|---|
499 mh->set_prev_time(0, THREAD); | 499 mh->set_prev_time(0, THREAD); |
500 #endif | 500 #endif |
501 } | 501 } |
502 WB_END | 502 WB_END |
503 | 503 |
504 template <typename T> | |
505 static bool GetVMFlag(JavaThread* thread, JNIEnv* env, jstring name, T* value, bool (*TAt)(const char*, T*)) { | |
506 if (name == NULL) { | |
507 return false; | |
508 } | |
509 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI | |
510 const char* flag_name = env->GetStringUTFChars(name, NULL); | |
511 bool result = (*TAt)(flag_name, value); | |
512 env->ReleaseStringUTFChars(name, flag_name); | |
513 return result; | |
514 } | |
515 | |
516 template <typename T> | |
517 static bool SetVMFlag(JavaThread* thread, JNIEnv* env, jstring name, T* value, bool (*TAtPut)(const char*, T*, Flag::Flags)) { | |
518 if (name == NULL) { | |
519 return false; | |
520 } | |
521 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI | |
522 const char* flag_name = env->GetStringUTFChars(name, NULL); | |
523 bool result = (*TAtPut)(flag_name, value, Flag::INTERNAL); | |
524 env->ReleaseStringUTFChars(name, flag_name); | |
525 return result; | |
526 } | |
527 | |
528 template <typename T> | |
529 static jobject box(JavaThread* thread, JNIEnv* env, Symbol* name, Symbol* sig, T value) { | |
530 ResourceMark rm(thread); | |
531 jclass clazz = env->FindClass(name->as_C_string()); | |
532 CHECK_JNI_EXCEPTION_(env, NULL); | |
533 jmethodID methodID = env->GetStaticMethodID(clazz, | |
534 vmSymbols::valueOf_name()->as_C_string(), | |
535 sig->as_C_string()); | |
536 CHECK_JNI_EXCEPTION_(env, NULL); | |
537 jobject result = env->CallStaticObjectMethod(clazz, methodID, value); | |
538 CHECK_JNI_EXCEPTION_(env, NULL); | |
539 return result; | |
540 } | |
541 | |
542 static jobject booleanBox(JavaThread* thread, JNIEnv* env, jboolean value) { | |
543 return box(thread, env, vmSymbols::java_lang_Boolean(), vmSymbols::Boolean_valueOf_signature(), value); | |
544 } | |
545 static jobject integerBox(JavaThread* thread, JNIEnv* env, jint value) { | |
546 return box(thread, env, vmSymbols::java_lang_Integer(), vmSymbols::Integer_valueOf_signature(), value); | |
547 } | |
548 static jobject longBox(JavaThread* thread, JNIEnv* env, jlong value) { | |
549 return box(thread, env, vmSymbols::java_lang_Long(), vmSymbols::Long_valueOf_signature(), value); | |
550 } | |
551 /* static jobject floatBox(JavaThread* thread, JNIEnv* env, jfloat value) { | |
552 return box(thread, env, vmSymbols::java_lang_Float(), vmSymbols::Float_valueOf_signature(), value); | |
553 }*/ | |
554 static jobject doubleBox(JavaThread* thread, JNIEnv* env, jdouble value) { | |
555 return box(thread, env, vmSymbols::java_lang_Double(), vmSymbols::Double_valueOf_signature(), value); | |
556 } | |
557 | |
558 WB_ENTRY(jobject, WB_GetBooleanVMFlag(JNIEnv* env, jobject o, jstring name)) | |
559 bool result; | |
560 if (GetVMFlag <bool> (thread, env, name, &result, &CommandLineFlags::boolAt)) { | |
561 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI | |
562 return booleanBox(thread, env, result); | |
563 } | |
564 return NULL; | |
565 WB_END | |
566 | |
567 WB_ENTRY(jobject, WB_GetIntxVMFlag(JNIEnv* env, jobject o, jstring name)) | |
568 intx result; | |
569 if (GetVMFlag <intx> (thread, env, name, &result, &CommandLineFlags::intxAt)) { | |
570 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI | |
571 return longBox(thread, env, result); | |
572 } | |
573 return NULL; | |
574 WB_END | |
575 | |
576 WB_ENTRY(jobject, WB_GetUintxVMFlag(JNIEnv* env, jobject o, jstring name)) | |
577 uintx result; | |
578 if (GetVMFlag <uintx> (thread, env, name, &result, &CommandLineFlags::uintxAt)) { | |
579 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI | |
580 return longBox(thread, env, result); | |
581 } | |
582 return NULL; | |
583 WB_END | |
584 | |
585 WB_ENTRY(jobject, WB_GetUint64VMFlag(JNIEnv* env, jobject o, jstring name)) | |
586 uint64_t result; | |
587 if (GetVMFlag <uint64_t> (thread, env, name, &result, &CommandLineFlags::uint64_tAt)) { | |
588 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI | |
589 return longBox(thread, env, result); | |
590 } | |
591 return NULL; | |
592 WB_END | |
593 | |
594 WB_ENTRY(jobject, WB_GetDoubleVMFlag(JNIEnv* env, jobject o, jstring name)) | |
595 double result; | |
596 if (GetVMFlag <double> (thread, env, name, &result, &CommandLineFlags::doubleAt)) { | |
597 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI | |
598 return doubleBox(thread, env, result); | |
599 } | |
600 return NULL; | |
601 WB_END | |
602 | |
603 WB_ENTRY(jstring, WB_GetStringVMFlag(JNIEnv* env, jobject o, jstring name)) | |
604 ccstr ccstrResult; | |
605 if (GetVMFlag <ccstr> (thread, env, name, &ccstrResult, &CommandLineFlags::ccstrAt)) { | |
606 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI | |
607 jstring result = env->NewStringUTF(ccstrResult); | |
608 CHECK_JNI_EXCEPTION_(env, NULL); | |
609 return result; | |
610 } | |
611 return NULL; | |
612 WB_END | |
613 | |
614 WB_ENTRY(void, WB_SetBooleanVMFlag(JNIEnv* env, jobject o, jstring name, jboolean value)) | |
615 bool result = value == JNI_TRUE ? true : false; | |
616 SetVMFlag <bool> (thread, env, name, &result, &CommandLineFlags::boolAtPut); | |
617 WB_END | |
618 | |
619 WB_ENTRY(void, WB_SetIntxVMFlag(JNIEnv* env, jobject o, jstring name, jlong value)) | |
620 intx result = value; | |
621 SetVMFlag <intx> (thread, env, name, &result, &CommandLineFlags::intxAtPut); | |
622 WB_END | |
623 | |
624 WB_ENTRY(void, WB_SetUintxVMFlag(JNIEnv* env, jobject o, jstring name, jlong value)) | |
625 uintx result = value; | |
626 SetVMFlag <uintx> (thread, env, name, &result, &CommandLineFlags::uintxAtPut); | |
627 WB_END | |
628 | |
629 WB_ENTRY(void, WB_SetUint64VMFlag(JNIEnv* env, jobject o, jstring name, jlong value)) | |
630 uint64_t result = value; | |
631 SetVMFlag <uint64_t> (thread, env, name, &result, &CommandLineFlags::uint64_tAtPut); | |
632 WB_END | |
633 | |
634 WB_ENTRY(void, WB_SetDoubleVMFlag(JNIEnv* env, jobject o, jstring name, jdouble value)) | |
635 double result = value; | |
636 SetVMFlag <double> (thread, env, name, &result, &CommandLineFlags::doubleAtPut); | |
637 WB_END | |
638 | |
639 WB_ENTRY(void, WB_SetStringVMFlag(JNIEnv* env, jobject o, jstring name, jstring value)) | |
640 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI | |
641 const char* ccstrValue = (value == NULL) ? NULL : env->GetStringUTFChars(value, NULL); | |
642 ccstr ccstrResult = ccstrValue; | |
643 bool needFree; | |
644 { | |
645 ThreadInVMfromNative ttvfn(thread); // back to VM | |
646 needFree = SetVMFlag <ccstr> (thread, env, name, &ccstrResult, &CommandLineFlags::ccstrAtPut); | |
647 } | |
648 if (value != NULL) { | |
649 env->ReleaseStringUTFChars(value, ccstrValue); | |
650 } | |
651 if (needFree) { | |
652 FREE_C_HEAP_ARRAY(char, ccstrResult, mtInternal); | |
653 } | |
654 WB_END | |
655 | |
656 | |
504 WB_ENTRY(jboolean, WB_IsInStringTable(JNIEnv* env, jobject o, jstring javaString)) | 657 WB_ENTRY(jboolean, WB_IsInStringTable(JNIEnv* env, jobject o, jstring javaString)) |
505 ResourceMark rm(THREAD); | 658 ResourceMark rm(THREAD); |
506 int len; | 659 int len; |
507 jchar* name = java_lang_String::as_unicode_string(JNIHandles::resolve(javaString), len, CHECK_false); | 660 jchar* name = java_lang_String::as_unicode_string(JNIHandles::resolve(javaString), len, CHECK_false); |
508 return (StringTable::lookup(name, len) != NULL); | 661 return (StringTable::lookup(name, len) != NULL); |
557 result = env->NewObjectArray(2, clazz, NULL); | 710 result = env->NewObjectArray(2, clazz, NULL); |
558 if (result == NULL) { | 711 if (result == NULL) { |
559 return result; | 712 return result; |
560 } | 713 } |
561 | 714 |
562 clazz = env->FindClass(vmSymbols::java_lang_Integer()->as_C_string()); | 715 jobject obj = integerBox(thread, env, code->comp_level()); |
563 CHECK_JNI_EXCEPTION_(env, NULL); | |
564 jmethodID constructor = env->GetMethodID(clazz, vmSymbols::object_initializer_name()->as_C_string(), vmSymbols::int_void_signature()->as_C_string()); | |
565 CHECK_JNI_EXCEPTION_(env, NULL); | |
566 jobject obj = env->NewObject(clazz, constructor, code->comp_level()); | |
567 CHECK_JNI_EXCEPTION_(env, NULL); | 716 CHECK_JNI_EXCEPTION_(env, NULL); |
568 env->SetObjectArrayElement(result, 0, obj); | 717 env->SetObjectArrayElement(result, 0, obj); |
569 | 718 |
570 jbyteArray insts = env->NewByteArray(insts_size); | 719 jbyteArray insts = env->NewByteArray(insts_size); |
571 CHECK_JNI_EXCEPTION_(env, NULL); | 720 CHECK_JNI_EXCEPTION_(env, NULL); |
682 CC"(Ljava/lang/reflect/Executable;Z)Z", (void*)&WB_TestSetForceInlineMethod}, | 831 CC"(Ljava/lang/reflect/Executable;Z)Z", (void*)&WB_TestSetForceInlineMethod}, |
683 {CC"enqueueMethodForCompilation", | 832 {CC"enqueueMethodForCompilation", |
684 CC"(Ljava/lang/reflect/Executable;II)Z", (void*)&WB_EnqueueMethodForCompilation}, | 833 CC"(Ljava/lang/reflect/Executable;II)Z", (void*)&WB_EnqueueMethodForCompilation}, |
685 {CC"clearMethodState", | 834 {CC"clearMethodState", |
686 CC"(Ljava/lang/reflect/Executable;)V", (void*)&WB_ClearMethodState}, | 835 CC"(Ljava/lang/reflect/Executable;)V", (void*)&WB_ClearMethodState}, |
687 {CC"isInStringTable", CC"(Ljava/lang/String;)Z", (void*)&WB_IsInStringTable }, | 836 {CC"setBooleanVMFlag", CC"(Ljava/lang/String;Z)V",(void*)&WB_SetBooleanVMFlag}, |
837 {CC"setIntxVMFlag", CC"(Ljava/lang/String;J)V",(void*)&WB_SetIntxVMFlag}, | |
838 {CC"setUintxVMFlag", CC"(Ljava/lang/String;J)V",(void*)&WB_SetUintxVMFlag}, | |
839 {CC"setUint64VMFlag", CC"(Ljava/lang/String;J)V",(void*)&WB_SetUint64VMFlag}, | |
840 {CC"setDoubleVMFlag", CC"(Ljava/lang/String;D)V",(void*)&WB_SetDoubleVMFlag}, | |
841 {CC"setStringVMFlag", CC"(Ljava/lang/String;Ljava/lang/String;)V", | |
842 (void*)&WB_SetStringVMFlag}, | |
843 {CC"getBooleanVMFlag", CC"(Ljava/lang/String;)Ljava/lang/Boolean;", | |
844 (void*)&WB_GetBooleanVMFlag}, | |
845 {CC"getIntxVMFlag", CC"(Ljava/lang/String;)Ljava/lang/Long;", | |
846 (void*)&WB_GetIntxVMFlag}, | |
847 {CC"getUintxVMFlag", CC"(Ljava/lang/String;)Ljava/lang/Long;", | |
848 (void*)&WB_GetUintxVMFlag}, | |
849 {CC"getUint64VMFlag", CC"(Ljava/lang/String;)Ljava/lang/Long;", | |
850 (void*)&WB_GetUint64VMFlag}, | |
851 {CC"getDoubleVMFlag", CC"(Ljava/lang/String;)Ljava/lang/Double;", | |
852 (void*)&WB_GetDoubleVMFlag}, | |
853 {CC"getStringVMFlag", CC"(Ljava/lang/String;)Ljava/lang/String;", | |
854 (void*)&WB_GetStringVMFlag}, | |
855 {CC"isInStringTable", CC"(Ljava/lang/String;)Z", (void*)&WB_IsInStringTable }, | |
688 {CC"fullGC", CC"()V", (void*)&WB_FullGC }, | 856 {CC"fullGC", CC"()V", (void*)&WB_FullGC }, |
689 {CC"readReservedMemory", CC"()V", (void*)&WB_ReadReservedMemory }, | 857 {CC"readReservedMemory", CC"()V", (void*)&WB_ReadReservedMemory }, |
690 {CC"getCPUFeatures", CC"()Ljava/lang/String;", (void*)&WB_GetCPUFeatures }, | 858 {CC"getCPUFeatures", CC"()Ljava/lang/String;", (void*)&WB_GetCPUFeatures }, |
691 {CC"getNMethod", CC"(Ljava/lang/reflect/Executable;Z)[Ljava/lang/Object;", | 859 {CC"getNMethod", CC"(Ljava/lang/reflect/Executable;Z)[Ljava/lang/Object;", |
692 (void*)&WB_GetNMethod }, | 860 (void*)&WB_GetNMethod }, |