diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index d2c3e17a955..08e649ee482 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,34 @@
+Wed Jun 10 15:39:14 1998  Stu Grossman  <grossman@babylon-5.cygnus.com>
+
+	* c-exp.y:  Fix problems with parsing "'foo.bar'::func".  Some languages
+	allow symbols with dots.
+
+	* gdbtypes.c (check_stub_method):  Cosmetic.  Use more descriptive
+	names for parameters.
+
+start-sanitize-java
+	* jv-exp.y:  Parser now accepts primitive types.
+	* (parse_number):  Use correct ifdef for scanf long double support.
+	* jv-lang.c (java_array_type):  Initial cut at array support.
+
+end-sanitize-java
+	* language.c language.h (set_language):  Now returns previous language.
+
+	* symtab.c (find_methods):  Make static.  Cosmetic changes, including
+	indentation, and adding descriptive comments.  Move local variable defs
+	into the block they are used in.
+	* Don't call check_stub_method any more.  Use gdb_mangle_name to
+	generate the full method name.  find_method doesn't need all the other
+	goobldegook that check_stub_method does.
+	* (gdb_mangle_name):  Use more descriptive names for parameters.  Fix
+	comment.
+start-sanitize-java
+	* (lookup_partial_symbol lookup_block_symbol):  Check for java to
+	ensure we can find mangled names.
+end-sanitize-java
+	* (decode_line_1):  Move local variable defs into the block they are
+	used in.  (Improves code readability.)
+	
 Wed Jun 10 14:06:05 1998  Jason Molenda  (crash@bugshack.cygnus.com)
 
 	* configure.in: Add some tests for gnu-regex.c's benefit.
diff --git a/gdb/c-exp.y b/gdb/c-exp.y
index 7316ae8a1b9..a6d21aebdd4 100644
--- a/gdb/c-exp.y
+++ b/gdb/c-exp.y
@@ -214,6 +214,7 @@ parse_number PARAMS ((char *, int, int, YYSTYPE *));
 %right UNARY INCREMENT DECREMENT
 %right ARROW '.' '[' '('
 %token <ssym> BLOCKNAME 
+%token <bval> FILENAME
 %type <bval> block
 %left COLONCOLON
 
@@ -531,18 +532,15 @@ exp	:	THIS
 
 block	:	BLOCKNAME
 			{
-			  if ($1.sym != 0)
-			      $$ = SYMBOL_BLOCK_VALUE ($1.sym);
+			  if ($1.sym)
+			    $$ = SYMBOL_BLOCK_VALUE ($1.sym);
 			  else
-			    {
-			      struct symtab *tem =
-				  lookup_symtab (copy_name ($1.stoken));
-			      if (tem)
-				$$ = BLOCKVECTOR_BLOCK (BLOCKVECTOR (tem), STATIC_BLOCK);
-			      else
-				error ("No file or function \"%s\".",
-				       copy_name ($1.stoken));
-			    }
+			    error ("No file or function \"%s\".",
+				   copy_name ($1.stoken));
+			}
+	|	FILENAME
+			{
+			  $$ = $1;
 			}
 	;
 
@@ -1526,13 +1524,25 @@ yylex ()
     /* Call lookup_symtab, not lookup_partial_symtab, in case there are
        no psymtabs (coff, xcoff, or some future change to blow away the
        psymtabs once once symbols are read).  */
-    if ((sym && SYMBOL_CLASS (sym) == LOC_BLOCK) ||
-        lookup_symtab (tmp))
+    if (sym && SYMBOL_CLASS (sym) == LOC_BLOCK)
       {
 	yylval.ssym.sym = sym;
 	yylval.ssym.is_a_field_of_this = is_a_field_of_this;
 	return BLOCKNAME;
       }
