public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
* [gentoo-commits] proj/libbash:master commit in: src/, scripts/, /, src/builtins/tests/, bashast/, src/builtins/
@ 2011-05-07  9:16 Petteri Räty
  0 siblings, 0 replies; only message in thread
From: Petteri Räty @ 2011-05-07  9:16 UTC (permalink / raw
  To: gentoo-commits

commit:     24300d3ce1fccca3034a3bd9497341902d1cd4c0
Author:     Mu Qiao <qiaomuf <AT> gentoo <DOT> org>
AuthorDate: Thu May  5 14:20:00 2011 +0000
Commit:     Petteri Räty <betelgeuse <AT> gentoo <DOT> org>
CommitDate: Sat May  7 09:13:51 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/libbash.git;a=commit;h=24300d3c

Builtin: implement the return builtin

---
 Makefile.am                                        |    5 +++
 bashast/libbashWalker.g                            |   17 +++++++--
 scripts/function_def.bash                          |   16 ++++++++
 scripts/function_def.bash.result                   |    2 +
 scripts/source_return.sh                           |    2 +
 .../{source_builtin.cpp => builtin_exceptions.h}   |   39 ++++++++------------
 .../{source_builtin.cpp => return_builtin.cpp}     |   33 ++++++-----------
 .../{tests/source_tests.cpp => return_builtin.h}   |   32 +++++-----------
 src/builtins/source_builtin.cpp                    |    7 +++-
 .../tests/{source_tests.cpp => return_tests.cpp}   |   27 ++++++--------
 src/builtins/tests/source_tests.cpp                |   37 +++++++++++++++++--
 src/cppbash_builtin.cpp                            |    7 +++-
 12 files changed, 130 insertions(+), 94 deletions(-)

diff --git a/Makefile.am b/Makefile.am
index a3890bb..499624f 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -102,6 +102,7 @@ cppunittests_SOURCES =  test/run_tests.cpp \
 						src/builtins/tests/echo_tests.cpp \
 						src/builtins/tests/boolean_tests.cpp \
 						src/builtins/tests/source_tests.cpp \
+						src/builtins/tests/return_tests.cpp \
 						test/post_check.cpp \
 						test/api_test.cpp \
 						test/walker_test.cpp
@@ -161,8 +162,11 @@ libcppbash_la_SOURCES = src/common.h \
 						src/builtins/boolean_builtins.h \
 						src/builtins/source_builtin.h \
 						src/builtins/source_builtin.cpp \
+						src/builtins/return_builtin.h \
+						src/builtins/return_builtin.cpp \
 						src/builtins/inherit_builtin.h \
 						src/builtins/inherit_builtin.cpp \
+						src/builtins/builtin_exceptions.h \
 						$(GENERATED_PARSER_C) \
 						$(GENERATED_PARSER_H) \
 						src/core/interpreter_exception.h \
@@ -189,6 +193,7 @@ EXTRA_DIST = bashast/bashast.g \
 			 test/verify_bashs_test.sh \
 			 scripts/source_false.sh \
 			 scripts/source_true.sh \
+			 scripts/source_return.sh \
 			 utils/meta_gen.sh \
 			 scripts/foo.eclass \
 			 $(BASH_TESTS) \

diff --git a/bashast/libbashWalker.g b/bashast/libbashWalker.g
index 064556a..beabfdf 100644
--- a/bashast/libbashWalker.g
+++ b/bashast/libbashWalker.g
@@ -42,6 +42,7 @@ options
 
 	#include <boost/format.hpp>
 
+	#include "builtins/builtin_exceptions.h"
 	#include "core/interpreter.h"
 	#include "cppbash_builtin.h"
 
@@ -285,10 +286,18 @@ simple_command
 	:^(COMMAND string_expr (argument[libbash_args])* var_def*) {
 		if(walker->has_function($string_expr.libbash_value))
 		{
-			walker->set_status(walker->call($string_expr.libbash_value,
-											libbash_args,
-											ctx,
-											compound_command));
+			ANTLR3_MARKER command_index = INDEX();
+			try
+			{
+				walker->set_status(walker->call($string_expr.libbash_value,
+												libbash_args,
+												ctx,
+												compound_command));
+			}
+			catch(return_exception& e)
+			{
+				SEEK(command_index);
+			}
 		}
 		else if(cppbash_builtin::is_builtin($string_expr.libbash_value))
 		{

diff --git a/scripts/function_def.bash b/scripts/function_def.bash
index 194d030..ee57a94 100644
--- a/scripts/function_def.bash
+++ b/scripts/function_def.bash
@@ -26,3 +26,19 @@ FOO001="4		5"
 ARRAY=(1 2 3)
 func_with_args ${ARRAY[@]} $FOO001
 func_with_args 100 $ARG2 $ARG3 $ARG4
+
+func_with_return()
+{
+    return 1
+    NOT_EXIST=1
+}
+func_with_return
+RETURN_STATUS=$?
+func_with_return2()
+{
+    true
+    return
+    NOT_EXIST=1
+}
+func_with_return2
+RETURN_STATUS2=$?

diff --git a/scripts/function_def.bash.result b/scripts/function_def.bash.result
index de9f3f8..b02d5bc 100644
--- a/scripts/function_def.bash.result
+++ b/scripts/function_def.bash.result
@@ -9,3 +9,5 @@ ARRAY=1 2 3
 EAPI=5
 FOO001=4		5
 MY_PV=2.0.3-r1
+RETURN_STATUS=1
+RETURN_STATUS2=0

diff --git a/scripts/source_return.sh b/scripts/source_return.sh
new file mode 100644
index 0000000..dab5ede
--- /dev/null
+++ b/scripts/source_return.sh
@@ -0,0 +1,2 @@
+return 10
+NOT_EXIST=1

diff --git a/src/builtins/source_builtin.cpp b/src/builtins/builtin_exceptions.h
similarity index 50%
copy from src/builtins/source_builtin.cpp
copy to src/builtins/builtin_exceptions.h
index d2b4bcb..8cce34e 100644
--- a/src/builtins/source_builtin.cpp
+++ b/src/builtins/builtin_exceptions.h
@@ -17,34 +17,25 @@
    along with libbash.  If not, see <http://www.gnu.org/licenses/>.
 */
 ///
-/// \file source_builtin.h
+/// \file builtin_exceptions.h
 /// \author Mu Qiao
-/// \brief class that implements the source builtin
+/// \brief implementations for builtin exceptions
 ///
 
-#include "builtins/source_builtin.h"
+#ifndef LIBBASH_BUILTINS_BUILTIN_EXCEPTIONS_H_
+#define LIBBASH_BUILTINS_BUILTIN_EXCEPTIONS_H_
 
-#include <fstream>
-#include <string>
+#include <stdexcept>
 
-#include "cppbash_builtin.h"
-#include "core/interpreter.h"
-#include "core/interpreter_exception.h"
-#include "core/bash_ast.h"
-
-int source_builtin::exec(const std::vector<std::string>& bash_args)
+///
+/// \class return_exception
+/// \brief thrown when executing the return builtin
+///
+class return_exception: public std::runtime_error
 {
-  if(bash_args.size() == 0)
-    throw interpreter_exception("should provide one argument for source builtin");
-
-  // we need fix this to pass extra arguments as positional parameters
-  const std::string& path = bash_args[0];
-  std::ifstream input(path);
-  if(!input)
-    throw interpreter_exception(path + " can't be read");
-
-  bash_ast ast(input);
-  ast.interpret_with(_walker);
+public:
+  explicit return_exception():
+    runtime_error(""){}
+};
 
-  return _walker.get_status();
-}
+#endif

diff --git a/src/builtins/source_builtin.cpp b/src/builtins/return_builtin.cpp
similarity index 54%
copy from src/builtins/source_builtin.cpp
copy to src/builtins/return_builtin.cpp
index d2b4bcb..3180345 100644
--- a/src/builtins/source_builtin.cpp
+++ b/src/builtins/return_builtin.cpp
@@ -17,34 +17,23 @@
    along with libbash.  If not, see <http://www.gnu.org/licenses/>.
 */
 ///
-/// \file source_builtin.h
+/// \file return_builtin.h
 /// \author Mu Qiao
-/// \brief class that implements the source builtin
+/// \brief implementation for the return builtin
 ///
 
-#include "builtins/source_builtin.h"
+#include "builtins/return_builtin.h"
 
-#include <fstream>
-#include <string>
-
-#include "cppbash_builtin.h"
+#include "builtins/builtin_exceptions.h"
 #include "core/interpreter.h"
-#include "core/interpreter_exception.h"
-#include "core/bash_ast.h"
+#include "cppbash_builtin.h"
 
-int source_builtin::exec(const std::vector<std::string>& bash_args)
+int return_builtin::exec(const std::vector<std::string>& bash_args)
 {
-  if(bash_args.size() == 0)
-    throw interpreter_exception("should provide one argument for source builtin");
-
-  // we need fix this to pass extra arguments as positional parameters
-  const std::string& path = bash_args[0];
-  std::ifstream input(path);
-  if(!input)
-    throw interpreter_exception(path + " can't be read");
-
-  bash_ast ast(input);
-  ast.interpret_with(_walker);
+  if(bash_args.size() > 1)
+    throw interpreter_exception("return: too many arguments");
+  else if(bash_args.size() == 1)
+    _walker.set_status(boost::lexical_cast<int>(bash_args[0]));
 
-  return _walker.get_status();
+  throw return_exception();
 }

diff --git a/src/builtins/tests/source_tests.cpp b/src/builtins/return_builtin.h
similarity index 51%
copy from src/builtins/tests/source_tests.cpp
copy to src/builtins/return_builtin.h
index ac0fd3c..54663c2 100644
--- a/src/builtins/tests/source_tests.cpp
+++ b/src/builtins/return_builtin.h
@@ -17,31 +17,19 @@
    along with libbash.  If not, see <http://www.gnu.org/licenses/>.
 */
 ///
-/// \file source_tests.cpp
-/// \brief series of unit tests for source built in
+/// \file return_builtin.h
+/// \brief implementation for the return builtin
 ///
+#ifndef LIBBASH_BUILTINS_RETURN_BUILTIN_H_
+#define LIBBASH_BUILTINS_RETURN_BUILTIN_H_
 
-#include <cstdlib>
-
-#include <iostream>
-#include <string>
-
-#include <gtest/gtest.h>
-
-#include "core/interpreter.h"
 #include "cppbash_builtin.h"
 
-using namespace std;
-
-TEST(source_builtin_test, source)
+class return_builtin : public virtual cppbash_builtin
 {
-  std::string srcdir(getenv("srcdir"));
-  interpreter walker;
-  int status = cppbash_builtin::exec("source", {srcdir + "/scripts/source_true.sh"}, std::cout, std::cerr, std::cin, walker);
-  EXPECT_EQ(status, 0);
-  EXPECT_TRUE(walker.has_function("foo"));
-  EXPECT_STREQ("hello", walker.resolve<std::string>("FOO001").c_str());
+public:
+  BUILTIN_CONSTRUCTOR(return)
+  virtual int exec(const std::vector<std::string>& );
+};
 
-  status = cppbash_builtin::exec("source", {srcdir + "/scripts/source_false.sh"}, std::cout, std::cerr, std::cin, walker);
-  EXPECT_EQ(status, 1);
-}
+#endif

diff --git a/src/builtins/source_builtin.cpp b/src/builtins/source_builtin.cpp
index d2b4bcb..1e82c77 100644
--- a/src/builtins/source_builtin.cpp
+++ b/src/builtins/source_builtin.cpp
@@ -27,6 +27,7 @@
 #include <fstream>
 #include <string>
 
+#include "builtins/builtin_exceptions.h"
 #include "cppbash_builtin.h"
 #include "core/interpreter.h"
 #include "core/interpreter_exception.h"
@@ -44,7 +45,11 @@ int source_builtin::exec(const std::vector<std::string>& bash_args)
     throw interpreter_exception(path + " can't be read");
 
   bash_ast ast(input);
-  ast.interpret_with(_walker);
+  try
+  {
+    ast.interpret_with(_walker);
+  }
+  catch(return_exception& e) {}
 
   return _walker.get_status();
 }

diff --git a/src/builtins/tests/source_tests.cpp b/src/builtins/tests/return_tests.cpp
similarity index 58%
copy from src/builtins/tests/source_tests.cpp
copy to src/builtins/tests/return_tests.cpp
index ac0fd3c..23e147a 100644
--- a/src/builtins/tests/source_tests.cpp
+++ b/src/builtins/tests/return_tests.cpp
@@ -17,31 +17,26 @@
    along with libbash.  If not, see <http://www.gnu.org/licenses/>.
 */
 ///
-/// \file source_tests.cpp
-/// \brief series of unit tests for source built in
+/// \file return_tests.cpp
+/// \brief series of unit tests for return builtin
 ///
-
-#include <cstdlib>
-
 #include <iostream>
-#include <string>
 
+#include <boost/lexical_cast.hpp>
 #include <gtest/gtest.h>
 
+#include "builtins/builtin_exceptions.h"
 #include "core/interpreter.h"
 #include "cppbash_builtin.h"
 
-using namespace std;
-
-TEST(source_builtin_test, source)
+TEST(return_builtin_test, bad_argument)
 {
-  std::string srcdir(getenv("srcdir"));
   interpreter walker;
-  int status = cppbash_builtin::exec("source", {srcdir + "/scripts/source_true.sh"}, std::cout, std::cerr, std::cin, walker);
-  EXPECT_EQ(status, 0);
-  EXPECT_TRUE(walker.has_function("foo"));
-  EXPECT_STREQ("hello", walker.resolve<std::string>("FOO001").c_str());
+  EXPECT_THROW(cppbash_builtin::exec("return", {"abc"}, std::cout, std::cerr, std::cin, walker), boost::bad_lexical_cast);
+}
 
-  status = cppbash_builtin::exec("source", {srcdir + "/scripts/source_false.sh"}, std::cout, std::cerr, std::cin, walker);
-  EXPECT_EQ(status, 1);
+TEST(return_builtin_test, bad_location)
+{
+  interpreter walker;
+  EXPECT_THROW(cppbash_builtin::exec("return", {}, std::cout, std::cerr, std::cin, walker), return_exception);
 }

diff --git a/src/builtins/tests/source_tests.cpp b/src/builtins/tests/source_tests.cpp
index ac0fd3c..ae603ae 100644
--- a/src/builtins/tests/source_tests.cpp
+++ b/src/builtins/tests/source_tests.cpp
@@ -28,20 +28,51 @@
 
 #include <gtest/gtest.h>
 
+#include "builtins/builtin_exceptions.h"
 #include "core/interpreter.h"
 #include "cppbash_builtin.h"
 
 using namespace std;
 
-TEST(source_builtin_test, source)
+TEST(source_builtin_test, source_true)
 {
   std::string srcdir(getenv("srcdir"));
   interpreter walker;
-  int status = cppbash_builtin::exec("source", {srcdir + "/scripts/source_true.sh"}, std::cout, std::cerr, std::cin, walker);
+
+  int status = cppbash_builtin::exec("source",
+                                     {srcdir + "/scripts/source_true.sh"},
+                                     std::cout,
+                                     std::cerr,
+                                     std::cin,
+                                     walker);
   EXPECT_EQ(status, 0);
   EXPECT_TRUE(walker.has_function("foo"));
   EXPECT_STREQ("hello", walker.resolve<std::string>("FOO001").c_str());
+}
 
-  status = cppbash_builtin::exec("source", {srcdir + "/scripts/source_false.sh"}, std::cout, std::cerr, std::cin, walker);
+TEST(source_builtin_test, source_false)
+{
+  std::string srcdir(getenv("srcdir"));
+  interpreter walker;
+  int status = cppbash_builtin::exec("source",
+                                     {srcdir + "/scripts/source_false.sh"},
+                                     std::cout,
+                                     std::cerr,
+                                     std::cin,
+                                     walker);
   EXPECT_EQ(status, 1);
 }
+
+TEST(source_builtin_test, source_return)
+{
+  std::string srcdir(getenv("srcdir"));
+  interpreter walker;
+  int status = cppbash_builtin::exec("source",
+                                     {srcdir + "/scripts/source_return.sh"},
+                                     std::cout,
+                                     std::cerr,
+                                     std::cin,
+                                     walker);
+  EXPECT_EQ(status, 10);
+  EXPECT_TRUE(walker.is_unset_or_null("NOT_EXIST", 0));
+}

diff --git a/src/cppbash_builtin.cpp b/src/cppbash_builtin.cpp
index dc6ec3e..71d3153 100644
--- a/src/cppbash_builtin.cpp
+++ b/src/cppbash_builtin.cpp
@@ -23,9 +23,11 @@
 ///
 
 #include "cppbash_builtin.h"
+
+#include "builtins/boolean_builtins.h"
 #include "builtins/echo_builtin.h"
 #include "builtins/inherit_builtin.h"
-#include "builtins/boolean_builtins.h"
+#include "builtins/return_builtin.h"
 #include "builtins/source_builtin.h"
 
 cppbash_builtin::cppbash_builtin(BUILTIN_ARGS): _out_stream(&out), _err_stream(&err), _inp_stream(&in), _walker(walker)
@@ -38,7 +40,8 @@ cppbash_builtin::builtins_type& cppbash_builtin::builtins() {
       {"source", boost::factory<source_builtin*>()},
       {"inherit", boost::factory<inherit_builtin*>()},
       {"true", boost::factory<true_builtin*>()},
-      {"false", boost::factory<false_builtin*>()}
+      {"false", boost::factory<false_builtin*>()},
+      {"return", boost::factory<return_builtin*>()}
   });
   return *p;
 }



^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2011-05-07  9:16 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-05-07  9:16 [gentoo-commits] proj/libbash:master commit in: src/, scripts/, /, src/builtins/tests/, bashast/, src/builtins/ Petteri Räty

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox