[rkward-cvs] SF.net SVN: rkward:[3493] trunk/rkward

tfry at users.sourceforge.net tfry at users.sourceforge.net
Mon Mar 21 13:43:21 UTC 2011


Revision: 3493
          http://rkward.svn.sourceforge.net/rkward/?rev=3493&view=rev
Author:   tfry
Date:     2011-03-21 13:43:20 +0000 (Mon, 21 Mar 2011)

Log Message:
-----------
Add support for package namespaces and :::-operator.

Modified Paths:
--------------
    trunk/rkward/ChangeLog
    trunk/rkward/rkward/core/rcontainerobject.cpp
    trunk/rkward/rkward/core/rcontainerobject.h
    trunk/rkward/rkward/core/renvironmentobject.cpp
    trunk/rkward/rkward/core/renvironmentobject.h
    trunk/rkward/rkward/core/rkmodificationtracker.h
    trunk/rkward/rkward/core/robject.cpp
    trunk/rkward/rkward/core/robject.h
    trunk/rkward/rkward/core/robjectlist.cpp
    trunk/rkward/rkward/rbackend/rkstructuregetter.cpp
    trunk/rkward/rkward/rbackend/rkstructuregetter.h

Modified: trunk/rkward/ChangeLog
===================================================================
--- trunk/rkward/ChangeLog	2011-03-21 08:38:30 UTC (rev 3492)
+++ trunk/rkward/ChangeLog	2011-03-21 13:43:20 UTC (rev 3493)
@@ -1,7 +1,8 @@
 - Auxiliary binaries rkward.bin and rkward.rbackend are no longer installed into /usr[/local]/bin/ on Unix
 - Fixed: Object name completion would abort early in the script editor with KDE 4.4
 - Support function argument hinting for R primitives
-- Support S4 slots in object name completion and workspace browser		TODO: more testing, should support namespaces and ":::", too
+- Support package namespaces in object name completion and workspace browser
+- Support S4 slots in object name completion and workspace browser		TODO: more testing
 - More correct handling of quotes in object name completion
 - Support plot history for ggplot2 plots
 - Be less pro-active about fetching structure information on R objects in the workspace		TODO: verify that this fixes our issues with rXML

Modified: trunk/rkward/rkward/core/rcontainerobject.cpp
===================================================================
--- trunk/rkward/rkward/core/rcontainerobject.cpp	2011-03-21 08:38:30 UTC (rev 3492)
+++ trunk/rkward/rkward/core/rcontainerobject.cpp	2011-03-21 13:43:20 UTC (rev 3493)
@@ -259,13 +259,6 @@
 	}
 }
 
