Author: coke
Date: Mon Apr 18 18:34:50 2005
New Revision: 7872
Modified:
trunk/dynclasses/tclparser.pmc
Log:
Turn some errors into actual exceptions.
(This seems to also improve tcl's test suite passing % ?)
Modified: trunk/dynclasses/tclparser.pmc
==============================================================================
--- trunk/dynclasses/tclparser.pmc (original)
+++ trunk/dynclasses/tclparser.pmc Mon Apr 18 18:34:50 2005
@@ -125,6 +125,8 @@
/* backslash/newline substitution */
buffer_length = string_length(INTERP, buffer);
+
+ /* Possible regression here if we do the bs_nl substitution >1 */
bs_pos = string_str_index(INTERP, buffer, bs_nl, bs_marker);
/* bs_loop_outer: */
@@ -180,7 +182,6 @@
goto end_scope;
}
-/* space_loop_cont: Unreferenced label commented out */
I0 = string_index(INTERP, buffer, start_word);
if (I0 < 33 && I0 != 10) {
I1 = 1;
@@ -195,9 +196,13 @@
goto space_loop;
space_loop_end:
- /* at this point, we know start_word is correct. Now to figure out where the
word ends. */
+ /*
+ * At this point, we know start_word is correct.
+ * Now to figure out where the word ends.
+ */
/* If the first character is special, then DTRT */
+
character = string_index(INTERP, buffer, start_word);
/* brace-encrusted block */
@@ -229,7 +234,6 @@
goto end_command;
}
-/* middle_word_0: Unreferenced label commented out */
character = string_index(INTERP, buffer, I0);
if (preserve_whitespace == 1) {
@@ -261,7 +265,8 @@
/* If we've gotten this far and we're in a "" or brace-block, barf. */
if (end_of_word == 1) {
- goto invalid_word;
+ real_exception(INTERP, NULL, E_Exception,
+ "extra characters after close-brace");
}
/* [ ] */
@@ -283,7 +288,6 @@
goto handle_backslash;
}
-/* middle_continue: Unreferenced label commented out */
last_character = character;
word_length++;
goto middle_word;
@@ -374,7 +378,7 @@
handle_brace:
word_length = Parrot_TclParser_match_close(INTERP, SELF, buffer,start_word);
if (word_length < 0) {
- goto bad_block;
+ real_exception(INTERP, NULL, E_Exception, "missing close-brace");
}
end_of_word = 1;
@@ -396,7 +400,7 @@
word_length = Parrot_TclParser_match_close(INTERP, SELF, buffer,start_word);
if (word_length < 0) {
- goto bad_block;
+ real_exception(INTERP, NULL, E_Exception, "missing \"");
}
end_of_word = 1 ;
@@ -452,11 +456,10 @@
goto handle_variable_nobrace;
}
-/* handle_variable_brace: Unreferenced label commented out */
/* Get the closing brace, but we don't have to have matched pairs here. */
I1 = string_str_index(INTERP, buffer, cb, chunk_start);
if (I1 > buffer_length) {
- goto invalid_variable;
+ real_exception(INTERP, NULL, E_Exception, "XXX invalid variable");
}
/* Save the new start word for when we go to middle word.*/
I1++;
@@ -525,7 +528,7 @@
}
temppos = string_str_index(INTERP, buffer, cp, start_word);
if (temppos == -1) {
- goto bad_array;
+ real_exception(INTERP, NULL, E_Exception, "XXX bad array");
}
/* $S0($S1) */
start_word++;
@@ -626,7 +629,7 @@
word_length = Parrot_TclParser_match_close(INTERP, SELF, buffer,chunk_start);
if (word_length < 0) {
- goto bad_block;
+ real_exception(INTERP, NULL, E_Exception, "missing close-bracket");
}
if (old_length) {
@@ -636,7 +639,6 @@
Parrot_call_method(INTERP, P1, word, ConcatConst, "vS", S0);
}
-/* command_save: Unreferenced label commented out */
/* Save this as a command (skip the []'s)*/
I0 = chunk_start + 1;
I1 = word_length - 2;
@@ -670,25 +672,6 @@
end:
exit(1); /* XXX this needs to go away. */
- /*
- * XXX these really should generate compile-time tcl errors.
- * (perhaps even compile to code that generates an [error]?)
- * (redo this once "error" is working.)
- */
-
-bad_array:
- printf("XXX - invalid array, no close ) found\n");
- goto end;
-bad_block:
- printf("XXX - invalid word, no closing <mumble> found\n");
- goto end;
-invalid_word:
- printf("XXX - invalid word, should have ended after block\n");
- goto end;
-invalid_variable:
- printf("missing close-brace for variable name\n");
- goto end;
-
}
/* Given a string and a beginning position in the string, return