Closing issue #99 : shared const char * memory issues. Also, clean up some file loading overhead (did not seem to have an performance impact).

This commit is contained in:
Jason Turner
2010-11-05 22:01:39 +00:00
parent e1e48d732f
commit 36173d277d
8 changed files with 163 additions and 174 deletions

View File

@@ -23,7 +23,7 @@ namespace chaiscript
int line, col;
std::string multiline_comment_begin, multiline_comment_end;
std::string singleline_comment;
const char *filename;
boost::shared_ptr<std::string> filename;
std::vector<AST_NodePtr> match_stack;
std::vector<std::vector<std::string> > operator_matches;
@@ -457,7 +457,7 @@ namespace chaiscript
while (has_more_input() && (*input_pos != '`')) {
if (Eol()) {
throw Eval_Error("Carriage return in identifier literal", File_Position(line, col), filename);
throw Eval_Error("Carriage return in identifier literal", File_Position(line, col), *filename);
}
else {
++input_pos;
@@ -466,10 +466,10 @@ namespace chaiscript
}
if (start == input_pos) {
throw Eval_Error("Missing contents of identifier literal", File_Position(line, col), filename);
throw Eval_Error("Missing contents of identifier literal", File_Position(line, col), *filename);
}
else if (input_pos == input_end) {
throw Eval_Error("Incomplete identifier literal", File_Position(line, col), filename);
throw Eval_Error("Incomplete identifier literal", File_Position(line, col), *filename);
}
++col;
@@ -573,7 +573,7 @@ namespace chaiscript
++col;
}
else {
throw Eval_Error("Unclosed quoted string", File_Position(line, col), filename);
throw Eval_Error("Unclosed quoted string", File_Position(line, col), *filename);
}
}
return retval;
@@ -665,7 +665,7 @@ namespace chaiscript
build_match(AST_NodePtr(new Additive_AST_Node()), prev_stack_top);
}
else {
throw Eval_Error("Unclosed in-string eval", File_Position(prev_line, prev_col), filename);
throw Eval_Error("Unclosed in-string eval", File_Position(prev_line, prev_col), *filename);
}
}
else {
@@ -694,7 +694,7 @@ namespace chaiscript
case ('\'') : match.push_back('\''); break;
case ('\"') : match.push_back('\"'); break;
case ('$') : match.push_back('$'); break;
default: throw Eval_Error("Unknown escaped sequence in string", File_Position(prev_line, prev_col), filename);
default: throw Eval_Error("Unknown escaped sequence in string", File_Position(prev_line, prev_col), *filename);
}
}
else if (*s == '$') {
@@ -759,7 +759,7 @@ namespace chaiscript
++col;
}
else {
throw Eval_Error("Unclosed single-quoted string", File_Position(line, col), filename);
throw Eval_Error("Unclosed single-quoted string", File_Position(line, col), *filename);
}
}
return retval;
@@ -801,7 +801,7 @@ namespace chaiscript
case ('t') : match.push_back('\t'); break;
case ('\'') : match.push_back('\''); break;
case ('\"') : match.push_back('\"'); break;
default: throw Eval_Error("Unknown escaped sequence in string", File_Position(prev_line, prev_col), filename);
default: throw Eval_Error("Unknown escaped sequence in string", File_Position(prev_line, prev_col), *filename);
}
}
else {
@@ -868,7 +868,7 @@ namespace chaiscript
if ((input_end - input_pos) >= len) {
std::string::const_iterator tmp = input_pos;
for (size_t i = 0; i < len; ++i) {
for (int i = 0; i < len; ++i) {
if (*tmp != s[i]) {
return false;
}
@@ -1069,7 +1069,7 @@ namespace chaiscript
do {
while (Eol()) {}
if (!Equation()) {
throw Eval_Error("Unexpected value in parameter list", File_Position(line, col), filename);
throw Eval_Error("Unexpected value in parameter list", File_Position(line, col), *filename);
}
} while (retval && Char(','));
}
@@ -1098,7 +1098,7 @@ namespace chaiscript
do {
while (Eol()) {}
if (!Map_Pair()) {
throw Eval_Error("Unexpected value in container", File_Position(line, col), filename);
throw Eval_Error("Unexpected value in container", File_Position(line, col), *filename);
}
} while (retval && Char(','));
}
@@ -1111,7 +1111,7 @@ namespace chaiscript
do {
while (Eol()) {}
if (!Operator()) {
throw Eval_Error("Unexpected value in container", File_Position(line, col), filename);
throw Eval_Error("Unexpected value in container", File_Position(line, col), *filename);
}
} while (retval && Char(','));
}
@@ -1136,14 +1136,14 @@ namespace chaiscript
if (Char('(')) {
Arg_List();
if (!Char(')')) {
throw Eval_Error("Incomplete anonymous function", File_Position(line, col), filename);
throw Eval_Error("Incomplete anonymous function", File_Position(line, col), *filename);
}
}
while (Eol()) {}
if (!Block()) {
throw Eval_Error("Incomplete anonymous function", File_Position(line, col), filename);
throw Eval_Error("Incomplete anonymous function", File_Position(line, col), *filename);
}
build_match(AST_NodePtr(new Lambda_AST_Node()), prev_stack_top);
@@ -1174,7 +1174,7 @@ namespace chaiscript
retval = true;
if (!Id(true)) {
throw Eval_Error("Missing function name in definition", File_Position(line, col), filename);
throw Eval_Error("Missing function name in definition", File_Position(line, col), *filename);
}
if (Symbol("::", false)) {
@@ -1182,14 +1182,14 @@ namespace chaiscript
is_method = true;
if (!Id(true)) {
throw Eval_Error("Missing method name in definition", File_Position(line, col), filename);
throw Eval_Error("Missing method name in definition", File_Position(line, col), *filename);
}
}
if (Char('(')) {
Arg_List();
if (!Char(')')) {
throw Eval_Error("Incomplete function definition", File_Position(line, col), filename);
throw Eval_Error("Incomplete function definition", File_Position(line, col), *filename);
}
}
@@ -1197,13 +1197,13 @@ namespace chaiscript
if (Char(':')) {
if (!Operator()) {
throw Eval_Error("Missing guard expression for function", File_Position(line, col), filename);
throw Eval_Error("Missing guard expression for function", File_Position(line, col), *filename);
}
}
while (Eol()) {}
if (!Block()) {
throw Eval_Error("Incomplete function definition", File_Position(line, col), filename);
throw Eval_Error("Incomplete function definition", File_Position(line, col), *filename);
}
if (is_method) {
@@ -1235,7 +1235,7 @@ namespace chaiscript
while (Eol()) {}
if (!Block()) {
throw Eval_Error("Incomplete 'try' block", File_Position(line, col), filename);
throw Eval_Error("Incomplete 'try' block", File_Position(line, col), *filename);
}
bool has_matches = true;
@@ -1246,11 +1246,11 @@ namespace chaiscript
size_t catch_stack_top = match_stack.size();
if (Char('(')) {
if (!(Id(true) && Char(')'))) {
throw Eval_Error("Incomplete 'catch' expression", File_Position(line, col), filename);
throw Eval_Error("Incomplete 'catch' expression", File_Position(line, col), *filename);
}
if (Char(':')) {
if (!Operator()) {
throw Eval_Error("Missing guard expression for catch", File_Position(line, col), filename);
throw Eval_Error("Missing guard expression for catch", File_Position(line, col), *filename);
}
}
}
@@ -1258,7 +1258,7 @@ namespace chaiscript
while (Eol()) {}
if (!Block()) {
throw Eval_Error("Incomplete 'catch' block", File_Position(line, col), filename);
throw Eval_Error("Incomplete 'catch' block", File_Position(line, col), *filename);
}
build_match(AST_NodePtr(new Catch_AST_Node()), catch_stack_top);
has_matches = true;
@@ -1271,7 +1271,7 @@ namespace chaiscript
while (Eol()) {}
if (!Block()) {
throw Eval_Error("Incomplete 'finally' block", File_Position(line, col), filename);
throw Eval_Error("Incomplete 'finally' block", File_Position(line, col), *filename);
}
build_match(AST_NodePtr(new Finally_AST_Node()), finally_stack_top);
}
@@ -1294,17 +1294,17 @@ namespace chaiscript
retval = true;
if (!Char('(')) {
throw Eval_Error("Incomplete 'if' expression", File_Position(line, col), filename);
throw Eval_Error("Incomplete 'if' expression", File_Position(line, col), *filename);
}
if (!(Operator() && Char(')'))) {
throw Eval_Error("Incomplete 'if' expression", File_Position(line, col), filename);
throw Eval_Error("Incomplete 'if' expression", File_Position(line, col), *filename);
}
while (Eol()) {}
if (!Block()) {
throw Eval_Error("Incomplete 'if' block", File_Position(line, col), filename);
throw Eval_Error("Incomplete 'if' block", File_Position(line, col), *filename);
}
bool has_matches = true;
@@ -1315,17 +1315,17 @@ namespace chaiscript
if (Keyword("if")) {
match_stack.back()->text = "else if";
if (!Char('(')) {
throw Eval_Error("Incomplete 'else if' expression", File_Position(line, col), filename);
throw Eval_Error("Incomplete 'else if' expression", File_Position(line, col), *filename);
}
if (!(Operator() && Char(')'))) {
throw Eval_Error("Incomplete 'else if' expression", File_Position(line, col), filename);
throw Eval_Error("Incomplete 'else if' expression", File_Position(line, col), *filename);
}
while (Eol()) {}
if (!Block()) {
throw Eval_Error("Incomplete 'else if' block", File_Position(line, col), filename);
throw Eval_Error("Incomplete 'else if' block", File_Position(line, col), *filename);
}
has_matches = true;
}
@@ -1333,7 +1333,7 @@ namespace chaiscript
while (Eol()) {}
if (!Block()) {
throw Eval_Error("Incomplete 'else' block", File_Position(line, col), filename);
throw Eval_Error("Incomplete 'else' block", File_Position(line, col), *filename);
}
has_matches = true;
}
@@ -1358,17 +1358,17 @@ namespace chaiscript
retval = true;
if (!Char('(')) {
throw Eval_Error("Incomplete 'while' expression", File_Position(line, col), filename);
throw Eval_Error("Incomplete 'while' expression", File_Position(line, col), *filename);
}
if (!(Operator() && Char(')'))) {
throw Eval_Error("Incomplete 'while' expression", File_Position(line, col), filename);
throw Eval_Error("Incomplete 'while' expression", File_Position(line, col), *filename);
}
while (Eol()) {}
if (!Block()) {
throw Eval_Error("Incomplete 'while' block", File_Position(line, col), filename);
throw Eval_Error("Incomplete 'while' block", File_Position(line, col), *filename);
}
build_match(AST_NodePtr(new While_AST_Node()), prev_stack_top);
@@ -1387,7 +1387,7 @@ namespace chaiscript
return true;
}
else {
throw Eval_Error("Incomplete conditions in 'for' loop", File_Position(line, col), filename);
throw Eval_Error("Incomplete conditions in 'for' loop", File_Position(line, col), *filename);
}
}
@@ -1403,17 +1403,17 @@ namespace chaiscript
retval = true;
if (!Char('(')) {
throw Eval_Error("Incomplete 'for' expression", File_Position(line, col), filename);
throw Eval_Error("Incomplete 'for' expression", File_Position(line, col), *filename);
}
if (!(For_Guards() && Char(')'))) {
throw Eval_Error("Incomplete 'for' expression", File_Position(line, col), filename);
throw Eval_Error("Incomplete 'for' expression", File_Position(line, col), *filename);
}
while (Eol()) {}
if (!Block()) {
throw Eval_Error("Incomplete 'for' block", File_Position(line, col), filename);
throw Eval_Error("Incomplete 'for' block", File_Position(line, col), *filename);
}
build_match(AST_NodePtr(new For_AST_Node()), prev_stack_top);
@@ -1435,7 +1435,7 @@ namespace chaiscript
Statements();
if (!Char('}')) {
throw Eval_Error("Incomplete block", File_Position(line, col), filename);
throw Eval_Error("Incomplete block", File_Position(line, col), *filename);
}
build_match(AST_NodePtr(new Block_AST_Node()), prev_stack_top);
@@ -1499,7 +1499,7 @@ namespace chaiscript
Arg_List();
if (!Char(')')) {
throw Eval_Error("Incomplete function call", File_Position(line, col), filename);
throw Eval_Error("Incomplete function call", File_Position(line, col), *filename);
}
build_match(AST_NodePtr(new Fun_Call_AST_Node()), prev_stack_top);
@@ -1508,7 +1508,7 @@ namespace chaiscript
has_more = true;
if (!(Operator() && Char(']'))) {
throw Eval_Error("Incomplete array access", File_Position(line, col), filename);
throw Eval_Error("Incomplete array access", File_Position(line, col), *filename);
}
build_match(AST_NodePtr(new Array_Call_AST_Node()), prev_stack_top);
@@ -1531,7 +1531,7 @@ namespace chaiscript
retval = true;
if (!Id(true)) {
throw Eval_Error("Incomplete variable declaration", File_Position(line, col), filename);
throw Eval_Error("Incomplete variable declaration", File_Position(line, col), *filename);
}
build_match(AST_NodePtr(new Var_Decl_AST_Node()), prev_stack_top);
@@ -1540,13 +1540,13 @@ namespace chaiscript
retval = true;
if (!Id(true)) {
throw Eval_Error("Incomplete attribute declaration", File_Position(line, col), filename);
throw Eval_Error("Incomplete attribute declaration", File_Position(line, col), *filename);
}
if (!Symbol("::", false)) {
throw Eval_Error("Incomplete attribute declaration", File_Position(line, col), filename);
throw Eval_Error("Incomplete attribute declaration", File_Position(line, col), *filename);
}
if (!Id(true)) {
throw Eval_Error("Missing attribute name in definition", File_Position(line, col), filename);
throw Eval_Error("Missing attribute name in definition", File_Position(line, col), *filename);
}
@@ -1565,10 +1565,10 @@ namespace chaiscript
if (Char('(')) {
retval = true;
if (!Operator()) {
throw Eval_Error("Incomplete expression", File_Position(line, col), filename);
throw Eval_Error("Incomplete expression", File_Position(line, col), *filename);
}
if (!Char(')')) {
throw Eval_Error("Missing closing parenthesis", File_Position(line, col), filename);
throw Eval_Error("Missing closing parenthesis", File_Position(line, col), *filename);
}
}
return retval;
@@ -1586,7 +1586,7 @@ namespace chaiscript
retval = true;
Container_Arg_List();
if (!Char(']')) {
throw Eval_Error("Missing closing square bracket", File_Position(line, col), filename);
throw Eval_Error("Missing closing square bracket", File_Position(line, col), *filename);
}
if ((prev_stack_top != match_stack.size()) && (match_stack.back()->children.size() > 0)) {
if (match_stack.back()->children[0]->identifier == AST_Node_Type::Value_Range) {
@@ -1619,7 +1619,7 @@ namespace chaiscript
retval = true;
if (!Operator(operators.size()-1)) {
throw Eval_Error("Incomplete '++' expression", File_Position(line, col), filename);
throw Eval_Error("Incomplete '++' expression", File_Position(line, col), *filename);
}
build_match(AST_NodePtr(new Prefix_AST_Node()), prev_stack_top);
@@ -1628,7 +1628,7 @@ namespace chaiscript
retval = true;
if (!Operator(operators.size()-1)) {
throw Eval_Error("Incomplete '--' expression", File_Position(line, col), filename);
throw Eval_Error("Incomplete '--' expression", File_Position(line, col), *filename);
}
build_match(AST_NodePtr(new Prefix_AST_Node()), prev_stack_top);
@@ -1637,7 +1637,7 @@ namespace chaiscript
retval = true;
if (!Operator(operators.size()-1)) {
throw Eval_Error("Incomplete unary '-' expression", File_Position(line, col), filename);
throw Eval_Error("Incomplete unary '-' expression", File_Position(line, col), *filename);
}
build_match(AST_NodePtr(new Prefix_AST_Node()), prev_stack_top);
@@ -1646,7 +1646,7 @@ namespace chaiscript
retval = true;
if (!Operator(operators.size()-1)) {
throw Eval_Error("Incomplete unary '+' expression", File_Position(line, col), filename);
throw Eval_Error("Incomplete unary '+' expression", File_Position(line, col), *filename);
}
build_match(AST_NodePtr(new Prefix_AST_Node()), prev_stack_top);
@@ -1655,7 +1655,7 @@ namespace chaiscript
retval = true;
if (!Operator(operators.size()-1)) {
throw Eval_Error("Incomplete '!' expression", File_Position(line, col), filename);
throw Eval_Error("Incomplete '!' expression", File_Position(line, col), *filename);
}
build_match(AST_NodePtr(new Prefix_AST_Node()), prev_stack_top);
@@ -1664,7 +1664,7 @@ namespace chaiscript
retval = true;
if (!Operator(operators.size()-1)) {
throw Eval_Error("Incomplete '~' expression", File_Position(line, col), filename);
throw Eval_Error("Incomplete '~' expression", File_Position(line, col), *filename);
}
build_match(AST_NodePtr(new Prefix_AST_Node()), prev_stack_top);
@@ -1707,7 +1707,7 @@ namespace chaiscript
do {
if (!Operator(precedence+1)) {
throw Eval_Error("Incomplete " + std::string(ast_node_type_to_string(operators[precedence])) + " expression",
File_Position(line, col), filename);
File_Position(line, col), *filename);
}
} while (Operator_Helper(precedence));
@@ -1746,7 +1746,7 @@ namespace chaiscript
build_match(AST_NodePtr(new Logical_Or_AST_Node()), prev_stack_top);
break;
default:
throw Eval_Error("Internal error: unhandled ast_node", File_Position(line, col), filename);
throw Eval_Error("Internal error: unhandled ast_node", File_Position(line, col), *filename);
}
}
}
@@ -1772,7 +1772,7 @@ namespace chaiscript
if (Symbol(":")) {
retval = true;
if (!Operator()) {
throw Eval_Error("Incomplete map pair", File_Position(line, col), filename);
throw Eval_Error("Incomplete map pair", File_Position(line, col), *filename);
}
build_match(AST_NodePtr(new Map_Pair_AST_Node()), prev_stack_top);
@@ -1803,7 +1803,7 @@ namespace chaiscript
if (Symbol("..")) {
retval = true;
if (!Operator()) {
throw Eval_Error("Incomplete value range", File_Position(line, col), filename);
throw Eval_Error("Incomplete value range", File_Position(line, col), *filename);
}
build_match(AST_NodePtr(new Value_Range_AST_Node()), prev_stack_top);
@@ -1835,7 +1835,7 @@ namespace chaiscript
Symbol("%=", true, true) || Symbol("<<=", true, true) || Symbol(">>=", true, true) ||
Symbol("&=", true, true) || Symbol("^=", true, true) || Symbol("|=", true, true)) {
if (!Equation()) {
throw Eval_Error("Incomplete equation", File_Position(line, col), filename);
throw Eval_Error("Incomplete equation", File_Position(line, col), *filename);
}
build_match(AST_NodePtr(new Equation_AST_Node()), prev_stack_top);
@@ -1860,7 +1860,7 @@ namespace chaiscript
int prev_col = col;
if (Def()) {
if (!saw_eol) {
throw Eval_Error("Two function definitions missing line separator", File_Position(prev_line, prev_col), filename);
throw Eval_Error("Two function definitions missing line separator", File_Position(prev_line, prev_col), *filename);
}
has_more = true;
retval = true;
@@ -1868,7 +1868,7 @@ namespace chaiscript
}
else if (Try()) {
if (!saw_eol) {
throw Eval_Error("Two function definitions missing line separator", File_Position(prev_line, prev_col), filename);
throw Eval_Error("Two function definitions missing line separator", File_Position(prev_line, prev_col), *filename);
}
has_more = true;
retval = true;
@@ -1876,7 +1876,7 @@ namespace chaiscript
}
else if (If()) {
if (!saw_eol) {
throw Eval_Error("Two function definitions missing line separator", File_Position(prev_line, prev_col), filename);
throw Eval_Error("Two function definitions missing line separator", File_Position(prev_line, prev_col), *filename);
}
has_more = true;
retval = true;
@@ -1884,7 +1884,7 @@ namespace chaiscript
}
else if (While()) {
if (!saw_eol) {
throw Eval_Error("Two function definitions missing line separator", File_Position(prev_line, prev_col), filename);
throw Eval_Error("Two function definitions missing line separator", File_Position(prev_line, prev_col), *filename);
}
has_more = true;
retval = true;
@@ -1892,7 +1892,7 @@ namespace chaiscript
}
else if (For()) {
if (!saw_eol) {
throw Eval_Error("Two function definitions missing line separator", File_Position(prev_line, prev_col), filename);
throw Eval_Error("Two function definitions missing line separator", File_Position(prev_line, prev_col), *filename);
}
has_more = true;
retval = true;
@@ -1900,7 +1900,7 @@ namespace chaiscript
}
else if (Return()) {
if (!saw_eol) {
throw Eval_Error("Two expressions missing line separator", File_Position(prev_line, prev_col), filename);
throw Eval_Error("Two expressions missing line separator", File_Position(prev_line, prev_col), *filename);
}
has_more = true;
retval = true;
@@ -1908,7 +1908,7 @@ namespace chaiscript
}
else if (Break()) {
if (!saw_eol) {
throw Eval_Error("Two expressions missing line separator", File_Position(prev_line, prev_col), filename);
throw Eval_Error("Two expressions missing line separator", File_Position(prev_line, prev_col), *filename);
}
has_more = true;
retval = true;
@@ -1916,7 +1916,7 @@ namespace chaiscript
}
else if (Equation()) {
if (!saw_eol) {
throw Eval_Error("Two expressions missing line separator", File_Position(prev_line, prev_col), filename);
throw Eval_Error("Two expressions missing line separator", File_Position(prev_line, prev_col), *filename);
}
has_more = true;
retval = true;
@@ -1943,11 +1943,12 @@ namespace chaiscript
/**
* Parses the given input string, tagging parsed ast_nodes with the given filename.
*/
bool parse(const std::string &input, const char *fname) {
bool parse(const std::string &input, const std::string &fname) {
input_pos = input.begin();
input_end = input.end();
line = 1; col = 1;
filename = fname;
line = 1;
col = 1;
filename = boost::shared_ptr<std::string>(new std::string(fname));
if ((input.size() > 1) && (input[0] == '#') && (input[1] == '!')) {
while ((input_pos != input_end) && (!Eol())) {