Skip to content

Commit e545d9b

Browse files
committed
Change Mirror API to explore SOMns object model and metaclass system
Signed-off-by: Stefan Marr <git@stefan-marr.de>
1 parent bb114e5 commit e545d9b

File tree

3 files changed

+64
-2
lines changed

3 files changed

+64
-2
lines changed

core-lib/Mirrors.som

+3-2
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,11 @@ class Mirrors usingVmMirror: vmMirror = Value (
2828
(*:TODO: Not happy with the naming of the mirror methods yet,
2929
they are not unambiguous, about whether they apply to the object,
3030
or to the object class *)
31-
public name = ( ^ vmMirror mirrorAClassesName: obj )
31+
public name = ( ^ vmMirror mirrorClassName: obj )
3232
public classObject= ( ^ vmMirror objClass: obj )
3333
public classMirror= ( ^ ClassMirror reflecting: classObject )
34-
public superclass = ( ^ vmMirror mirrorSuperclass: obj )
34+
public superclass = ( ^ vmMirror mirrorSuperclass: classObject )
35+
public superclassName = ( ^ vmMirror mirrorAClassesName: (vmMirror mirrorSuperclass: classObject) )
3536
public slots = ( ^ vmMirror mirrorSlots: obj )
3637

3738
public classDefinition = (

core-lib/ObjectModel.som

+60
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
class ObjectModel usingPlatform: platform = Value (
2+
| private ObjectMirror = platform mirrors ObjectMirror.
3+
private ClassMirror = platform mirrors ClassMirror.
4+
private Thing = platform kernel Thing. |
5+
)(
6+
public class Snake = ()()
7+
8+
private printInstanceAndSuperclassOf: classMirror = (
9+
classMirror name print. ' is instance of ' print.
10+
classMirror classMirror name println.
11+
classMirror name print. ' is subclass of ' print.
12+
classMirror superclassName println.
13+
)
14+
15+
public main: args = (
16+
| snake snakeMirror obj objMirror thing thingMirror |
17+
snake := Snake new.
18+
snakeMirror := (ObjectMirror reflecting: snake).
19+
'snake is instance of ' print.
20+
snakeMirror className println.
21+
22+
printInstanceAndSuperclassOf: snakeMirror classMirror.
23+
printInstanceAndSuperclassOf: snakeMirror classMirror classMirror.
24+
printInstanceAndSuperclassOf: snakeMirror classMirror classMirror classMirror.
25+
printInstanceAndSuperclassOf: snakeMirror classMirror classMirror classMirror classMirror.
26+
printInstanceAndSuperclassOf: snakeMirror classMirror classMirror classMirror classMirror classMirror.
27+
28+
'' println. '' println.
29+
'Superclass hierarchy:' println.
30+
'' println.
31+
32+
obj := Object new.
33+
objMirror := (ObjectMirror reflecting: obj).
34+
'obj is instance of ' print.
35+
objMirror className println.
36+
37+
printInstanceAndSuperclassOf: objMirror classMirror.
38+
printInstanceAndSuperclassOf: objMirror classMirror classMirror.
39+
printInstanceAndSuperclassOf: objMirror classMirror classMirror classMirror.
40+
printInstanceAndSuperclassOf: objMirror classMirror classMirror classMirror classMirror.
41+
printInstanceAndSuperclassOf: objMirror classMirror classMirror classMirror classMirror classMirror.
42+
43+
'' println. '' println.
44+
'In SOMns there is still Thing:' println.
45+
'' println.
46+
47+
thing := Thing new.
48+
thingMirror := (ObjectMirror reflecting: thing).
49+
'thing is instance of ' print.
50+
thingMirror className println.
51+
52+
printInstanceAndSuperclassOf: thingMirror classMirror.
53+
printInstanceAndSuperclassOf: thingMirror classMirror classMirror.
54+
printInstanceAndSuperclassOf: thingMirror classMirror classMirror classMirror.
55+
printInstanceAndSuperclassOf: thingMirror classMirror classMirror classMirror classMirror.
56+
printInstanceAndSuperclassOf: thingMirror classMirror classMirror classMirror classMirror classMirror.
57+
58+
^ 0
59+
)
60+
)

src/som/primitives/ClassPrims.java

+1
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ public final SAbstractObject doSClass(final Object receiver) {
3838
}
3939

4040
@GenerateNodeFactory
41+
@Primitive(primitive = "mirrorSuperclass:")
4142
public abstract static class SuperClassPrim extends UnaryExpressionNode {
4243
public SuperClassPrim(final boolean eagWrap, final SourceSection source) { super(eagWrap, source); }
4344

0 commit comments

Comments
 (0)