summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormihaylov <mihaylov@epfl.ch>2004-02-23 18:24:32 +0000
committermihaylov <mihaylov@epfl.ch>2004-02-23 18:24:32 +0000
commitc46335ac1a363ff01dcdfa3b446244deb3ecc4e8 (patch)
tree0517c63648d04f6e0e6b21789f3ac0ca94de6901
parent8895d4c2835020787d05db10db276ca418cc9886 (diff)
downloadscala-c46335ac1a363ff01dcdfa3b446244deb3ecc4e8.tar.gz
scala-c46335ac1a363ff01dcdfa3b446244deb3ecc4e8.tar.bz2
scala-c46335ac1a363ff01dcdfa3b446244deb3ecc4e8.zip
- Factored out the ConstantType creation from A...
- Factored out the ConstantType creation from AttributeParser to JavaTypeFactory/Creator.
-rw-r--r--sources/scalac/symtab/classfile/AttributeParser.java49
-rw-r--r--sources/scalac/symtab/classfile/JavaTypeCreator.java54
-rw-r--r--sources/scalac/symtab/classfile/JavaTypeFactory.java2
3 files changed, 56 insertions, 49 deletions
diff --git a/sources/scalac/symtab/classfile/AttributeParser.java b/sources/scalac/symtab/classfile/AttributeParser.java
index 83bc52e94d..76972808d6 100644
--- a/sources/scalac/symtab/classfile/AttributeParser.java
+++ b/sources/scalac/symtab/classfile/AttributeParser.java
@@ -143,7 +143,7 @@ public class AttributeParser implements ClassfileConstants {
case CONSTANT_VALUE_ATTR:
Object constVal = pool.readPool(in.nextChar());
//System.out.println(sym.owner() + "." + sym + ": " + constVal + " of type " + constantType(type, constVal));
- sym.setFirstInfo(constantType(type, constVal));
+ sym.setFirstInfo(parser.make.constantType(type, constVal));
return;
case META_ATTR:
//System.out.println("parsing meta data for " + sym);
@@ -167,53 +167,6 @@ public class AttributeParser implements ClassfileConstants {
}
}
- /** return the constant type for the given constant.
- */
- Type constantType(Type base, Object value) {
- return Type.constantType(constantValue(base, value));
- }
- AConstant constantValue(Type base, Object value) {
- if (base.symbol() == parser.global.definitions.BOOLEAN_CLASS)
- return AConstant.BOOLEAN(((Number)value).intValue() != 0);
- if (base.symbol() == parser.global.definitions.BYTE_CLASS)
- return AConstant.BYTE(((Number)value).byteValue());
- if (base.symbol() == parser.global.definitions.SHORT_CLASS)
- return AConstant.SHORT(((Number)value).shortValue());
- if (base.symbol() == parser.global.definitions.CHAR_CLASS)
- return AConstant.CHAR((char)((Number)value).intValue());
- if (base.symbol() == parser.global.definitions.INT_CLASS)
- return AConstant.INT(((Number)value).intValue());
- if (base.symbol() == parser.global.definitions.LONG_CLASS)
- return AConstant.LONG(((Number)value).longValue());
- if (base.symbol() == parser.global.definitions.FLOAT_CLASS)
- return AConstant.FLOAT(((Number)value).floatValue());
- if (base.symbol() == parser.global.definitions.DOUBLE_CLASS)
- return AConstant.DOUBLE(((Number)value).doubleValue());
- if (base.symbol() == parser.global.definitions.JAVA_STRING_CLASS)
- return AConstant.STRING((String)value);
- throw Debug.abort("illegal value", value + " - " + base);
- }
-
- /** return the type of a given constant.
- */
- Type typeOfValue(Object value) {
- if (value instanceof Character)
- return parser.make.charType();
- else if (value instanceof Integer)
- return parser.make.intType();
- else if (value instanceof Long)
- return parser.make.longType();
- else if (value instanceof Float)
- return parser.make.floatType();
- else if (value instanceof Double)
- return parser.make.doubleType();
- else if (value instanceof String)
- return parser.global.definitions.JAVA_STRING_CLASS.typeConstructor();
- else if (value instanceof Boolean)
- return parser.make.booleanType();
- else
- throw new ApplicationError("unknown constant type");
- }
Scope tvars = new Scope();
diff --git a/sources/scalac/symtab/classfile/JavaTypeCreator.java b/sources/scalac/symtab/classfile/JavaTypeCreator.java
index 09f86d8af5..abab6f6f18 100644
--- a/sources/scalac/symtab/classfile/JavaTypeCreator.java
+++ b/sources/scalac/symtab/classfile/JavaTypeCreator.java
@@ -9,7 +9,9 @@
package scalac.symtab.classfile;
import ch.epfl.lamp.util.Position;
-import scalac.util.*;
+import scalac.atree.AConstant;
+import scalac.util.Debug;
+import scalac.util.Name;
import scalac.symtab.*;
import Type.*;
@@ -114,4 +116,54 @@ public class JavaTypeCreator implements JavaTypeFactory {
public Type packageType(Name packagename) {
return null;
}
+
+ /** return the constant type for the given constant.
+ */
+ public Type constantType(Type base, Object value) {
+ return Type.constantType(constantValue(base, value));
+ }
+
+ private AConstant constantValue(Type base, Object value) {
+ if (base.symbol() == definitions.BOOLEAN_CLASS)
+ return AConstant.BOOLEAN(((Number)value).intValue() != 0);
+ if (base.symbol() == definitions.BYTE_CLASS)
+ return AConstant.BYTE(((Number)value).byteValue());
+ if (base.symbol() == definitions.SHORT_CLASS)
+ return AConstant.SHORT(((Number)value).shortValue());
+ if (base.symbol() == definitions.CHAR_CLASS)
+ return AConstant.CHAR((char)((Number)value).intValue());
+ if (base.symbol() == definitions.INT_CLASS)
+ return AConstant.INT(((Number)value).intValue());
+ if (base.symbol() == definitions.LONG_CLASS)
+ return AConstant.LONG(((Number)value).longValue());
+ if (base.symbol() == definitions.FLOAT_CLASS)
+ return AConstant.FLOAT(((Number)value).floatValue());
+ if (base.symbol() == definitions.DOUBLE_CLASS)
+ return AConstant.DOUBLE(((Number)value).doubleValue());
+ if (base.symbol() == definitions.JAVA_STRING_CLASS)
+ return AConstant.STRING((String)value);
+ throw Debug.abort("illegal value", value + " - " + base);
+ }
+
+ /** return the type of a given constant.
+ */
+ public Type typeOfValue(Object value) {
+ if (value instanceof Character)
+ return charType();
+ else if (value instanceof Integer)
+ return intType();
+ else if (value instanceof Long)
+ return longType();
+ else if (value instanceof Float)
+ return floatType();
+ else if (value instanceof Double)
+ return doubleType();
+ else if (value instanceof String)
+ return definitions.JAVA_STRING_CLASS.typeConstructor();
+ else if (value instanceof Boolean)
+ return booleanType();
+ else
+ throw Debug.abort("unknown constant type", value.getClass());
+ }
+
}
diff --git a/sources/scalac/symtab/classfile/JavaTypeFactory.java b/sources/scalac/symtab/classfile/JavaTypeFactory.java
index ff1bea1727..667f8a3099 100644
--- a/sources/scalac/symtab/classfile/JavaTypeFactory.java
+++ b/sources/scalac/symtab/classfile/JavaTypeFactory.java
@@ -26,4 +26,6 @@ public interface JavaTypeFactory {
Type arrayType(Type elemtpe);
Type methodType(Type[] argtpes, Type restpe, Type[] thrown);
Type packageType(Name packagename);
+ Type constantType(Type base, Object value);
+ Type typeOfValue(Object value); // not in use, shall we remove it?
}