summaryrefslogtreecommitdiff
path: root/sources/scalac
diff options
context:
space:
mode:
authorschinz <schinz@epfl.ch>2003-03-13 14:10:09 +0000
committerschinz <schinz@epfl.ch>2003-03-13 14:10:09 +0000
commit8e1ff11b1c0bc2750a56d06a8a0bf06bc9b9a46a (patch)
tree4d5285ff0b30479872bf9dac7d03bddd8deac64a /sources/scalac
parent1faf3fbd77635630cb5921c4392389284c52cd93 (diff)
downloadscala-8e1ff11b1c0bc2750a56d06a8a0bf06bc9b9a46a.tar.gz
scala-8e1ff11b1c0bc2750a56d06a8a0bf06bc9b9a46a.tar.bz2
scala-8e1ff11b1c0bc2750a56d06a8a0bf06bc9b9a46a.zip
- bug fix: initialise module instance field as ...
- bug fix: initialise module instance field as soon as possible, i.e. in the *instance* constructor and not in the *class* constructor anymore, to enable "early use" of the module
Diffstat (limited to 'sources/scalac')
-rw-r--r--sources/scalac/backend/jvm/GenJVM.java45
1 files changed, 26 insertions, 19 deletions
diff --git a/sources/scalac/backend/jvm/GenJVM.java b/sources/scalac/backend/jvm/GenJVM.java
index 92fb946206..156e36d83f 100644
--- a/sources/scalac/backend/jvm/GenJVM.java
+++ b/sources/scalac/backend/jvm/GenJVM.java
@@ -103,6 +103,7 @@ class JVMGenerator {
protected MethodGen currMethod = null;
protected InstructionList currIL = null;
protected Map currLocals = null;
+ protected boolean isModuleClass = false;
static class InstrContext {
public case Empty;
@@ -155,14 +156,17 @@ class JVMGenerator {
case ClassDef(_, _, _, _, _, Tree.Template impl) : {
Tree.ClassDef classDef = (Tree.ClassDef)tree;
+ boolean oldIsModuleClass = isModuleClass;
+ isModuleClass = Modifiers.Helper.isModClass(sym.flags);
enterClass(sym);
addValueClassMembers(classDef);
- if (Modifiers.Helper.isModClass(sym.flags))
+ if (isModuleClass)
addModuleInstanceField();
gen(impl);
leaveClass(sym);
+ isModuleClass = oldIsModuleClass;
} break;
case Template(_, Tree[] body):
@@ -312,18 +316,27 @@ class JVMGenerator {
} else {
int methodIndex =
currPool.addMethodref(className, methodName, methodSig);
- boolean isSpecial;
- if (funSym.name == CONSTRUCTOR_NAME)
- isSpecial = true;
- else {
- switch (fun) {
- case Select(Super(_), _): isSpecial = true; break;
- default: isSpecial = false; break;
- }
+ boolean isConstrCall = (funSym.name == CONSTRUCTOR_NAME);
+ boolean isSuperCall;
+ switch (fun) {
+ case Select(Super(_), _): isSuperCall = true; break;
+ default: isSuperCall = false; break;
}
- if (isSpecial)
+
+ if (isConstrCall || isSuperCall) {
currIL.append(new INVOKESPECIAL(methodIndex));
- else if (isStatic)
+ if (isConstrCall && isSuperCall && isModuleClass) {
+ // Initialise module instance field ASAP
+ String currClassSig =
+ new ObjectType(currClassName).getSignature();
+ int fieldRef =
+ currPool.addFieldref(currClassName,
+ MODULE_INSTANCE_FIELD_NAME,
+ currClassSig);
+ currIL.append(ic.THIS);
+ currIL.append(new PUTSTATIC(fieldRef));
+ }
+ } else if (isStatic)
currIL.append(new INVOKESTATIC(methodIndex));
else
currIL.append(new INVOKEVIRTUAL(methodIndex));
@@ -520,12 +533,11 @@ class JVMGenerator {
// Add field containing module instance, and code to
// initialize it, to current class.
protected void addModuleInstanceField() {
- Type currClassType = new ObjectType(currClassName);
FieldGen instanceField =
new FieldGen(cst.ACC_PUBLIC
| cst.ACC_FINAL
| cst.ACC_STATIC,
- currClassType,
+ new ObjectType(currClassName),
MODULE_INSTANCE_FIELD_NAME,
currPool);
currClass.addField(instanceField.getField());
@@ -535,14 +547,9 @@ class JVMGenerator {
int constrRef = currPool.addMethodref(currClassName,
CONSTRUCTOR_STRING,
VOID_NO_ARGS_SIG);
- int fieldRef = currPool.addFieldref(currClassName,
- MODULE_INSTANCE_FIELD_NAME,
- currClassType.getSignature());
initIL.append(new NEW(currPool.addClass(currClassName)));
- initIL.append(ic.DUP);
initIL.append(new INVOKESPECIAL(constrRef));
- initIL.append(new PUTSTATIC(fieldRef));
initIL.append(ic.RETURN);
MethodGen initMethod =
@@ -1204,7 +1211,7 @@ class JVMGenerator {
protected HashSet seenClasses = new HashSet();
protected void leaveClass(Symbol cSym) {
- if (Modifiers.Helper.isModClass(cSym.flags)) {
+ if (isModuleClass) {
if (!seenClasses.contains(cSym.fullName()))
dumpModuleMainClass(currClass);
} else