Skip to content

Commit 884ab58

Browse files
committed
JACOBIN-881 begin on resolution of field handles in method handle processing
1 parent 492ef49 commit 884ab58

3 files changed

Lines changed: 38 additions & 16 deletions

File tree

src/classloader/mhResolution.go

Lines changed: 34 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -99,19 +99,38 @@ func resolveFieldHandle(cp *CPool, refIndex int, isStatic bool, isSetter bool, f
9999

100100
// 2. Get java.lang.Class object for the defining class.
101101
// getClassObj expects a descriptor, and className is an internal name (e.g. "java/lang/Object").
102-
defClassObj, err := getClassObj("L"+className+";", fr)
102+
defClassObj, err := getClassObj("L" + className + ";")
103103
if err != nil {
104104
return nil, fmt.Errorf("resolveFieldHandle: could not get Class object for %s: %w", className, err)
105105
}
106106

107-
// 3. Get java.lang.Class object for the field's type. fieldType is already a descriptor.
108-
fieldTypeObj, err := getClassObj(fieldType, fr)
109-
if err != nil {
110-
return nil, fmt.Errorf("resolveFieldHandle: could not get Class object for field type %s: %w", fieldType, err)
107+
// 3A. Get java.lang.Class object for the field's type. fieldType is already a descriptor.
108+
fieldTypeObj, err := getClassObj(fieldType)
109+
if err != nil { // in case the class has not been loaded, try to load it
110+
err = LoadClassFromNameOnly(className)
111+
if err != nil {
112+
return nil, fmt.Errorf("resolveFieldHandle: could not get Class object %s for field type %s",
113+
className, fieldType)
114+
} else { // check once again now that we know the class is loaded
115+
fieldTypeObj, err = getClassObj(fieldType)
116+
if err != nil {
117+
return nil, fmt.Errorf("resolveFieldHandle: could not get Class object %s for field type %s",
118+
className, fieldType)
119+
}
120+
}
121+
}
122+
123+
// 3B. Validate the field type
124+
if isStatic {
125+
value := statics.GetStaticValue(className, fieldName)
126+
if _, ok := value.(error); ok {
127+
return nil, fmt.Errorf("resolveFieldHandle could not find a static field: %s",
128+
className+fieldName)
129+
}
111130
}
112131

113132
// 4. Get java.lang.Class object for the caller class (for access checks).
114-
callerClassObj, err := getClassObj("L"+fr.ClName+";", fr)
133+
callerClassObj, err := getClassObj("L" + fr.ClName + ";")
115134
if err != nil {
116135
return nil, fmt.Errorf("resolveFieldHandle: could not get Class object for caller %s: %w", fr.ClName, err)
117136
}
@@ -135,9 +154,12 @@ func resolveFieldHandle(cp *CPool, refIndex int, isStatic bool, isSetter bool, f
135154
gfuncName := "jacobin/internal/VM.resolveFieldHandle(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/Class;ILjava/lang/Class;)Ljava/lang/invoke/MethodHandle;"
136155
result := globals.GetGlobalRef().FuncInvokeGFunction(gfuncName, params)
137156

138-
if result == nil { // TODO: Or check for error block
139-
return nil, fmt.Errorf("resolveFieldHandle: gfunction call to create MethodHandle failed for field %s.%s", className, fieldName)
140-
}
157+
// if result == nil {
158+
// return nil, fmt.Errorf("resolveFieldHandle: gfunction call to create MethodHandle failed for field %s.%s", className, fieldName)
159+
// }
160+
// if errBlk, ok := result.(*ghelpers.GErrBlk); ok {
161+
// return nil, fmt.Errorf("resolveFieldHandle: gfunction error: %s", errBlk.ErrMsg)
162+
// }
141163

142164
return result.(*object.Object), nil
143165
}
@@ -258,7 +280,7 @@ func resolveMethodHandleEntry(cp *CPool, refIndex int, isStatic bool, isSpecial
258280
}
259281

260282
// 2. Get java.lang.Class object for the defining class.
261-
defClassObj, err := getClassObj("L"+className+";", fr)
283+
defClassObj, err := getClassObj("L" + className + ";")
262284
if err != nil {
263285
return nil, fmt.Errorf("resolveMethodHandleEntry: could not get Class object for %s: %w", className, err)
264286
}
@@ -270,7 +292,7 @@ func resolveMethodHandleEntry(cp *CPool, refIndex int, isStatic bool, isSpecial
270292
}
271293

272294
// 4. Get java.lang.Class object for the caller class (for access checks).
273-
callerClassObj, err := getClassObj("L"+fr.ClName+";", fr)
295+
callerClassObj, err := getClassObj("L" + fr.ClName + ";")
274296
if err != nil {
275297
return nil, fmt.Errorf("resolveMethodHandleEntry: could not get Class object for caller %s: %w", fr.ClName, err)
276298
}
@@ -421,7 +443,7 @@ func getMethodTypeObject(descriptor string, fr *frames.Frame) (*object.Object, e
421443
// getClassObj gets a java.lang.Class object for a given class name or descriptor.
422444
// It handles primitive types, array types, and object types by calling the equivalent
423445
// of Class.forName() via a gfunction.
424-
func getClassObj(descriptor string, fr *frames.Frame) (*object.Object, error) {
446+
func getClassObj(descriptor string) (*object.Object, error) {
425447
// Check for primitive types (single-character descriptors). The VM pre-loads
426448
// Class objects for primitive types (e.g., Integer.TYPE).
427449
if len(descriptor) == 1 {

src/config/buildno.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,4 @@
88

99
package config
1010

11-
var BuildNo = 4468
11+
var BuildNo = 4471

src/gfunction/javaLang/javaLangInvokeMethodHandle.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,9 +79,9 @@ func createRawMethodHandleObject() *object.Object {
7979
return mho
8080
}
8181

82-
// func createMethodHandleObject(classObj, methName, methType *object.Object,
83-
//
84-
// refKind int64, callerClass *object.Object) *object.Object {
82+
// func createMethodHandleObject accepts
83+
// for a method: classObj, methName, methType *object.Object, refKind int64, callerClass *object.Object)
84+
// for a field: classObj, fieldName, fieldType *object.Object, refKind int64, callerClass *object.Object)
8585
func createMethodHandleObject(params []interface{}) interface{} {
8686
if params == nil {
8787
errMsg := fmt.Sprintf("mhType(): Invalid params array passed in")

0 commit comments

Comments
 (0)