You are not logged in.

Dear visitor, welcome to Jabaco - Community. If this is your first visit here, please read the Help. It explains in detail how this page works. To use all features of this page, you should consider registering. Please use the registration form, to register here or read more information about the registration process. If you are already registered, please login here.

theuserbl

Intermediate

  • "theuserbl" started this thread

Posts: 436

Date of registration: Dec 20th 2008

  • Send private message

1

Friday, February 15th 2013, 12:28am

Class-File generation from a Jabaco-program

Only a test by myself for fun.

Jabaco Source

1
2
3
4
5
6
7
8
9
10
Public Sub main(ByJava args() As String)
  System.out.println("This is a little Jabaco-program")
  System.out.println("Counting to 10:")
  Dim i As Integer
  For i = 1 to 10
    System.out.println("Number " & i)
  Next i
  System.out.println("End")

End Sub


You can create such a program inside an Jabaco-program:

Jabaco Source

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
Import com#sun#xml#internal#ws#org#objectweb#asm#ClassWriter
Import com#sun#xml#internal#ws#org#objectweb#asm#FieldVisitor
Import com#sun#xml#internal#ws#org#objectweb#asm#MethodVisitor
Import com#sun#xml#internal#ws#org#objectweb#asm#AnnotationVisitor
Import com#sun#xml#internal#ws#org#objectweb#asm#Label

Implements com#sun#xml#internal#ws#org#objectweb#asm#Opcodes

Public Sub main(ByJava args() As String)
   Dim myArgs() As String
   myArgs = args
   ' [Your Source]

   Dim fos As New java#io#FileOutputStream(New java#io#File(HomeDir() & System.getProperty("file.separator") & "Program.class"))
   fos.write(dump())
  
   
End Sub

Public Function dump() AS Byte()
  Dim cw As New ClassWriter(0)
  Dim fv As FieldVisitor
  Dim mv As MethodVisitor
  Dim av0 As AnnotationVisitor

  Dim z() As String

  cw.visit(V1_6, ACC_PUBLIC + ACC_SUPER, "Program", Nothing, "java/lang/Object", z)
  
  mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", Nothing, z)
  mv.visitCode()
  mv.visitVarInsn(ALOAD, 0)
  mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V")
  mv.visitInsn(RETURN)
  mv.visitMaxs(1, 1)
  mv.visitEnd()
 
  mv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "main", "([Ljava/lang/String;)V", Nothing, z)
  mv.visitCode()
  mv.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;")
  mv.visitLdcInsn("This is a little Jabaco-program")
  mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V")
  mv.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;")
  mv.visitLdcInsn("Counting to 10:")
  mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V")
  mv.visitInsn(ICONST_1)
  mv.visitVarInsn(ISTORE, 1)
  Dim l0 As New com#sun#xml#internal#ws#org#objectweb#asm#Label
  mv.visitLabel(l0)
  Dim o1(0) As Object
  o1(0) = Opcodes.INTEGER
  Dim o2() AS Object
  mv.visitFrame(Opcodes.F_APPEND,1, o1, 0, o2)
  mv.visitVarInsn(ILOAD, 1)
  mv.visitIntInsn(BIPUSH, 10)
  Dim l1 As New com#sun#xml#internal#ws#org#objectweb#asm#Label
  mv.visitJumpInsn(IF_ICMPGT, l1)
  mv.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;")
  mv.visitTypeInsn(Opcodes.NEW, "java/lang/StringBuilder")
  mv.visitInsn(DUP)
  mv.visitMethodInsn(INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "()V")
  mv.visitLdcInsn("Number ")
  mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;")
  mv.visitVarInsn(ILOAD, 1)
  mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(I)Ljava/lang/StringBuilder;")
  mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;")
  mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V")
  mv.visitIincInsn(1, 1)
  mv.visitJumpInsn(Opcodes.GOTO, l0)
  mv.visitLabel(l1)
  mv.visitFrame(Opcodes.F_CHOP,1, o2, 0, o2)
  mv.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;")
  mv.visitLdcInsn("End")
  mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V")
  mv.visitInsn(RETURN)
  mv.visitMaxs(3, 2)
  mv.visitEnd()

  cw.visitEnd()

  dump = cw.toByteArray()

End Function


If you start the second program, it creates in your home-directory a file called "Program.class". And if you start this program, it do the same like if you would start the first program.

Only a test by myself, if it is possible to create something like this in Jabaco.

Greatings
theuserbl

Rate this thread
WoltLab Burning Board