summaryrefslogtreecommitdiff
path: root/sources/scalac/backend
diff options
context:
space:
mode:
authormihaylov <mihaylov@epfl.ch>2003-11-10 11:41:04 +0000
committermihaylov <mihaylov@epfl.ch>2003-11-10 11:41:04 +0000
commit8d29db9496fa9f9c9b151bfff2cfd4630b2ebbcd (patch)
tree809a73a8fc7c061e3ff91612633444ec0627a1f6 /sources/scalac/backend
parentc38b0a7fd30ba1ec03c27d66f9dc685abfbc5820 (diff)
downloadscala-8d29db9496fa9f9c9b151bfff2cfd4630b2ebbcd.tar.gz
scala-8d29db9496fa9f9c9b151bfff2cfd4630b2ebbcd.tar.bz2
scala-8d29db9496fa9f9c9b151bfff2cfd4630b2ebbcd.zip
- fixed handling of object "main" function
- do not generate global entrypoint function if there isn't suitable "main" function
Diffstat (limited to 'sources/scalac/backend')
-rw-r--r--sources/scalac/backend/msil/GenMSIL.java67
1 files changed, 30 insertions, 37 deletions
diff --git a/sources/scalac/backend/msil/GenMSIL.java b/sources/scalac/backend/msil/GenMSIL.java
index 1cc2102a6a..37b44233e5 100644
--- a/sources/scalac/backend/msil/GenMSIL.java
+++ b/sources/scalac/backend/msil/GenMSIL.java
@@ -89,24 +89,22 @@ public final class GenMSIL {
items = new ItemFactory(this);
currentPackage = defs.ROOT_CLASS; /// ???
- //scalaModule = getPackage("scala", false);
}
/** Generate .NET assembly */
- ModuleBuilder getPackage(String name, boolean isRealAssembly) {
+ ModuleBuilder getPackage(String name) {
AssemblyBuilder assem = (AssemblyBuilder) assemblies.get(name);
if (assem == null) {
AssemblyName an = new AssemblyName();
an.Name = name;
assem = AssemblyBuilder.DefineDynamicAssembly(an);
- if (isRealAssembly)
- assemblies.put(name, assem);
}
ModuleBuilder module = (ModuleBuilder) assem.GetModule(name);
if (module == null) {
module = assem.DefineDynamicModule(name, name + ".dll");
}
+ assemblies.put(name, assem);
return module;
}
@@ -115,21 +113,25 @@ public final class GenMSIL {
*/
public void initGen() {
tc.init();
- currModule = getPackage("prog", true);
- //main = (MethodBuilder) currModule.GetMethod("Main", Type.EmptyTypes);
- //if (main == null) {
- main = currModule.DefineGlobalMethod
- ("Main", MethodAttributes.Public | MethodAttributes.Static,
- tc.VOID,
- new Type[] {tc.STRING_ARRAY} );
- main.DefineParameter(0, 0, "args");
- //}
+ currModule = getPackage("prog");
}
public void finalizeGen() {
+ if (mainObjectField != null && mainMethod != null) {
+ MethodBuilder main = currModule.DefineGlobalMethod
+ ("Main", MethodAttributes.Public | MethodAttributes.Static,
+ tc.VOID, new Type[] {tc.STRING_ARRAY} );
+ main.DefineParameter(0, 0, "args");
+ ((AssemblyBuilder)currModule.Assembly).SetEntryPoint(main);
+ code = main.GetILGenerator();
+ code.Emit(OpCodes.Ldsfld, mainObjectField);
+ code.Emit(OpCodes.Ldarg_0);
+ code.Emit(OpCodes.Callvirt, mainMethod);
+ if (!returnsVoid(mainMethod))
+ code.Emit(OpCodes.Pop);
+ code.Emit(OpCodes.Ret);
+ }
tc.createTypes();
- main.GetILGenerator().Emit(OpCodes.Ret);
- ((AssemblyBuilder)currModule.Assembly).SetEntryPoint(main);
try {
Iterator iter = assemblies.values().iterator();
while (iter.hasNext()) {
@@ -146,32 +148,24 @@ public final class GenMSIL {
}
}
- MethodBuilder main;
- final Map mains = new HashMap();
+ FieldInfo mainObjectField = null;
+ MethodInfo mainMethod = null;
void checkMain(MethodBase method) {
//log("checking method: " + method);
if ( ! currentClass.isModuleClass() )
return;
-
+ if (method.DeclaringType.DeclaringType != null)
+ return;
if (method.IsConstructor || method.IsAbstract ||
!method.Name.equals("main"))
return;
ParameterInfo[] params = method.GetParameters();
- if (params.length != 1)
- return;
- if (params[0].ParameterType != tc.STRING_ARRAY)
+ if (params.length != 1 || params[0].ParameterType != tc.STRING_ARRAY)
return;
-
- //log("'main' method found: " + method);
- mains.put(currentClass, method);
- ILGenerator code = main.GetILGenerator();
- code.Emit(OpCodes.Ldsfld, tc.getModuleField(currentClass));
- code.Emit(OpCodes.Ldarg_0);
- code.Emit(OpCodes.Callvirt, (MethodInfo)method);
- if (!returnsVoid(main))
- code.Emit(OpCodes.Pop);
+ mainObjectField = tc.getModuleField(currentClass);
+ mainMethod = (MethodInfo) method;
}
@@ -317,7 +311,8 @@ public final class GenMSIL {
ConstructorInfo ctor = (ConstructorInfo) method;
code = ((ConstructorBuilder)ctor).GetILGenerator();
FieldInfo moduleField = tc.getModuleField(currentClass);
- if (moduleField != null) {
+ if (moduleField != null
+ && moduleField.DeclaringType.DeclaringType == null) {
// log("genDef: initializing " + moduleField +
// " for class " + method.DeclaringType);
@@ -1460,9 +1455,12 @@ public final class GenMSIL {
case I2:
case I4:
case CHAR:
- int i = (type == MSILType.CHAR) ?
+ int i = (obj instanceof Character) ?
(int)((Character) obj).charValue() :
((Number)obj).intValue();
+// int i = (type == MSILType.CHAR) ?
+// (int)((Character) obj).charValue() :
+// ((Number)obj).intValue();
switch (i) {
case -1:code.Emit(OpCodes.Ldc_I4_M1); break;
case 0: code.Emit(OpCodes.Ldc_I4_0); break;
@@ -1825,11 +1823,6 @@ public final class GenMSIL {
/**
*/
void logErr(String message) {
- if (code != null) {
- MethodBase method = code.owner;
- System.err.print("Processing " + method.DeclaringType.FullName +
- "::" + method.Name + " -> ");
- }
System.err.println(message);
throw new ApplicationError();
//log(1, message);