Handle<Value> Proxy::proxyConstructor(const Arguments& args) { HandleScope scope; JNIEnv *env = JNIScope::getEnv(); Local<Object> jsProxy = args.Holder(); Handle<Object> properties = Object::New(); jsProxy->Set(propertiesSymbol, properties, PropertyAttribute(DontEnum)); Handle<Object> prototype = jsProxy->GetPrototype()->ToObject(); Handle<Function> constructor = Handle<Function>::Cast(prototype->Get(constructorSymbol)); jclass javaClass = (jclass) External::Unwrap(constructor->Get(javaClassSymbol)); // If ProxyFactory::createV8Proxy invoked us, unwrap // the pre-created Java proxy it sent. jobject javaProxy = ProxyFactory::unwrapJavaProxy(args); bool deleteRef = false; if (!javaProxy) { javaProxy = ProxyFactory::createJavaProxy(javaClass, jsProxy, args); deleteRef = true; } JNIUtil::logClassName("Create proxy: %s", javaClass); Proxy *proxy = new Proxy(javaProxy); proxy->Wrap(jsProxy); int length = args.Length(); if (length > 0 && args[0]->IsObject()) { /* Handle<Value> argsStr = V8Util::jsonStringify(args[0]); String::Utf8Value str(argsStr); LOGV(TAG, " with args: %s", *str); */ bool extend = true; Handle<Object> createProperties = args[0]->ToObject(); Local<String> constructorName = createProperties->GetConstructorName(); if (strcmp(*String::Utf8Value(constructorName), "Arguments") == 0) { extend = false; int32_t argsLength = createProperties->Get(String::New("length"))->Int32Value(); if (argsLength > 1) { Handle<Value> properties = createProperties->Get(1); if (properties->IsObject()) { extend = true; createProperties = properties->ToObject(); } } } if (extend) { Handle<Array> names = createProperties->GetOwnPropertyNames(); int length = names->Length(); for (int i = 0; i < length; ++i) { Handle<Value> name = names->Get(i); Handle<Value> value = createProperties->Get(name); bool isProperty = true; if (name->IsString()) { Handle<String> nameString = name->ToString(); if (!jsProxy->HasRealNamedCallbackProperty(nameString) && !jsProxy->HasRealNamedProperty(nameString)) { jsProxy->Set(name, value); isProperty = false; } } if (isProperty) { properties->Set(name, value); } } } } if (!args.Data().IsEmpty() && args.Data()->IsFunction()) { Handle<Function> proxyFn = Handle<Function>::Cast(args.Data()); Handle<Value> *fnArgs = new Handle<Value>[length]; for (int i = 0; i < length; ++i) { fnArgs[i] = args[i]; } proxyFn->Call(jsProxy, length, fnArgs); } if (deleteRef) { JNIEnv *env = JNIScope::getEnv(); if (env) { env->DeleteLocalRef(javaProxy); } } return jsProxy; }