-int RContainerObject::getObjectModelIndexOf(RObject *child) const {
-	RK_TRACE (OBJECTS);
-
-	if (child == slots_pseudo_object) return childmap.size ();
-	return childmap.indexOf (child);
-}
-
 RObject *RContainerObject::findObjects (const QStringList &path, RObjectSearchMap *matches, const QString &op) {
 	RK_TRACE (OBJECTS);
 

Modified: trunk/rkward/rkward/core/rcontainerobject.h
===================================================================
--- trunk/rkward/rkward/core/rcontainerobject.h	2011-03-21 08:38:30 UTC (rev 3492)
+++ trunk/rkward/rkward/core/rcontainerobject.h	2011-03-21 13:43:20 UTC (rev 3493)
@@ -50,8 +50,6 @@
 	RObject *findChildByName (const QString &name) const;
 	/** fetches the child at the given position. This is very fast. */
 	RObject *findChildByIndex (int position) const;
-	/** return the index of the given child, or -1 if there is no such child */
-	int getObjectModelIndexOf (RObject *child) const;
 	
 	/** creates a new child. Right now only RKVariables (false, false), or data.frames (true, true), or unspecified containers (true, false) can be created.
 	API will likely change. The child is NOT created in the workspace. That's your resonsibility. All this function returns is a new RObject* of the given

Modified: trunk/rkward/rkward/core/renvironmentobject.cpp
===================================================================
--- trunk/rkward/rkward/core/renvironmentobject.cpp	2011-03-21 08:38:30 UTC (rev 3492)
+++ trunk/rkward/rkward/core/renvironmentobject.cpp	2011-03-21 13:43:20 UTC (rev 3493)
@@ -2,7 +2,7 @@
                           renvironmentobject  -  description
                              -------------------
     begin                : Wed Sep 27 2006
-    copyright            : (C) 2006, 2009, 2010 by Thomas Friedrichsmeier
+    copyright            : (C) 2006, 2009, 2010, 2011 by Thomas Friedrichsmeier
     email                : tfry at users.sourceforge.net
  ***************************************************************************/
 
@@ -31,29 +31,34 @@
 REnvironmentObject::REnvironmentObject (RContainerObject *parent, const QString &name) : RContainerObject (parent, name) {
 	RK_TRACE (OBJECTS);
 
+	namespace_envir = 0;
 	type = Environment;
 	if (parent == RObjectList::getObjectList ()) {
 		type |= ToplevelEnv;
 		if (name == ".GlobalEnv") {
 			type |= GlobalEnv;
 		} else if (name.contains (':')) {
-			namespace_name = name.section (':', 1);
 			type |= PackageEnv;
 		}
-	} else {
-		//namespace_name = parent->makeChildName (name);	// not needed, will not be used
 	}
 }
 
 REnvironmentObject::~REnvironmentObject () {
 	RK_TRACE (OBJECTS);
+	delete namespace_envir;
 }
 
+QString REnvironmentObject::packageName () const {
+	RK_ASSERT (isType (PackageEnv));
+	return name.section (':', 1);
+}
+
 QString REnvironmentObject::getFullName () const {
 	RK_TRACE (OBJECTS);
 
 	if (type & GlobalEnv) return name;	// .GlobalEnv
-	if (type & ToplevelEnv) return ("as.environment (\"" + name + "\")");
+	if (type & ToplevelEnv) return ("as.environment (" + rQuote (name) + ")");
+	if (isPackageNamespace ()) return ("asNamespace (" + rQuote (static_cast<REnvironmentObject*>(parent)->packageName ()) + ")");
 	return parent->makeChildName (name, type & Misplaced);
 }
 
@@ -74,9 +79,10 @@
 	if (type & ToplevelEnv) {
 /* Some items are placed outside of their native namespace. E.g. in package:boot item "motor". It can be retrieved using as.environment ("package:boot")$motor. This is extremly ugly. We need to give them (and only them) this special treatment. */
 // TODO: hopefully one day operator "::" will work even in those cases. So check back later, and remove after a sufficient amount of backwards compatibility time
-		if ((type & PackageEnv) && (!misplaced)) return (namespace_name + "::" + safe_name);
+		if ((type & PackageEnv) && (!misplaced)) return (packageName () + "::" + safe_name);
 		return (getFullName () + '$' + safe_name);
 	}
+	if (isPackageNamespace ()) return (static_cast<REnvironmentObject*>(parent)->packageName () + ":::" + safe_name);
 	return (getFullName () + '$' + safe_name);
 }
 
@@ -99,15 +105,15 @@
 void REnvironmentObject::updateFromR (RCommandChain *chain) {
 	RK_TRACE (OBJECTS);
 	if (type & PackageEnv) {
-		if (RKSettingsModuleObjectBrowser::isPackageBlacklisted (namespace_name)) {
-			KMessageBox::information (0, i18n ("The package '%1' (probably you just loaded it) is currently blacklisted for retrieving structure information. Practically this means, the objects in this package will not appear in the object browser, and there will be no object name completion or function argument hinting for objects in this package.\nPackages will typically be blacklisted, if they contain huge amount of data, that would take too long to load. To unlist the package, visit Settings->Configure RKWard->Workspace.", namespace_name), i18n("Package blacklisted"), "packageblacklist" + namespace_name);
+		if (RKSettingsModuleObjectBrowser::isPackageBlacklisted (packageName ())) {
+			KMessageBox::information (0, i18n ("The package '%1' (probably you just loaded it) is currently blacklisted for retrieving structure information. Practically this means, the objects in this package will not appear in the object browser, and there will be no object name completion or function argument hinting for objects in this package.\nPackages will typically be blacklisted, if they contain huge amount of data, that would take too long to load. To unlist the package, visit Settings->Configure RKWard->Workspace.", packageName ()), i18n("Package blacklisted"), "packageblacklist" + packageName ());
 			return;
 		}
 	}
 
 	QString options;
 	if (type & GlobalEnv) options = ", envlevel=-1";	// in the .GlobalEnv recurse one more level
-	if (type & ToplevelEnv) options.append (", namespacename=" + rQuote (namespace_name));
+	if (type & PackageEnv) options.append (", namespacename=" + rQuote (packageName ()));
 
 	RCommand *command = new RCommand (".rk.get.structure (" + getFullName () + ", " + rQuote (getShortName ()) + options + ')', RCommand::App | RCommand::Sync | RCommand::GetStructuredData, QString::null, this, ROBJECT_UDPATE_STRUCTURE_COMMAND);
 	RKGlobals::rInterface ()->issueCommand (command, chain);
@@ -149,17 +155,51 @@
 	}
 
 	if (new_data->getDataLength () > StorageSizeBasicInfo) {
-		RK_ASSERT (new_data->getDataLength () == (StorageSizeBasicInfo + 1));
-
 		RData *children_sub = new_data->getStructureVector ()[StoragePositionChildren];
 		RK_ASSERT (children_sub->getDataType () == RData::StructureVector);
 		updateChildren (children_sub);
+
+		// a namespace to go with that?
+		if (new_data->getDataLength () > (StorageSizeBasicInfo + 1)) {
+			RK_ASSERT (new_data->getDataLength () == (StorageSizeBasicInfo + 2));
+			updateNamespace (new_data->getStructureVector ()[StoragePositionNamespace]);
+		} else updateNamespace (0);
 	} else {
 		RK_ASSERT (false);
 	}
 	return true;
 }
 
