-
Notifications
You must be signed in to change notification settings - Fork 3
/
Rosella.winxed
71 lines (63 loc) · 2.01 KB
/
Rosella.winxed
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
namespace Rosella
{
function call_parrot_method(var object, var method, var pos, var named)
{
if (method instanceof "String")
method = find_method(object, method);
return object.*method(pos:[flat], named:[flat,named]);
}
function build(var proto, var pos [slurpy], var named [slurpy, named])
{
var object;
if (proto instanceof 'P6protoobject') {
object = proto.new();
} else {
var obj_class = get_type_class(proto);
${ new object, obj_class };
}
var method;
try {
${ find_method method, object, "BUILD" };
} catch() {
method = null;
}
if (method != null) {
object.BUILD(pos:[flat], named:[flat,named]);
}
return object;
}
function get_type_name(var type)
{
if (type instanceof "String")
return type;
if (type instanceof "P6protoobject")
type = type.HOW().get_parrotclass(type.HOW()).get_namespace();
else if (type instanceof "P6metaclass")
type = type.get_parrotclass().get_namespace();
else if (type instanceof "Class")
type = type.get_namespace();
else if (type instanceof "Key")
${ get_namespace type, type };
if (type instanceof "NameSpace")
return join("::", type.get_name());
int is_array = 0;
${ does is_array, type, "array" };
if (is_array)
return join("::", type);
return string(type);
}
function get_type_class(var type)
{
if (type instanceof "P6metaclass")
return type.get_parrotclass(type);
if (type instanceof "P6protoobject")
return type.HOW().get_parrotclass(type);
if (type instanceof "Class")
return type;
if (type instanceof "String")
type = split("::", type);
var class_obj;
${ get_class class_obj, type };
return class_obj;
}
}