Skip to content

Commit 103db83

Browse files
committed
taught compiler to perform instance calls and fixed some things
1 parent c8114b3 commit 103db83

5 files changed

Lines changed: 39 additions & 5 deletions

File tree

ngc/ClrGenerator.fs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,3 +86,22 @@ type ClrCallGenerator(context : Context, typeBuilder : TypeBuilder, clrType : Ty
8686
let arg_types = args_seq.ReturnTypes()
8787
let clrMethod = nearestOverload clrType methodName arg_types
8888
[(Option.get clrMethod).ReturnType]
89+
90+
type InstanceCallGenerator(context : Context, typeBuilder : TypeBuilder, instance : SExp, methodName : string, arguments : SExp list, gf : IGeneratorFactory) =
91+
interface IGenerator with
92+
member this.Generate ilGen =
93+
let inst_gen = gf.MakeGenerator context instance
94+
let args_gen = gf.MakeSequence context arguments
95+
let methodInfo = nearestOverload (inst_gen.ReturnTypes() |> List.head) methodName (args_gen.ReturnTypes())
96+
if Option.isSome methodInfo then
97+
inst_gen.Generate ilGen
98+
args_gen.Generate ilGen
99+
ilGen.Emit(OpCodes.Callvirt,Option.get methodInfo)
100+
else failwithf "No overload found for method %A with types %A" methodName (args_gen.ReturnTypes())
101+
member this.ReturnTypes () =
102+
let inst_gen = gf.MakeGenerator context instance
103+
let args_gen = gf.MakeSequence context arguments
104+
let methodInfo = nearestOverload (inst_gen.ReturnTypes() |> List.head) methodName (args_gen.ReturnTypes())
105+
if Option.isSome methodInfo then
106+
[(Option.get methodInfo).ReturnType]
107+
else failwithf "No overload found for method %A with types %A" methodName (args_gen.ReturnTypes())

ngc/FormGenerator.fs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ type SequenceGenerator(context:Context,typeBuilder:TypeBuilder,seq:SExp list, gf
6464
member private this.gen_seq (ilGen:ILGenerator,seq:SExp list) =
6565
match seq with
6666
| [] ->
67-
ilGen.Emit(OpCodes.Ldnull)
67+
()
6868
| [last] ->
6969
let gen = gf.MakeGenerator context last
7070
gen.Generate ilGen
@@ -247,8 +247,15 @@ type NewObjGenerator(context : Context, typeBuilder : TypeBuilder, typeName : st
247247
member this.Generate ilGen =
248248
let args_gen = gf.MakeSequence context arguments
249249
let argTypes = args_gen.ReturnTypes()
250-
let objType = context.types.[typeName]
250+
let objType =
251+
if typeName.StartsWith "System" then
252+
Type.GetType typeName
253+
else
254+
context.types.[typeName]
251255
let arg_types = args_gen.Generate ilGen
252256
ilGen.Emit(OpCodes.Newobj,objType.GetConstructor(Array.ofList argTypes))
253257
member this.ReturnTypes () =
254-
[context.types.[typeName]]
258+
if typeName.StartsWith "System" then
259+
[Type.GetType typeName]
260+
else
261+
[context.types.[typeName]]

ngc/GeneratorFactory.fs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ type GeneratorFactory(typeBldr:TypeBuilder) =
8282
new SimpleLogicGenerator(context,typeBldr,arg_a,arg_b,OpCodes.Clt,this) :> IGenerator
8383
| Atom (Symbol ">") :: arg_a :: arg_b :: [] ->
8484
new SimpleLogicGenerator(context,typeBldr,arg_a,arg_b,OpCodes.Cgt,this) :> IGenerator
85+
|Atom (Symbol "call") :: Atom (Symbol fname) :: instance :: args ->
86+
new InstanceCallGenerator(context, typeBldr, instance, fname, args, this) :> IGenerator
8587
| Atom (Symbol fname) :: args -> //generic funcall pattern
8688
let tryGetType typeName =
8789
try Some (context.types.[typeName]) with
@@ -104,7 +106,7 @@ type GeneratorFactory(typeBldr:TypeBuilder) =
104106
let methodName = callMatch.Groups.[2].Value
105107
new ClrCallGenerator(context, typeBldr, clrType, methodName, args, this) :> IGenerator
106108
else
107-
new FunCallGenerator(context,typeBldr,fname,args,this) :> IGenerator
109+
new FunCallGenerator(context,typeBldr,fname,args,this) :> IGenerator
108110
| _ -> failwithf "Form %A is not supported yet" list
109111

110112
member private this.makeSequenceGenerator(context: Context,seq:SExp list) =

ngc/ngc.fsproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
<WarningLevel>3</WarningLevel>
2424
<PlatformTarget>AnyCPU</PlatformTarget>
2525
<DocumentationFile>bin\Debug\ngc.XML</DocumentationFile>
26+
<StartArguments>..\tests\test.naggum</StartArguments>
2627
</PropertyGroup>
2728
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
2829
<DebugType>pdbonly</DebugType>

tests/test.naggum

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,9 @@
3232
(System.Console.Write "2+2=") (System.Console.WriteLine (+ 2 2))
3333
(System.Console.Write "2-2=") (System.Console.WriteLine (- 2 2))
3434
(System.Console.Write "2*3=") (System.Console.WriteLine (* 2 3))
35-
(System.Console.Write "2/2=") (System.Console.WriteLine (/ 2 2)))
35+
(System.Console.Write "2/2=") (System.Console.WriteLine (/ 2 2))
36+
37+
(System.Console.WriteLine "Instance calls:")
38+
(let ((test-obj (new System.Random)))
39+
(System.Console.Write "Random number:")
40+
(System.Console.WriteLine (call Next test-obj))))

0 commit comments

Comments
 (0)