+void REnvironmentObject::updateNamespace (RData* new_data) {
+	RK_TRACE (OBJECTS);
+
+	if (!new_data) {
+		if (namespace_envir) {
+			RKGlobals::tracker ()->removeObject (namespace_envir, 0, true);
+		}
+		return;
+	}
+
+	RK_ASSERT (new_data->getDataType () == RData::StructureVector);
+	bool added = false;
+	if (!namespace_envir) {
+		namespace_envir = new REnvironmentObject (this, "NAMESPACE");
+		added = true;
+		RKGlobals::tracker ()->lockUpdates (true);
+	}
+	namespace_envir->updateStructure (new_data->getStructureVector ()[0]);
+	if (added) {
+		RKGlobals::tracker ()->lockUpdates (false);
+
+		int index = getObjectModelIndexOf (namespace_envir);
+		REnvironmentObject *neo = namespace_envir;
+		namespace_envir = 0;	// HACK: Must not be included in the count during the call to beginAddObject
+		RKGlobals::tracker ()->beginAddObject (neo, this, index);
+		namespace_envir = neo;
+		RKGlobals::tracker ()->endAddObject (neo, this, index);
+	}
+}
+
 void REnvironmentObject::renameChild (RObject *object, const QString &new_name) {
 	RK_TRACE (OBJECTS);
 

Modified: trunk/rkward/rkward/core/renvironmentobject.h
===================================================================
--- trunk/rkward/rkward/core/renvironmentobject.h	2011-03-21 08:38:30 UTC (rev 3492)
+++ trunk/rkward/rkward/core/renvironmentobject.h	2011-03-21 13:43:20 UTC (rev 3493)
@@ -2,7 +2,7 @@
                           renvironmentobject  -  description
                              -------------------
     begin                : Wed Sep 27 2006
-    copyright            : (C) 2006, 2009 by Thomas Friedrichsmeier
+    copyright            : (C) 2006, 2009, 2011 by Thomas Friedrichsmeier
     email                : tfry at users.sourceforge.net
  ***************************************************************************/
 
@@ -41,7 +41,9 @@
 	QString makeChildBaseName (const QString &short_child_name) const;
 /** reimplemented from RContainerObject: If this is an environment var, call RContainerObject::writeMetaData (). Else, do nothing. An environment has no meta data. */
 	void writeMetaData (RCommandChain *chain);
-	QString namespaceName () const { return namespace_name; };
+	QString packageName () const;
+/** For the environment of packages with a namespace, return the namespace. May be NULL! */
+	REnvironmentObject* namespaceEnvironment () const { return namespace_envir; };
 protected:
 	bool updateStructure (RData *new_data);
 /** reimplemented from RContainerObject to raise an assert if this is not the isGlobalEnv (). Otherwise calls "remove (objectname)" instead of objectname <- NULL" */
@@ -50,7 +52,10 @@
 	QString removeChildCommand (RObject *object) const;
 /// reimplemented from RContainerObject to call "remove (objectname)" instead of "objectname <- NULL"
 	QString renameChildCommand (RObject *object, const QString &new_name) const;
-	QString namespace_name;
+friend class RObject;
+	REnvironmentObject *namespace_envir;
+
+	void updateNamespace (RData *new_data);
 };
  
 #endif

