-
Notifications
You must be signed in to change notification settings - Fork 138
/
make_hello_pbc.pir
84 lines (68 loc) · 2.06 KB
/
make_hello_pbc.pir
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
84
#Copyright (C) 2009, Parrot Foundation.
# Sample creating of "Hello World" program using Packfile PMCs.
.sub 'main'
.local pmc pf, pfdir, pfbc, pfconst, oplib
# Hello World is something like
# .sub 'hello'
# say "Hello World"
# .end
# To generate PBC we need few bits
# First thing
# Packfile will be created with fresh directory
pf = new 'Packfile'
pfdir = pf.'get_directory'()
# We need some constants
pfconst = new 'PackfileConstantTable'
# We will need Sub PMC as well but will deal with it later.
# Add PackfileConstantTable into directory.
pfdir["CONSTANTS_hello.pir"] = pfconst
# Generate bytecode
pfbc = new 'PackfileBytecodeSegment'
.local pmc op
# Here is our function
op = new ['ResizablePMCArray']
op[0] = 'say_sc'
$I0 = pfconst.'get_or_create_constant'("Hello, World")
op[1] = $I0
push pfbc, op
# Empty FIA for handling returns from "hello"
$P0 = new 'FixedIntegerArray'
op = new ['ResizablePMCArray']
op[0] = 'set_returns_pc'
$I0 = pfconst.'get_or_create_constant'($P0)
op[1] = $I0
push pfbc, op
op = new ['ResizablePMCArray']
op[0] = 'returncc'
push pfbc, op
# Store bytecode
pfdir['BYTECODE_hello.pir'] = pfbc
# Now create Sub PMC using hash of values.
$P0 = new 'Hash'
$P0['start_offs'] = 0
$P0['end_offs'] = 5
$P0['name'] = 'hello'
$P0['subid'] = 'hello'
$P0['ns_entry_name']= 'hello'
$P0['method'] = ''
$P0['HLL_id'] = 0
$P0['vtable_index'] = -1 # It required to store sub in namespace
$P1 = new 'Sub', $P0
# and store it in PackfileConstantTable
push pfconst, $P1
# Now pack Packfile and save it
$S0 = pf
$P1 = new ['FileHandle']
$P1.'open'("generated_hello.pbc", "w")
$P1.'puts'($S0)
$P1.'close'()
# And check it!
load_bytecode 'generated_hello.pbc'
$P1 = find_sub_not_null 'hello'
$P1()
.end
# Local Variables:
# mode: pir
# fill-column: 100
# End:
# vim: expandtab shiftwidth=4 ft=pir: