* [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