/* for geomtransform, we don't have the mapObj */ shapeObj *msV8TransformShape(shapeObj *shape, const char* filename) { TryCatch try_catch; Isolate *isolate = Isolate::GetCurrent(); V8Context *v8context = (V8Context*)isolate->GetData(); HandleScope handle_scope(v8context->isolate); /* execution context */ Local<Context> context = Local<Context>::New(v8context->isolate, v8context->context); Context::Scope context_scope(context); Handle<Object> global = context->Global(); Shape* shape_ = new Shape(shape); shape_->setLayer(v8context->layer); shape_->disableMemoryHandler(); Handle<Value> ext = External::New(shape_); global->Set(String::New("shape"), Shape::Constructor()->NewInstance(1, &ext)); msV8ExecuteScript(filename); Handle<Value> value = global->Get(String::New("geomtransform")); if (value->IsUndefined()) { msDebug("msV8TransformShape: Function 'geomtransform' is missing.\n"); return NULL; } Handle<Function> func = Handle<Function>::Cast(value); Handle<Value> result = func->Call(global, 0, 0); if (result.IsEmpty() && try_catch.HasCaught()) { msV8ReportException(&try_catch); } if (!result.IsEmpty() && result->IsObject()) { Handle<Object> obj = result->ToObject(); if (obj->GetConstructorName()->Equals(String::New("shapeObj"))) { Shape* new_shape = ObjectWrap::Unwrap<Shape>(result->ToObject()); if (shape == new_shape->get()) { shapeObj *new_shape_ = (shapeObj *)msSmallMalloc(sizeof(shapeObj)); msInitShape(new_shape_); msCopyShape(shape, new_shape_); return new_shape_; } else { new_shape->disableMemoryHandler(); return new_shape->get(); } } } return NULL; }
bool V8Util::constructorNameMatches(Handle<Object> object, const char* name) { HandleScope scope; Local<String> constructorName = object->GetConstructorName(); return strcmp(*String::Utf8Value(constructorName), name) == 0; }
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; }