Skip to content
This repository was archived by the owner on Aug 31, 2021. It is now read-only.

Commit adbc211

Browse files
committed
[[ LC Compile Java FFI ]] Add constructor binding glue code
We need to be able to use the general type bridging system to call constructors with parameters easily, so this patch adds glue code for constructors which adds a foreign binding string of the form "java:qualified.class.name>new(paramString)" Correspondingly, glue code is generated to call constructors with the appropriate types and return the constructed java object.
1 parent b3b6903 commit adbc211

1 file changed

Lines changed: 52 additions & 8 deletions

File tree

toolchain/lc-compile-ffi-java/src/generate.g

Lines changed: 52 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -98,14 +98,32 @@
9898
(|
9999
where(Alias -> id(AliasName))
100100
ResolveIdName(AliasName -> MethodName)
101+
ResolveIdName(Id -> RealName)
101102
||
102103
ResolveIdName(Id -> MethodName)
104+
ResolveIdName(Id -> RealName)
103105
|)
104106

105107
OutputWrite("foreign handler ")
106108
OutputForeignHandlerName(Type, MethodName)
107109
OutputForeignSignatureWithParameter(Type, Signature)
108-
OutputBindingString(Type, MethodName, Signature)
110+
OutputBindingString(Type, RealName, Signature)
111+
OutputWrite("\n")
112+
113+
'rule' GenerateForeignHandlerOfClass(Type, constructor(_, _, Id, Signature, Alias)):
114+
(|
115+
where(Alias -> id(AliasName))
116+
ResolveIdName(AliasName -> MethodName)
117+
ResolveIdName(Id -> RealName)
118+
||
119+
ResolveIdName(Id -> MethodName)
120+
ResolveIdName(Id -> RealName)
121+
|)
122+
123+
OutputWrite("foreign handler ")
124+
OutputForeignHandlerName(Type, MethodName)
125+
OutputForeignSignatureWithReturnType(Type, Signature)
126+
OutputConstructorBindingString(Type, RealName, Signature)
109127
OutputWrite("\n")
110128

111129
'rule' GenerateForeignHandlerOfClass(Type, Definition):
@@ -136,6 +154,14 @@
136154
OutputWrite(")")
137155
GenerateJavaReturns(ReturnType)
138156

157+
'action' OutputForeignSignatureWithReturnType(TYPE, SIGNATURE)
158+
159+
'rule' OutputForeignSignatureWithReturnType(ReturnType, signature(Params, nil)):
160+
OutputWrite("(")
161+
GenerateJavaParams(Params)
162+
OutputWrite(")")
163+
GenerateJavaReturns(ReturnType)
164+
139165
'action' OutputBindingString(TYPE, NAME, SIGNATURE)
140166

141167
'rule' OutputBindingString(ClassType, MethodName, Signature):
@@ -145,6 +171,15 @@
145171
OutputJavaSignature(Signature)
146172
OutputWrite("\"")
147173

174+
'action' OutputConstructorBindingString(TYPE, NAME, SIGNATURE)
175+
176+
'rule' OutputConstructorBindingString(ClassType, MethodName, Signature):
177+
TypeToQualifiedName(ClassType -> QualifiedClass)
178+
OutputWriteI(" binds to \"java:", QualifiedClass, ">")
179+
OutputWrite("new")
180+
OutputJavaSignature(Signature)
181+
OutputWrite("\"")
182+
148183
'action' OutputJavaSignature(SIGNATURE)
149184

150185
'rule' OutputJavaSignature(signature(Params, ReturnType))
@@ -233,20 +268,29 @@
233268
||
234269
ResolveIdName(Id -> Name)
235270
|)
236-
TypeToQualifiedName(ObjType -> ClassName)
237-
OutputWriteI("public handler ", Name, "_Constructor(in pArgs as List)")
271+
OutputWriteI("public handler ", Name, "_Constructor")
272+
GenerateSignatureWithReturnType(ObjType, Signature)
238273
OutputWrite("\n")
239-
OutputWrite("\tvariable tObject as JObject\n")
240-
OutputWrite("\tunsafe\n")
241-
OutputWriteI("\t\tput GetObject(\"", ClassName, "\", pArgs) into tObject\n")
242-
OutputWrite("\tend unsafe\n")
243-
OutputWrite("\treturn tObject\n")
274+
275+
OutputCallForeignConstructor(ObjType, Name, Signature)
244276
OutputWrite("end handler")
245277
OutputWrite("\n\n")
246278

247279
'rule' GenerateClassDefinitions(ObjType, nil):
248280
-- do nothing
249281

282+
'action' OutputCallForeignConstructor(TYPE, NAME, SIGNATURE)
283+
284+
'rule' OutputCallForeignConstructor(ObjType, Name, signature(Params, nil))
285+
OutputConvertToForeignParams(Params)
286+
OutputWrite("\tunsafe\n\t\t")
287+
OutputWrite("return ")
288+
OutputForeignHandlerName(ObjType, Name)
289+
OutputWrite("(")
290+
OutputForeignCallParams(Params)
291+
OutputWrite(")\n")
292+
OutputWrite("\tend unsafe\n")
293+
250294
'action' OutputCallForeignHandler(TYPE, NAME, SIGNATURE)
251295

252296
'rule' OutputCallForeignHandler(ObjType, Name, signature(Params, ReturnType))

0 commit comments

Comments
 (0)