Modified: trunk/rkward/rkward/core/rkmodificationtracker.h
===================================================================
--- trunk/rkward/rkward/core/rkmodificationtracker.h	2011-03-21 08:38:30 UTC (rev 3492)
+++ trunk/rkward/rkward/core/rkmodificationtracker.h	2011-03-21 13:43:20 UTC (rev 3493)
@@ -144,6 +144,7 @@
 	QMultiHash<RObject*, RObjectListener*> listeners;
 
 friend class RContainerObject;
+friend class REnvironmentObject;
 friend class RObject;
 friend class RObjectList;
 /** essentially like the above function(s). All objects listening for child additions on the parent will be notified */

Modified: trunk/rkward/rkward/core/robject.cpp
===================================================================
--- trunk/rkward/rkward/core/robject.cpp	2011-03-21 08:38:30 UTC (rev 3492)
+++ trunk/rkward/rkward/core/robject.cpp	2011-03-21 13:43:20 UTC (rev 3493)
@@ -87,13 +87,6 @@
 	return 0;
 }
 
-int RObject::getObjectModelIndexOf (RObject *child) const {
-	RK_TRACE (OBJECTS);
-
-	if (child == slots_pseudo_object) return 0;
-	return -1;
-}
-
 QString RObject::getMetaProperty (const QString &id) const {
 	RK_TRACE (OBJECTS);
 	if (meta_map) return (meta_map->value (id));
@@ -248,6 +241,7 @@
 		return;
 	}
 	if (slots_pseudo_object) slots_pseudo_object->fetchMoreIfNeeded (levels);
+	// Note: We do NOT do the same for any namespaceEnvironment, deliberately
 	if (levels <= 0) return;
 	if (!isContainer ()) return;
 	const RObjectMap children = static_cast<RContainerObject*> (this)->childmap;
@@ -384,6 +378,7 @@
 
 	bool changed = false;
 	int new_type = new_data->getIntVector ()[0];
+	if (type & PseudoObject) new_type |= PseudoObject;
 	if (type & Misplaced) new_type |= Misplaced;
 	if (type & Pending) new_type |= Pending;	// NOTE: why don't we just clear the pending flag, here? Well, we don't want to generate a change notification for this. TODO: rethink the logic, and maybe use an appropriate mask
 	if (type & NeedDataUpdate) new_type |= NeedDataUpdate;
@@ -480,9 +475,9 @@
 			int index = getObjectModelIndexOf (slots_pseudo_object);
 			RSlotsPseudoObject *spo = slots_pseudo_object;
 			slots_pseudo_object = 0;	// HACK: Must not be included in the count during the call to beginAddObject
-			RKGlobals::tracker ()->beginAddObject (slots_pseudo_object, this, index);
+			RKGlobals::tracker ()->beginAddObject (spo, this, index);
 			slots_pseudo_object = spo;
-			RKGlobals::tracker ()->endAddObject (slots_pseudo_object, this, index);
+			RKGlobals::tracker ()->endAddObject (spo, this, index);
 		}
 		return ret;
 	} else if (slots_pseudo_object) {
@@ -491,11 +486,32 @@
 	return false;
 }
 
+int RObject::getObjectModelIndexOf (RObject *child) const {
+	RK_TRACE (OBJECTS);
+
+	int offset = 0;
+	if (isContainer ()) {
+		int pos = static_cast<const RContainerObject*> (this)->childmap.indexOf (child);
+		if (pos >= 0) return pos + offset;
+		offset += static_cast<const RContainerObject*> (this)->childmap.size ();
+	}
+	if (slots_pseudo_object) {
+		if (child == slots_pseudo_object) return offset;
+		offset += 1;
+	}
+	if (isType (Environment) && static_cast<const REnvironmentObject*> (this)->namespaceEnvironment ()) {
+		if (child == static_cast<const REnvironmentObject*> (this)->namespaceEnvironment ()) return offset;
+		offset += 1;
+	}
+	return -1;
+}
+
 int RObject::numChildrenForObjectModel () const {
 	RK_TRACE (OBJECTS);
 
 	int ret = isContainer () ? static_cast<const RContainerObject*>(this)->numChildren () : 0;
-	if (slots_pseudo_object) return ret + 1;
+	if (slots_pseudo_object) ret += 1;
+	if (isType (PackageEnv) && static_cast<const REnvironmentObject*>(this)->namespaceEnvironment ()) ret += 1;
 	return ret;
 }
 
