Blame SOURCES/ctags-5.8-ocaml-crash.patch

b1280f
diff -up ctags-5.8/ocaml.c.me ctags-5.8/ocaml.c
b1280f
--- ctags-5.8/ocaml.c.me	2012-08-02 12:42:21.652211192 +0200
b1280f
+++ ctags-5.8/ocaml.c	2012-08-02 13:06:59.751283639 +0200
b1280f
@@ -72,6 +72,7 @@ typedef enum {
b1280f
 	OcaKEYWORD_if,
b1280f
 	OcaKEYWORD_in,
b1280f
 	OcaKEYWORD_let,
b1280f
+	OcaKEYWORD_value,
b1280f
 	OcaKEYWORD_match,
b1280f
 	OcaKEYWORD_method,
b1280f
 	OcaKEYWORD_module,
b1280f
@@ -145,7 +146,7 @@ static const ocaKeywordDesc OcamlKeyword
b1280f
 	{ "try"       , OcaKEYWORD_try       }, 
b1280f
 	{ "type"      , OcaKEYWORD_type      }, 
b1280f
 	{ "val"       , OcaKEYWORD_val       }, 
b1280f
-	{ "value"     , OcaKEYWORD_let       }, /* just to handle revised syntax */
b1280f
+	{ "value"     , OcaKEYWORD_value     }, /* just to handle revised syntax */
b1280f
 	{ "virtual"   , OcaKEYWORD_virtual   }, 
b1280f
 	{ "while"     , OcaKEYWORD_while     }, 
b1280f
 	{ "with"      , OcaKEYWORD_with      }, 
b1280f
@@ -297,7 +298,6 @@ static void eatComment (lexingState * st
b1280f
 			if (st->cp == NULL)
b1280f
 				return;
b1280f
 			c = st->cp;
b1280f
-			continue;
b1280f
 		}
b1280f
 		/* we've reached the end of the comment */
b1280f
 		else if (*c == ')' && lastIsStar)
b1280f
@@ -308,13 +308,33 @@ static void eatComment (lexingState * st
b1280f
 		{
b1280f
 			st->cp = c;
b1280f
 			eatComment (st);
b1280f
+
b1280f
 			c = st->cp;
b1280f
+			if (c == NULL)
b1280f
+			    return;
b1280f
+
b1280f
 			lastIsStar = FALSE;
b1280f
+            c++;
b1280f
 		}
b1280f
+		/* OCaml has a rule which says :
b1280f
+		 *
b1280f
+		 *   "Comments do not occur inside string or character literals.
b1280f
+		 *    Nested comments are handled correctly."
b1280f
+		 *
b1280f
+		 * So if we encounter a string beginning, we must parse it to
b1280f
+		 * get a good comment nesting (bug ID: 3117537)
b1280f
+		 */
b1280f
+        else if (*c == '"')
b1280f
+        {
b1280f
+            st->cp = c;
b1280f
+            eatString (st);
b1280f
+            c = st->cp;
b1280f
+        }
b1280f
 		else
b1280f
+        {
b1280f
 			lastIsStar = '*' == *c;
b1280f
-
b1280f
-		c++;
b1280f
+            c++;
b1280f
+        }
b1280f
 	}
b1280f
 
b1280f
 	st->cp = c;
b1280f
@@ -554,8 +574,7 @@ static int getLastNamedIndex ( void )
b1280f
 
b1280f
 	for (i = stackIndex - 1; i >= 0; --i)
b1280f
 	{
b1280f
-		if (stack[i].contextName->buffer &&
b1280f
-			strlen (stack[i].contextName->buffer) > 0)
b1280f
+        if (vStringLength (stack[i].contextName) > 0)
b1280f
 		{
b1280f
 			return i;
b1280f
 		}
b1280f
@@ -866,6 +885,11 @@ static void prepareTag (tagEntryInfo * t
b1280f
 	tag->kindName = OcamlKinds[kind].name;
b1280f
 	tag->kind = OcamlKinds[kind].letter;
b1280f
 
b1280f
+	if (kind == K_MODULE)
b1280f
+	{
b1280f
+		tag->lineNumberEntry = TRUE;
b1280f
+		tag->lineNumber = 1;
b1280f
+	}
b1280f
 	parentIndex = getLastNamedIndex ();
b1280f
 	if (parentIndex >= 0)
b1280f
 	{
b1280f
@@ -880,9 +904,12 @@ static void prepareTag (tagEntryInfo * t
b1280f
  * more information to it in the future */
b1280f
 static void addTag (vString * const ident, int kind)
b1280f
 {
b1280f
-	tagEntryInfo toCreate;
b1280f
-	prepareTag (&toCreate, ident, kind);
b1280f
-	makeTagEntry (&toCreate);
b1280f
+	if (OcamlKinds [kind].enabled  &&  ident != NULL  &&  vStringLength (ident) > 0)
b1280f
+	{
b1280f
+		tagEntryInfo toCreate;
b1280f
+		prepareTag (&toCreate, ident, kind);
b1280f
+		makeTagEntry (&toCreate);
b1280f
+	}
b1280f
 }
b1280f
 
b1280f
 boolean needStrongPoping = FALSE;
b1280f
@@ -942,15 +969,17 @@ static void typeRecord (vString * const
b1280f
 }
b1280f
 
b1280f
 /* handle :
b1280f
- * exception ExceptionName ... */
b1280f
+ * exception ExceptionName of ... */
b1280f
 static void exceptionDecl (vString * const ident, ocaToken what)
b1280f
 {
b1280f
 	if (what == OcaIDENTIFIER)
b1280f
 	{
b1280f
 		addTag (ident, K_EXCEPTION);
b1280f
 	}
b1280f
-	/* don't know what to do on else... */
b1280f
-
b1280f
+    else /* probably ill-formed, give back to global scope */
b1280f
+    { 
b1280f
+        globalScope (ident, what);
b1280f
+    }
b1280f
 	toDoNext = &globalScope;
b1280f
 }
b1280f
 
b1280f
@@ -1006,7 +1035,6 @@ static void constructorValidation (vStri
b1280f
  */
b1280f
 static void typeDecl (vString * const ident, ocaToken what)
b1280f
 {
b1280f
-
b1280f
 	switch (what)
b1280f
 	{
b1280f
 		/* parameterized */
b1280f
@@ -1046,7 +1074,6 @@ static void typeDecl (vString * const id
b1280f
  * let typeRecord handle it. */
b1280f
 static void typeSpecification (vString * const ident, ocaToken what)
b1280f
 {
b1280f
-
b1280f
 	switch (what)
b1280f
 	{
b1280f
 	case OcaIDENTIFIER:
b1280f
@@ -1243,8 +1270,14 @@ static void localLet (vString * const id
b1280f
  * than the let definitions.
b1280f
  * Used after a match ... with, or a function ... or fun ...
b1280f
  * because their syntax is similar.  */
b1280f
-static void matchPattern (vString * const UNUSED (ident), ocaToken what)
b1280f
+static void matchPattern (vString * const ident, ocaToken what)
b1280f
 {
b1280f
+    /* keep track of [], as it
b1280f
+     * can be used in patterns and can
b1280f
+     * mean the end of match expression in
b1280f
+     * revised syntax */
b1280f
+    static int braceCount = 0;
b1280f
+
b1280f
 	switch (what)
b1280f
 	{
b1280f
 	case Tok_To:
b1280f
@@ -1252,6 +1285,14 @@ static void matchPattern (vString * cons
b1280f
 		toDoNext = &mayRedeclare;
b1280f
 		break;
b1280f
 
b1280f
+    case Tok_BRL:
b1280f
+        braceCount++;
b1280f
+        break;
b1280f
+
b1280f
+    case OcaKEYWORD_value:
b1280f
+		popLastNamed ();
b1280f
+        globalScope (ident, what);
b1280f
+        break;
b1280f
 
b1280f
 	case OcaKEYWORD_in:
b1280f
 		popLastNamed ();
b1280f
@@ -1269,6 +1310,11 @@ static void mayRedeclare (vString * cons
b1280f
 {
b1280f
 	switch (what)
b1280f
 	{
b1280f
+    case OcaKEYWORD_value:
b1280f
+        /* let globalScope handle it */
b1280f
+        globalScope (ident, what);
b1280f
+        break;
b1280f
+
b1280f
 	case OcaKEYWORD_let:
b1280f
 	case OcaKEYWORD_val:
b1280f
 		toDoNext = localLet;
b1280f
@@ -1388,6 +1434,7 @@ static void classSpecif (vString * const
b1280f
  * nearly a copy/paste of globalLet. */
b1280f
 static void methodDecl (vString * const ident, ocaToken what)
b1280f
 {
b1280f
+
b1280f
 	switch (what)
b1280f
 	{
b1280f
 	case Tok_PARL:
b1280f
@@ -1435,6 +1482,7 @@ vString *lastModule;
b1280f
  */
b1280f
 static void moduleSpecif (vString * const ident, ocaToken what)
b1280f
 {
b1280f
+
b1280f
 	switch (what)
b1280f
 	{
b1280f
 	case OcaKEYWORD_functor:
b1280f
@@ -1566,7 +1614,7 @@ static void globalScope (vString * const
b1280f
 {
b1280f
 	/* Do not touch, this is used only by the global scope
b1280f
 	 * to handle an 'and' */
b1280f
-	static parseNext previousParser = NULL;
b1280f
+	static parseNext previousParser = &globalScope;
b1280f
 
b1280f
 	switch (what)
b1280f
 	{
b1280f
@@ -1608,6 +1656,7 @@ static void globalScope (vString * const
b1280f
 		/* val is mixed with let as global
b1280f
 		 * to be able to handle mli & new syntax */
b1280f
 	case OcaKEYWORD_val:
b1280f
+	case OcaKEYWORD_value:
b1280f
 	case OcaKEYWORD_let:
b1280f
 		cleanupPreviousParser ();
b1280f
 		toDoNext = &globalLet;
b1280f
@@ -1617,7 +1666,7 @@ static void globalScope (vString * const
b1280f
 	case OcaKEYWORD_exception:
b1280f
 		cleanupPreviousParser ();
b1280f
 		toDoNext = &exceptionDecl;
b1280f
-		previousParser = NULL;
b1280f
+		previousParser = &globalScope;
b1280f
 		break;
b1280f
 
b1280f
 		/* must be a #line directive, discard the
b1280f
@@ -1769,7 +1818,7 @@ static void computeModuleName ( void )
b1280f
 	if (isLowerAlpha (moduleName->buffer[0]))
b1280f
 		moduleName->buffer[0] += ('A' - 'a');
b1280f
 
b1280f
-	makeSimpleTag (moduleName, OcamlKinds, K_MODULE);
b1280f
+	addTag (moduleName, K_MODULE);
b1280f
 	vStringDelete (moduleName);
b1280f
 }
b1280f
 
b1280f
@@ -1779,6 +1828,7 @@ static void initStack ( void )
b1280f
 	int i;
b1280f
 	for (i = 0; i < OCAML_MAX_STACK_SIZE; ++i)
b1280f
 		stack[i].contextName = vStringNew ();
b1280f
+    stackIndex = 0;
b1280f
 }
b1280f
 
b1280f
 static void clearStack ( void )
b1280f
@@ -1794,8 +1844,8 @@ static void findOcamlTags (void)
b1280f
 	lexingState st;
b1280f
 	ocaToken tok;
b1280f
 
b1280f
-	computeModuleName ();
b1280f
 	initStack ();
b1280f
+	computeModuleName ();
b1280f
 	tempIdent = vStringNew ();
b1280f
 	lastModule = vStringNew ();
b1280f
 	lastClass = vStringNew ();