static EncodedJSValue JSC_HOST_CALL callRuntimeMethod(ExecState* exec) { VM& vm = exec->vm(); auto scope = DECLARE_THROW_SCOPE(vm); RuntimeMethod* method = static_cast<RuntimeMethod*>(exec->jsCallee()); if (!method->method()) return JSValue::encode(jsUndefined()); RefPtr<Instance> instance; JSValue thisValue = exec->thisValue(); if (thisValue.inherits(RuntimeObject::info())) { RuntimeObject* runtimeObject = static_cast<RuntimeObject*>(asObject(thisValue)); instance = runtimeObject->getInternalInstance(); if (!instance) return JSValue::encode(RuntimeObject::throwInvalidAccessError(exec, scope)); } else { // Calling a runtime object of a plugin element? if (thisValue.inherits(JSHTMLElement::info())) instance = pluginInstance(jsCast<JSHTMLElement*>(asObject(thisValue))->wrapped()); if (!instance) return throwVMTypeError(exec, scope); } ASSERT(instance); instance->begin(); JSValue result = instance->invokeMethod(exec, method); instance->end(); return JSValue::encode(result); }
bool GD_API PickRandomObject(RuntimeScene & scene, std::map <std::string, std::vector<RuntimeObject*> *> pickedObjectLists) { //Create a list with all objects std::vector<RuntimeObject*> allObjects; for (std::map <std::string, std::vector<RuntimeObject*> *>::iterator it = pickedObjectLists.begin();it!=pickedObjectLists.end();++it) { if ( it->second != NULL ) std::copy(it->second->begin(), it->second->end(), std::back_inserter(allObjects)); } if ( !allObjects.empty() ) { unsigned int id = GDpriv::CommonInstructions::Random(allObjects.size()-1); RuntimeObject * theChosenOne = allObjects[id]; for (std::map <std::string, std::vector<RuntimeObject*> *>::iterator it = pickedObjectLists.begin();it!=pickedObjectLists.end();++it) { if ( it->second != NULL ) it->second->clear(); } if ( pickedObjectLists[theChosenOne->GetName()] != NULL ) pickedObjectLists[theChosenOne->GetName()]->push_back(theChosenOne); } return true; }
static EncodedJSValue JSC_HOST_CALL callRuntimeMethod(ExecState* exec) { RuntimeMethod* method = static_cast<RuntimeMethod*>(exec->callee()); if (method->methods()->isEmpty()) return JSValue::encode(jsUndefined()); RefPtr<Instance> instance; JSValue thisValue = exec->hostThisValue(); if (thisValue.inherits(&RuntimeObject::s_info)) { RuntimeObject* runtimeObject = static_cast<RuntimeObject*>(asObject(thisValue)); instance = runtimeObject->getInternalInstance(); if (!instance) return JSValue::encode(RuntimeObject::throwInvalidAccessError(exec)); } else { // Calling a runtime object of a plugin element? if (thisValue.inherits(&JSHTMLElement::s_info)) { HTMLElement* element = jsCast<JSHTMLElement*>(asObject(thisValue))->impl(); instance = pluginInstance(element); } if (!instance) return throwVMTypeError(exec); } ASSERT(instance); instance->begin(); JSValue result = instance->invokeMethod(exec, method); instance->end(); return JSValue::encode(result); }
void RootObject::finalize(JSC::Handle<JSC::Unknown> handle, void*) { RuntimeObject* object = static_cast<RuntimeObject*>(handle.get().asCell()); Ref<RootObject> protect(*this); object->invalidate(); weakRemove(m_runtimeObjects, object, object); }
void RootObject::finalize(JSC::Handle<JSC::Unknown> handle, void*) { RuntimeObject* object = static_cast<RuntimeObject*>(asObject(handle.get())); ASSERT(m_runtimeObjects.contains(object)); object->invalidate(); m_runtimeObjects.remove(object); }
void RootObject::invalidate() { if (!m_isValid) return; { HashMap<RuntimeObject*, JSC::Weak<RuntimeObject> >::iterator end = m_runtimeObjects.end(); for (HashMap<RuntimeObject*, JSC::Weak<RuntimeObject> >::iterator it = m_runtimeObjects.begin(); it != end; ++it) { RuntimeObject* runtimeObject = it->value.get(); if (!runtimeObject) // Skip zombies. continue; runtimeObject->invalidate(); } m_runtimeObjects.clear(); } m_isValid = false; m_nativeHandle = 0; m_globalObject.clear(); { HashSet<InvalidationCallback*>::iterator end = m_invalidationCallbacks.end(); for (HashSet<InvalidationCallback*>::iterator iter = m_invalidationCallbacks.begin(); iter != end; ++iter) (**iter)(this); m_invalidationCallbacks.clear(); } ProtectCountSet::iterator end = m_protectCountSet.end(); for (ProtectCountSet::iterator it = m_protectCountSet.begin(); it != end; ++it) JSC::gcUnprotect(it->key); m_protectCountSet.clear(); rootObjectSet()->remove(this); }