@@ -505,6 +521,10 @@
 		const RContainerObject *container = static_cast<const RContainerObject*>(this);
 		if (index < container->numChildren ()) return container->findChildByIndex (index);
 		offset -= container->numChildren ();
+		if (isType (PackageEnv)) {
+			if (offset == 0 && slots_pseudo_object) return slots_pseudo_object;
+			return static_cast<const REnvironmentObject*>(this)->namespaceEnvironment ();
+		}
 	}
 	if (offset == 0) return slots_pseudo_object;
 	return 0;
@@ -528,6 +548,10 @@
 		RK_ASSERT (removed_in_workspace);
 		parent->slots_pseudo_object = 0;
 		delete this;
+	} else if (isPackageNamespace ()) {
+		RK_ASSERT (removed_in_workspace);
+		RK_ASSERT (parent->isType (Environment));
+		static_cast<REnvironmentObject*> (parent)->namespace_envir = 0;
 	} else {
 		static_cast<RContainerObject*> (parent)->removeChild (this, removed_in_workspace);
 	}
@@ -604,9 +628,12 @@
 						seek_bracket_end = true;
 					} else if (c == ':') {
 						ret.append (fragment);
-						ret.append ("::");
+						if ((i+1 < end) && (path.at (i+1) == ':')) ++i;
+						if ((i+1 < end) && (path.at (i+1) == ':')) {
+							++i;
+							ret.append (":::");
+						} else ret.append ("::");
 						fragment.clear ();
-						if ((i+1 < end) && (path.at (i+1) == ':')) ++i;
 					} else if (c == '@') {
 						ret.append (fragment);
 						ret.append ("@");

Modified: trunk/rkward/rkward/core/robject.h
===================================================================
--- trunk/rkward/rkward/core/robject.h	2011-03-21 08:38:30 UTC (rev 3492)
+++ trunk/rkward/rkward/core/robject.h	2011-03-21 13:43:20 UTC (rev 3493)
@@ -92,6 +92,7 @@
 		StoragePositionDims = 4,
 		StoragePositionSlots = 5,
 		StoragePositionChildren = 6,
+		StoragePositionNamespace = 7,
 		StoragePositionFunArgs = 6,
 		StoragePositionFunValues = 7,
 		StorageSizeBasicInfo = 6,
@@ -118,6 +119,7 @@
 	bool isType (int type) const { return (RObject::type & type); };
 	bool isPseudoObject () const { return isType (PseudoObject); };
 	bool isSlotsPseudoObject () const { return (this && parent && ((void*) parent->slots_pseudo_object == (void*) this)); };
+	bool isPackageNamespace () const { return (this && isPseudoObject () && (name == "NAMESPACE")); };
 	bool hasMetaObject () const { return (meta_map); };
 	/** see RObjectType::Pending */
 	bool isPending () const { return type & Pending; };
@@ -152,7 +154,7 @@
 	int getLength () const { return dimensions[0]; };
 
 	/** return the index of the given child, or -1 if there is no such child */
-	virtual int getObjectModelIndexOf (RObject *child) const;
+	int getObjectModelIndexOf (RObject *child) const;
 	int numChildrenForObjectModel () const;
 	RObject *findChildByObjectModelIndex (int) const;
 

Modified: trunk/rkward/rkward/core/robjectlist.cpp
===================================================================
--- trunk/rkward/rkward/core/robjectlist.cpp	2011-03-21 08:38:30 UTC (rev 3492)
+++ trunk/rkward/rkward/core/robjectlist.cpp	2011-03-21 13:43:20 UTC (rev 3493)
@@ -224,6 +224,12 @@
 		if (!environment) return 0;
 		
 		return environment->findObjects (path.mid (2), matches, "$");
+	} else if (path.value (1) == ":::") {
+		RObject *environment = findChildByNamespace (path[0]);
+		if (environment) environment = static_cast<REnvironmentObject*> (environment)->namespaceEnvironment ();
+		if (!environment) return 0;
+
+		return environment->findObjects (path.mid (2), matches, "$");
 	} else if (path.value (0) == ".GlobalEnv") {
 		if (path.length () > 1) return getGlobalEnv ()->findObjects (path.mid (2), matches, "$");
 		else if (matches) matches->insert (path.value (0), getGlobalEnv ());	// no return, here: At least one more match will be found in base
@@ -245,7 +251,7 @@
 		RObject* child = childmap[i];
 		RK_ASSERT (child->isType (Environment));
 		REnvironmentObject* env = static_cast<REnvironmentObject *> (child);
-		if (env->namespaceName () == namespacename) {
+		if (env->packageName () == namespacename) {
 			return env;
 		}
 	}

Modified: trunk/rkward/rkward/rbackend/rkstructuregetter.cpp
===================================================================
--- trunk/rkward/rkward/rbackend/rkstructuregetter.cpp	2011-03-21 08:38:30 UTC (rev 3492)
+++ trunk/rkward/rkward/rbackend/rkstructuregetter.cpp	2011-03-21 13:43:20 UTC (rev 3493)
@@ -87,25 +87,23 @@
 	if (Rf_isNull (namespacename)) {
 		with_namespace = false;
 	} else {
-		with_namespace = true;
-
 		SEXP as_ns_fun = Rf_findFun (Rf_install (".rk.try.get.namespace"),  R_GlobalEnv);
 		PROTECT (as_ns_fun);
 		RK_ASSERT (!Rf_isNull (as_ns_fun));
 
 		namespace_envir = RKRSupport::callSimpleFun (as_ns_fun, namespacename, R_GlobalEnv);
+		with_namespace = !Rf_isNull (namespace_envir);
 		UNPROTECT (1);	/* as_ns_fun */
-
-		PROTECT (namespace_envir);
 	}
 
+	if (with_namespace) PROTECT (namespace_envir);
+
 	RData *ret = new RData;
 
+	toplevel_value = toplevel;
 	getStructureSafe (toplevel, name_string, 0, ret, INTEGER (envlevel)[0]);
 
-	if (with_namespace) {
-		UNPROTECT (1);	/* namespace_envir */
-	}
+	if (with_namespace) UNPROTECT (1);	/* namespace_envir */
 
 	return ret;
 }
