comparison src/ov-fcn-handle.cc @ 7767:71f068b22fcc

scope and context fixes for function handles
author John W. Eaton <jwe@octave.org>
date Wed, 07 May 2008 13:45:30 -0400
parents 5adeea5de26c
children 3e4c9b69069d
comparison
equal deleted inserted replaced
7766:fc81e027c53c 7767:71f068b22fcc
240 return false; 240 return false;
241 241
242 octave_user_function *f = fcn.user_function_value (); 242 octave_user_function *f = fcn.user_function_value ();
243 243
244 std::list<symbol_table::symbol_record> vars 244 std::list<symbol_table::symbol_record> vars
245 = symbol_table::all_variables (f->scope ()); 245 = symbol_table::all_variables (f->scope (), 0);
246 246
247 size_t varlen = vars.size (); 247 size_t varlen = vars.size ();
248 248
249 if (varlen > 0) 249 if (varlen > 0)
250 { 250 {
408 return false; 408 return false;
409 409
410 octave_user_function *f = fcn.user_function_value (); 410 octave_user_function *f = fcn.user_function_value ();
411 411
412 std::list<symbol_table::symbol_record> vars 412 std::list<symbol_table::symbol_record> vars
413 = symbol_table::all_variables (f->scope ()); 413 = symbol_table::all_variables (f->scope (), 0);
414 414
415 size_t varlen = vars.size (); 415 size_t varlen = vars.size ();
416 416
417 if (varlen > 0) 417 if (varlen > 0)
418 nmbuf << nm << " " << varlen; 418 nmbuf << nm << " " << varlen;
652 H5Dclose (data_hid); 652 H5Dclose (data_hid);
653 653
654 octave_user_function *f = fcn.user_function_value (); 654 octave_user_function *f = fcn.user_function_value ();
655 655
656 std::list<symbol_table::symbol_record> vars 656 std::list<symbol_table::symbol_record> vars
657 = symbol_table::all_variables (f->scope ()); 657 = symbol_table::all_variables (f->scope (), 0);
658 658
659 size_t varlen = vars.size (); 659 size_t varlen = vars.size ();
660 660
661 if (varlen > 0) 661 if (varlen > 0)
662 { 662 {
1274 m.assign ("type", "simple"); 1274 m.assign ("type", "simple");
1275 } 1275 }
1276 1276
1277 std::string nm = fcn->fcn_file_name (); 1277 std::string nm = fcn->fcn_file_name ();
1278 1278
1279 if (nm.empty ()) 1279 if (fh_nm == "@<anonymous>")
1280 { 1280 {
1281 if (fh_nm == "@<anonymous>") 1281 m.assign ("file", nm);
1282
1283 octave_user_function *fu = fh->user_function_value ();
1284
1285 std::list<symbol_table::symbol_record> vars
1286 = symbol_table::all_variables (fu->scope (), 0);
1287
1288 size_t varlen = vars.size ();
1289
1290 if (varlen > 0)
1282 { 1291 {
1283 m.assign ("file", ""); 1292 Octave_map ws;
1284 1293 for (std::list<symbol_table::symbol_record>::const_iterator p = vars.begin ();
1285 octave_user_function *fu = fh->user_function_value (); 1294 p != vars.end (); p++)
1286
1287 std::list<symbol_table::symbol_record> vars
1288 = symbol_table::all_variables (fu->scope ());
1289
1290 size_t varlen = vars.size ();
1291
1292 if (varlen > 0)
1293 { 1295 {
1294 Octave_map ws; 1296 ws.assign (p->name (), p->varval (0));
1295 for (std::list<symbol_table::symbol_record>::const_iterator p = vars.begin ();
1296 p != vars.end (); p++)
1297 {
1298 ws.assign (p->name (), p->varval ());
1299 }
1300
1301 m.assign ("workspace", ws);
1302 } 1297 }
1298
1299 m.assign ("workspace", ws);
1303 } 1300 }
1304 else if (fcn->is_user_function () || fcn->is_user_script ()) 1301 }
1305 { 1302 else if (fcn->is_user_function () || fcn->is_user_script ())
1306 octave_function *fu = fh->function_value (); 1303 {
1307 m.assign ("file", fu->fcn_file_name ()); 1304 octave_function *fu = fh->function_value ();
1308 } 1305 m.assign ("file", fu->fcn_file_name ());
1309 else
1310 m.assign ("file", "");
1311 } 1306 }
1312 else 1307 else
1313 m.assign ("file", nm); 1308 m.assign ("file", "");
1314 1309
1315 retval = m; 1310 retval = m;
1316 } 1311 }
1317 else 1312 else
1318 error ("functions: invalid function handle object"); 1313 error ("functions: invalid function handle object");
1385 1380
1386 return retval; 1381 return retval;
1387 } 1382 }
1388 1383
1389 /* 1384 /*
1385 %!function y = testrecursionfunc (f, x, n)
1386 %! if (nargin < 3)
1387 %! n = 0;
1388 %! endif
1389 %! if (n > 2)
1390 %! y = f (x);
1391 %! else
1392 %! n++;
1393 %! y = testrecursionfunc (@(x) f(2*x), x, n);
1394 %! endif
1395 %!test
1396 %! assert (testrecursionfunc (@(x) x, 1), 8);
1397 */
1398
1399 /*
1390 ;;; Local Variables: *** 1400 ;;; Local Variables: ***
1391 ;;; mode: C++ *** 1401 ;;; mode: C++ ***
1392 ;;; End: *** 1402 ;;; End: ***
1393 */ 1403 */