@@ -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 {
0 commit comments