Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[WIP] Improve and complete Mirror API #105

Open
wants to merge 1 commit into
base: dev
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions core-lib/Mirrors.ns
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,11 @@ class Mirrors usingVmMirror: vmMirror = Value (
(*:TODO: Not happy with the naming of the mirror methods yet,
they are not unambiguous, about whether they apply to the object,
or to the object class *)
public name = ( ^ vmMirror mirrorAClassesName: obj )
public name = ( ^ vmMirror mirrorClassName: obj )
public classObject= ( ^ vmMirror objClass: obj )
public classMirror= ( ^ ClassMirror reflecting: classObject )
public superclass = ( ^ vmMirror mirrorSuperclass: obj )
public superclass = ( ^ vmMirror mirrorSuperclass: classObject )
public superclassName = ( ^ vmMirror mirrorAClassesName: (vmMirror mirrorSuperclass: classObject) )
public slots = ( ^ vmMirror mirrorSlots: obj )

public classDefinition = (
Expand Down
60 changes: 60 additions & 0 deletions core-lib/ObjectModel.som
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
class ObjectModel usingPlatform: platform = Value (
| private ObjectMirror = platform mirrors ObjectMirror.
private ClassMirror = platform mirrors ClassMirror.
private Thing = platform kernel Thing. |
)(
public class Snake = ()()

private printInstanceAndSuperclassOf: classMirror = (
classMirror name print. ' is instance of ' print.
classMirror classMirror name println.
classMirror name print. ' is subclass of ' print.
classMirror superclassName println.
)

public main: args = (
| snake snakeMirror obj objMirror thing thingMirror |
snake := Snake new.
snakeMirror := (ObjectMirror reflecting: snake).
'snake is instance of ' print.
snakeMirror className println.

printInstanceAndSuperclassOf: snakeMirror classMirror.
printInstanceAndSuperclassOf: snakeMirror classMirror classMirror.
printInstanceAndSuperclassOf: snakeMirror classMirror classMirror classMirror.
printInstanceAndSuperclassOf: snakeMirror classMirror classMirror classMirror classMirror.
printInstanceAndSuperclassOf: snakeMirror classMirror classMirror classMirror classMirror classMirror.

'' println. '' println.
'Superclass hierarchy:' println.
'' println.

obj := Object new.
objMirror := (ObjectMirror reflecting: obj).
'obj is instance of ' print.
objMirror className println.

printInstanceAndSuperclassOf: objMirror classMirror.
printInstanceAndSuperclassOf: objMirror classMirror classMirror.
printInstanceAndSuperclassOf: objMirror classMirror classMirror classMirror.
printInstanceAndSuperclassOf: objMirror classMirror classMirror classMirror classMirror.
printInstanceAndSuperclassOf: objMirror classMirror classMirror classMirror classMirror classMirror.

'' println. '' println.
'In SOMns there is still Thing:' println.
'' println.

thing := Thing new.
thingMirror := (ObjectMirror reflecting: thing).
'thing is instance of ' print.
thingMirror className println.

printInstanceAndSuperclassOf: thingMirror classMirror.
printInstanceAndSuperclassOf: thingMirror classMirror classMirror.
printInstanceAndSuperclassOf: thingMirror classMirror classMirror classMirror.
printInstanceAndSuperclassOf: thingMirror classMirror classMirror classMirror classMirror.
printInstanceAndSuperclassOf: thingMirror classMirror classMirror classMirror classMirror classMirror.

^ 0
)
)
1 change: 1 addition & 0 deletions src/som/primitives/ClassPrims.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ public final SAbstractObject doSClass(final Object receiver) {
}

@GenerateNodeFactory
@Primitive(primitive = "mirrorSuperclass:")
public abstract static class SuperClassPrim extends UnaryExpressionNode {
@Specialization
public final SAbstractObject doSClass(final SClass receiver) {
Expand Down