+    else if (!sym)
+      {				/* See if it's a file name. */
+	struct symtab *symtab;
+
+	symtab = lookup_symtab (tmp);
+
+	if (symtab)
+	  {
+	    yylval.bval = BLOCKVECTOR_BLOCK (BLOCKVECTOR (symtab), STATIC_BLOCK);
+	    return FILENAME;
+	  }
+      }
+
     if (sym && SYMBOL_CLASS (sym) == LOC_TYPEDEF)
         {
 #if 1
diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c
index 416180e6498..7027cc9f22e 100644
--- a/gdb/gdbtypes.c
+++ b/gdb/gdbtypes.c
@@ -1238,13 +1238,13 @@ cfront_mangle_name(type, i, j)
    the space required for them.  */
 
 void
-check_stub_method (type, i, j)
+check_stub_method (type, method_id, signature_id)
      struct type *type;
-     int i;
-     int j;
+     int method_id;
+     int signature_id;
 {
   struct fn_field *f;
-  char *mangled_name = gdb_mangle_name (type, i, j);
+  char *mangled_name = gdb_mangle_name (type, method_id, signature_id);
   char *demangled_name = cplus_demangle (mangled_name,
 					 DMGL_PARAMS | DMGL_ANSI);
   char *argtypetext, *p;
@@ -1331,16 +1331,16 @@ check_stub_method (type, i, j)
 
   free (demangled_name);
 
-  f = TYPE_FN_FIELDLIST1 (type, i);	
+  f = TYPE_FN_FIELDLIST1 (type, method_id);	
 
-  TYPE_FN_FIELD_PHYSNAME (f, j) = mangled_name;
+  TYPE_FN_FIELD_PHYSNAME (f, signature_id) = mangled_name;
 
   /* Now update the old "stub" type into a real type.  */
-  mtype = TYPE_FN_FIELD_TYPE (f, j);
+  mtype = TYPE_FN_FIELD_TYPE (f, signature_id);
   TYPE_DOMAIN_TYPE (mtype) = type;
   TYPE_ARG_TYPES (mtype) = argtypes;
   TYPE_FLAGS (mtype) &= ~TYPE_FLAG_STUB;
-  TYPE_FN_FIELD_STUB (f, j) = 0;
+  TYPE_FN_FIELD_STUB (f, signature_id) = 0;
 }
 
 const struct cplus_struct_type cplus_struct_default;
diff --git a/gdb/jv-exp.y b/gdb/jv-exp.y
index 828a557e4ff..672991bb49c 100644
--- a/gdb/jv-exp.y
+++ b/gdb/jv-exp.y
@@ -151,7 +151,7 @@ parse_number PARAMS ((char *, int, int, YYSTYPE *));
 
 %type <lval> rcurly Dims Dims_opt
 %type <tval> ClassOrInterfaceType ClassType /* ReferenceType Type ArrayType */
-%type <tval> IntegralType FloatingPointType NumericType PrimitiveType
+%type <tval> IntegralType FloatingPointType NumericType PrimitiveType ArrayType PrimitiveOrArrayType
 
 %token <typed_val_int> INTEGER_LITERAL
 %token <typed_val_float> FLOATING_POINT_LITERAL
@@ -201,7 +201,20 @@ parse_number PARAMS ((char *, int, int, YYSTYPE *));
 %%
 
 start   :	exp1
-/*	|	type_exp FIXME */
+	|	type_exp
+	;
+
+type_exp:	PrimitiveOrArrayType
+		{
+		  write_exp_elt_opcode(OP_TYPE);
+		  write_exp_elt_type($1);
+		  write_exp_elt_opcode(OP_TYPE);
+		}
+	;
+
+PrimitiveOrArrayType:
+		PrimitiveType
+	|	ArrayType
 	;
 
 StringLiteral:
@@ -294,14 +307,12 @@ ClassType:
 	ClassOrInterfaceType
 ;
 
-/* UNUSED:
 ArrayType:
 	PrimitiveType Dims
 		{ $$ = java_array_type ($1, $2); }
 |	Name Dims
 		{ $$ = java_array_type (java_type_from_name ($1), $2); }
 ;
-*/
 
 Name:
 	IDENTIFIER
@@ -697,7 +708,7 @@ parse_number (p, len, parsed_float, putithere)
 	num = sscanf (p, "%lg%c", (double *) &putithere->typed_val_float.dval, &c);
       else
 	{
-#ifdef PRINTF_HAS_LONG_DOUBLE
+#ifdef SCANF_HAS_LONG_DOUBLE
 	  num = sscanf (p, "%Lg%c", &putithere->typed_val_float.dval, &c);
 #else
 	  /* Scan it into a double, then assign it to the long double.
@@ -723,7 +734,7 @@ parse_number (p, len, parsed_float, putithere)
 	return ERROR;
 
       return FLOATING_POINT_LITERAL;
-}
+    }
 
   /* Handle base-switching prefixes 0x, 0t, 0d, 0 */
   if (p[0] == '0')
@@ -1080,13 +1091,13 @@ yylex ()
        (c == '_' || c == '$' || (c >= '0' && c <= '9')
 	|| (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '<');)
     {
-       if (c == '<')
-	 {
-	   int i = namelen;
-	   while (tokstart[++i] && tokstart[i] != '>');
-	   if (tokstart[i] == '>')
-	     namelen = i;
-	  }
+      if (c == '<')
+	{
+	  int i = namelen;
+	  while (tokstart[++i] && tokstart[i] != '>');
+	  if (tokstart[i] == '>')
+	    namelen = i;
+	}
        c = tokstart[++namelen];
      }
 
diff --git a/gdb/jv-lang.c b/gdb/jv-lang.c
index 0aec0024414..d7b0070319f 100644
--- a/gdb/jv-lang.c
+++ b/gdb/jv-lang.c
@@ -681,9 +681,16 @@ java_array_type (type, dims)
      struct type *type;
      int dims;
 {
-  if (dims == 0)
-    return type;
-  error ("array types not implemented");
+  struct type *range_type;
+
+  while (dims-- > 0)
+    {
+      range_type = create_range_type (NULL, builtin_type_int, 0, 0);
+
+      type = create_array_type (NULL, type, range_type);
+    }
+
+  return type;
 }
 
 /* Create a Java string in the inferior from a (Utf8) literal. */
diff --git a/gdb/language.c b/gdb/language.c
index 2a4a1b3ee97..47bf441de99 100644
--- a/gdb/language.c
+++ b/gdb/language.c
@@ -345,13 +345,16 @@ set_type_range()
   set_range_str();
 }
 
-/* Set current language to (enum language) LANG.  */
+/* Set current language to (enum language) LANG.  Returns previous language. */
 
-void
+enum language
 set_language(lang)
    enum language lang;
 {
   int i;
+  enum language prev_language;
+
+  prev_language = current_language->la_language;
 
   for (i = 0; i < languages_size; i++) {
     if (languages[i]->la_language == lang) {
@@ -361,6 +364,8 @@ set_language(lang)
       break;
     }
   }
+
+  return prev_language;
 }
 
 /* This page contains functions that update the global vars
diff --git a/gdb/language.h b/gdb/language.h
index 941943b7433..877238d39a6 100644
--- a/gdb/language.h
+++ b/gdb/language.h
@@ -245,7 +245,7 @@ extern enum language_mode
 extern void
 language_info PARAMS ((int));
 
-extern void
+extern enum language
 set_language PARAMS ((enum language));