Skip to content

Commit e267c70

Browse files
committed
- added instanceof method
1 parent 4c6ed66 commit e267c70

3 files changed

Lines changed: 35 additions & 2 deletions

File tree

src/java.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ long my_getThreadId() {
5757
NODE_SET_PROTOTYPE_METHOD(s_ct, "newFloat", newFloat);
5858
NODE_SET_PROTOTYPE_METHOD(s_ct, "getStaticFieldValue", getStaticFieldValue);
5959
NODE_SET_PROTOTYPE_METHOD(s_ct, "setStaticFieldValue", setStaticFieldValue);
60+
NODE_SET_PROTOTYPE_METHOD(s_ct, "instanceof", instanceof);
6061

6162
target->Set(v8::String::NewSymbol("Java"), s_ct->GetFunction());
6263
}
@@ -793,6 +794,37 @@ void Java::destroyJVM(JavaVM** jvm, JNIEnv** env) {
793794
return v8::Undefined();
794795
}
795796

797+
/*static*/ v8::Handle<v8::Value> Java::instanceof(const v8::Arguments& args) {
798+
v8::HandleScope scope;
799+
Java* self = node::ObjectWrap::Unwrap<Java>(args.This());
800+
v8::Handle<v8::Value> ensureJvmResults = self->ensureJvm();
801+
if(!ensureJvmResults->IsUndefined()) {
802+
return ensureJvmResults;
803+
}
804+
JNIEnv* env = self->getJavaEnv();
805+
JavaScope javaScope(env);
806+
807+
int argsStart = 0;
808+
ARGS_FRONT_OBJECT(obj);
809+
ARGS_FRONT_STRING(className);
810+
811+
jobject instance = v8ToJava(env, obj);
812+
if (!instance) {
813+
// not even a Java object
814+
return v8::False();
815+
}
816+
817+
jclass clazz = javaFindClass(env, className);
818+
if(!clazz) {
819+
std::ostringstream errStr;
820+
errStr << "Could not find class " << className.c_str();
821+
return ThrowException(javaExceptionToV8(self, env, errStr.str()));
822+
}
823+
824+
jboolean res = env->IsInstanceOf(instance, clazz);
825+
return v8::Boolean::New(res);
826+
}
827+
796828
void EIO_CallJs(uv_work_t* req) {
797829
}
798830

src/java.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ class Java : public node::ObjectWrap {
3535
static v8::Handle<v8::Value> newFloat(const v8::Arguments& args);
3636
static v8::Handle<v8::Value> getStaticFieldValue(const v8::Arguments& args);
3737
static v8::Handle<v8::Value> setStaticFieldValue(const v8::Arguments& args);
38+
static v8::Handle<v8::Value> instanceof(const v8::Arguments& args);
3839
static v8::Handle<v8::Value> AccessorProhibitsOverwritingGetter(v8::Local<v8::String> name, const v8::AccessorInfo &info);
3940
static void AccessorProhibitsOverwritingSetter(v8::Local<v8::String> property, v8::Local<v8::Value> value, const v8::AccessorInfo &info);
4041
v8::Handle<v8::Value> ensureJvm();

src/utils.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -288,8 +288,8 @@ jobject v8ToJava(JNIEnv* env, v8::Local<v8::Value> arg) {
288288
}
289289

290290
// TODO: handle other arg types
291-
v8::String::AsciiValue typeStr(arg);
292-
printf("v8ToJava: Unhandled type: %s\n", *typeStr);
291+
// v8::String::AsciiValue typeStr(arg);
292+
// printf("v8ToJava: Unhandled type: %s\n", *typeStr);
293293
return NULL;
294294
}
295295

0 commit comments

Comments
 (0)