jsvalue JsEngine::WrappedFromV8(Handle<Object> obj) { jsvalue v; if (js_object_marshal_type == JSOBJECT_MARSHAL_TYPE_DYNAMIC) { v.type = JSVALUE_TYPE_WRAPPED; v.length = 0; // A Persistent<Object> is exactly the size of an IntPtr, right? // If not we're in deep deep trouble (on IA32 and AMD64 should be). // We should even cast it to void* because C++ doesn't allow to put // it in a union: going scary and scarier here. v.value.ptr = new Persistent<Object>(Persistent<Object>::New(obj)); } else { v.type = JSVALUE_TYPE_DICT; Local<Array> names = obj->GetOwnPropertyNames(); v.length = names->Length(); jsvalue* values = new jsvalue[v.length * 2]; if (values != NULL) { for(int i = 0; i < v.length; i++) { int indx = (i * 2); Local<Value> key = names->Get(i); values[indx] = AnyFromV8(key); values[indx+1] = AnyFromV8(obj->Get(key)); } v.value.arr = values; } } return v; }
// Initializes commentary data, reading it from the language.dat file // void commentary::init_commentary(Handle<Object> languageDat) { HandleScope scope; // Read languageDat line by line, updating the // commentary database // const Local<Array> props = languageDat->GetOwnPropertyNames(); const uint32_t length = props->Length(); Local<String> key; Local<Array> value; Local<String> event, comment; char strKey[64]; char strValue[128]; for (uint32_t i=0 ; i<length ; ++i) { key = props->Get(i)->ToString(); value = Local<Array>::Cast(languageDat->Get(key)); event = value->Get(0)->ToString(); comment = value->Get(1)->ToString(); // Add line to the commentary database // comm_data[toAscii(event, strKey)].push_back(toAscii(comment, strValue)); } }
void V8Util::objectExtend(Handle<Object> dest, Handle<Object> src) { Handle<Array> names = src->GetOwnPropertyNames(); int length = names->Length(); for (int i = 0; i < length; ++i) { Handle<Value> name = names->Get(i); Handle<Value> value = src->Get(name); dest->Set(name, value); } }
METHOD_RETURN_TYPE DocumentCopyingContextDriver::ReplaceSourceObjects(const ARGS_TYPE& args) { // getting a dictionary mapping source to target object, translating to the C++ map...and on we go CREATE_ISOLATE_CONTEXT; CREATE_ESCAPABLE_SCOPE; DocumentCopyingContextDriver* copyingContextDriver = ObjectWrap::Unwrap<DocumentCopyingContextDriver>(args.This()); if(!copyingContextDriver->CopyingContext) { THROW_EXCEPTION("copying context object not initialized, create using pdfWriter.createPDFCopyingContext or PDFWriter.createPDFCopyingContextForModifiedFile"); SET_FUNCTION_RETURN_VALUE(UNDEFINED); } if(args.Length() != 0 || !args[0]->IsObject()) { THROW_EXCEPTION("Wrong arguments. provide 1 arugment, which is an object mapping source object ids to map to target object IDs"); SET_FUNCTION_RETURN_VALUE(UNDEFINED); } // create an object that will serve as the map ObjectIDTypeToObjectIDTypeMap resultMap; Handle<Object> anObject = args[0]->ToObject(); Handle<Array> objectKeys = anObject->GetOwnPropertyNames(); for(unsigned long i=0; i < objectKeys->Length(); ++i) { Handle<String> key = objectKeys->Get(NEW_NUMBER(0))->ToString(); Handle<Value> value = anObject->Get(key); resultMap.insert(ObjectIDTypeToObjectIDTypeMap::value_type(ObjectIDTypeObject(*String::Utf8Value(key)),value->ToNumber()->Uint32Value())); } copyingContextDriver->CopyingContext->ReplaceSourceObjects(resultMap); SET_FUNCTION_RETURN_VALUE(UNDEFINED); }
/* DESCRIPTION Processing of Binds Object PARAMETERS: Handle Object, eBaton struct NOTES: Overloaded function */ void Connection::GetBinds (Handle<Object> bindobj, eBaton* executeBaton) { HandleScope scope; std::string str; Local<Array> array = bindobj->GetOwnPropertyNames(); for(unsigned int index=0; index<array->Length(); index++) { Bind* bind = new Bind; Handle<String> temp = array->Get(index).As<String>(); NJSString(str, temp); bind->key = ":"+std::string(str); Handle<Value> val__ = bindobj->Get(String::New((char*)str.c_str(), (int) str.length())); Connection::GetBindUnit(val__, bind, executeBaton); if(!executeBaton->error.empty()) goto exitGetBinds; } exitGetBinds: ; }
Handle<Value> DocumentCopyingContextDriver::ReplaceSourceObjects(const v8::Arguments& args) { // getting a dictionary mapping source to target object, translating to the C++ map...and on we go HandleScope scope; DocumentCopyingContextDriver* copyingContextDriver = ObjectWrap::Unwrap<DocumentCopyingContextDriver>(args.This()); if(!copyingContextDriver->CopyingContext) { ThrowException(Exception::TypeError(String::New("copying context object not initialized, create using pdfWriter.createPDFCopyingContext or PDFWriter.createPDFCopyingContextForModifiedFile"))); return scope.Close(Undefined()); } if(args.Length() != 0 || !args[0]->IsObject()) { ThrowException(Exception::TypeError(String::New("Wrong arguments. provide 1 arugment, which is an object mapping source object ids to map to target object IDs"))); return scope.Close(Undefined()); } // create an object that will serve as the map ObjectIDTypeToObjectIDTypeMap resultMap; Handle<Object> anObject = args[0]->ToObject(); Handle<Array> objectKeys = anObject->GetOwnPropertyNames(); for(unsigned long i=0; i < objectKeys->Length(); ++i) { Handle<String> key = objectKeys->Get(Number::New(0))->ToString(); Handle<Value> value = anObject->Get(key); resultMap.insert(ObjectIDTypeToObjectIDTypeMap::value_type(ObjectIDTypeObject(*String::Utf8Value(key)),value->ToNumber()->Uint32Value())); } copyingContextDriver->CopyingContext->ReplaceSourceObjects(resultMap); return scope.Close(Undefined()); }
//delete the returned local reference after use jobjectArray NativeScriptRuntime::GetMethodOverrides(JEnv& env, const Handle<Object>& implementationObject) { if (implementationObject.IsEmpty()) { return JavaObjectArrayCache::GetJavaStringArray(0); } vector<jstring> methodNames; auto propNames = implementationObject->GetOwnPropertyNames(); for (int i = 0; i < propNames->Length(); i++) { auto name = propNames->Get(i).As<String>(); auto method = implementationObject->Get(name); bool methodFound = !method.IsEmpty() && method->IsFunction(); if (methodFound) { String::Utf8Value stringValue(name); jstring value = env.NewStringUTF(*stringValue); methodNames.push_back(value); } } int methodCount = methodNames.size(); jobjectArray methodOverrides = JavaObjectArrayCache::GetJavaStringArray(methodCount); for (int i = 0; i < methodCount; i++) { env.SetObjectArrayElement(methodOverrides, i, methodNames[i]); } for (int i = 0; i < methodCount; i++) { env.DeleteLocalRef(methodNames[i]); } return methodOverrides; }
JNIEXPORT void JNICALL Java_org_appcelerator_kroll_runtime_v8_V8Object_nativeUpdateProperties (JNIEnv *env, jobject object, jlong ptr, jobject jprops) { ENTER_V8(V8Runtime::globalContext); titanium::JNIScope jniScope(env); Handle<Object> jsProxy; if (ptr != 0) { jsProxy = Persistent<Object>((Object *) ptr); } else { jsProxy = TypeConverter::javaObjectToJsValue(env, object)->ToObject(); } Handle<Object> proxyProperties = jsProxy->Get(Proxy::propertiesSymbol)->ToObject(); Handle<Object> properties = TypeConverter::javaHashMapToJsValue(env, jprops); Handle<Array> names = properties->GetOwnPropertyNames(); int length = names->Length(); for (int i = 0; i < length; ++i) { Handle<Value> name = names->Get(i); Handle<Value> value = properties->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) { proxyProperties->Set(name, value); } } }
extern "C" Handle<Value> getOwnPropertyNames(Persistent<Context> context, Handle<Object> object) { HandleScope handle_scope; Context::Scope context_scope(context); Persistent<Array> names = Persistent<Array>::New(object->GetOwnPropertyNames()); return names; }
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; }