[rkward-cvs] SF.net SVN: rkward: [1822] trunk/rkward/rkward/rbackend/rkstructuregetter. cpp

tfry at users.sourceforge.net tfry at users.sourceforge.net
Tue Apr 17 16:46:02 UTC 2007


Revision: 1822
          http://svn.sourceforge.net/rkward/?rev=1822&view=rev
Author:   tfry
Date:     2007-04-17 09:46:01 -0700 (Tue, 17 Apr 2007)

Log Message:
-----------
Hack to handle calls properly

Modified Paths:
--------------
    trunk/rkward/rkward/rbackend/rkstructuregetter.cpp

Modified: trunk/rkward/rkward/rbackend/rkstructuregetter.cpp
===================================================================
--- trunk/rkward/rkward/rbackend/rkstructuregetter.cpp	2007-04-17 14:35:56 UTC (rev 1821)
+++ trunk/rkward/rkward/rbackend/rkstructuregetter.cpp	2007-04-17 16:46:01 UTC (rev 1822)
@@ -166,6 +166,7 @@
 	return ret;
 }
 
+extern "C" {
 // TODO: split out some of the large blocks into helper functions, to make this easier to read
 void RKStructureGetter::getStructureWorker (SEXP val, const QString &name, bool misplaced, RData *storage) {
 	RK_TRACE (RBACKEND);
@@ -191,16 +192,27 @@
 	QString *name_dummy = new QString[1];
 	name_dummy[0] = name;
 	namedata->data = name_dummy;
-qDebug ("0");
 
-// TODO: will throw an error, if the object is a call!
 	// get classes
-	SEXP classes_s = callSimpleFun (class_fun, value, R_BaseEnv);
-	PROTECT (classes_s);
+	SEXP classes_s;
+
+	if (TYPEOF (value) == LANGSXP) {	// if it's a call, we should NEVER send it through eval
+		extern SEXP R_data_class (SEXP, Rboolean);
+		classes_s = R_data_class (value, (Rboolean) 0);
+
+		value = coerceVector (value, EXPRSXP);	// make sure the object is safe for everything to come
+		UNPROTECT (1); /* old value */
+
+		PROTECT (classes_s);
+		PROTECT (value);
+	} else {
+		classes_s = callSimpleFun (class_fun, value, R_BaseEnv);
+		PROTECT (classes_s);
+	}
+
 	QString *classes = SEXPToStringList (classes_s, &count);
 	unsigned int num_classes = count;
 	UNPROTECT (1);	/* classes_s */
-qDebug ("1");
 
 	// store classes
 	RData *classdata = new RData;
@@ -216,7 +228,6 @@
 	if (callSimpleBool (is_matrix_fun, value, R_BaseEnv)) type |= RObject::Matrix;
 	if (callSimpleBool (is_array_fun, value, R_BaseEnv)) type |= RObject::Array;
 	if (callSimpleBool (is_list_fun, value, R_BaseEnv)) type |= RObject::List;
-qDebug ("2");
 
 	if (type != 0) {
 		is_container = true;
@@ -238,7 +249,6 @@
 		}
 	}
 	if (misplaced) type |= RObject::Misplaced;
-qDebug ("3");
 
 	// get meta data, if any
 	RData *metadata = new RData;
@@ -257,7 +267,6 @@
 		meta_dummy[0] = "";
 		metadata->data = meta_dummy;
 	}
-qDebug ("4");
 
 	// store type
 	RData *typedata = new RData;
@@ -292,7 +301,6 @@
 			dims[0] = len;
 		}
 	}
-qDebug ("5");
 
 	// store dims
 	RData *dimdata = new RData;
@@ -438,3 +446,4 @@
 	UNPROTECT (1); /* value */
 }
 
+}	/* extern "C" */


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