Mercurial > octave-nkf
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 */ |