@@ -167,6 +165,7 @@
 void RKStructureGetter::getStructureWorker (SEXP val, const QString &name, int add_type_flags, RData *storage, int nesting_depth) {
 	RK_TRACE (RBACKEND);
 
+	bool at_toplevel = (toplevel_value == val);
 	bool is_function = false;
 	bool is_container = false;
 	bool is_environment = false;
@@ -357,7 +356,7 @@
 				PROTECT (child);
 
 				bool child_misplaced = false;
-				if (with_namespace) {
+				if (at_toplevel && with_namespace) {
 					if (!Rf_isNull (namespace_envir)) {
 						SEXP dummy = Rf_findVarInFrame (namespace_envir, current_childname);
 						if (Rf_isNull (dummy) || (dummy == R_UnboundValue)) child_misplaced = true;
@@ -399,6 +398,24 @@
 		RData *childdata = new RData;
 		childdata->setData (children);
 		res[RObject::StoragePositionChildren] = childdata;
+
+		if (is_environment && at_toplevel && with_namespace) {
+			RData *namespacedata = new RData;
+
+			if (no_recurse) {
+				type |= RObject::Incomplete;
+				RK_DO (qDebug ("Depth limit reached. Will not recurse into namespace of %s", name.toLatin1().data ()), RBACKEND, DL_DEBUG);
+			} else {
+				RData::RDataStorage dummy (1, 0);
+				dummy[0] = new RData ();
+
+				getStructureSafe (namespace_envir, "NAMESPACE", RObject::PseudoObject, dummy[0], nesting_depth+99);	// HACK: By default, do not recurse into the children of the namespace, until dealing with the namespace object itself.
+
+				namespacedata->setData (dummy);
+			}
+
+			res.insert (RObject::StoragePositionNamespace, namespacedata);
+		}
 	} else if (is_function) {
 // TODO: getting the formals is still a bit of a bottleneck, but no idea, how to improve on this, any further
 		SEXP formals_s;

Modified: trunk/rkward/rkward/rbackend/rkstructuregetter.h
===================================================================
--- trunk/rkward/rkward/rbackend/rkstructuregetter.h	2011-03-21 08:38:30 UTC (rev 3492)
+++ trunk/rkward/rkward/rbackend/rkstructuregetter.h	2011-03-21 13:43:20 UTC (rev 3493)
@@ -51,6 +51,7 @@
 
 	bool with_namespace;
 	SEXP namespace_envir;
+	SEXP toplevel_value;
 
 	SEXP class_fun;
 	SEXP dims_fun;


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the rkward-tracker mailing list