forked from mbebenita/j2me.js
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathsignature.js
116 lines (105 loc) · 3.13 KB
/
signature.js
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
/* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* vim: set shiftwidth=4 tabstop=4 autoindent cindent expandtab: */
'use strict';
var Signature = (function() {
var TYPE = {
boolean: 'Z',
byte: 'B',
char: 'C',
double: 'D',
float: 'F',
int: 'I',
long: 'J',
object: 'L',
short: 'S',
void: 'V',
array: '[',
toString: function(s) {
for(var type in this) {
if (this[type] === s) {
return type;
}
}
return null;
}
};
function _parse(part) {
var res = [];
var slots = 0;
if (part != '') {
var isArray = false;
var pos = 0;
while (pos < part.length) {
switch(part[pos]) {
case TYPE.long:
case TYPE.double:
++slots;
// fall through
case TYPE.boolean:
case TYPE.byte:
case TYPE.char:
case TYPE.float:
case TYPE.int:
case TYPE.short:
res.push({ type: TYPE.toString(part[pos]), isArray: isArray });
isArray = false;
break;
case TYPE.object:
var className = '';
while (part[++pos] !== ';') {
className += part[pos];
}
res.push({ type: "object", isArray: isArray, className: className });
isArray = false;
break;
case TYPE.array:
isArray = true;
break;
}
pos++;
}
}
slots += res.length;
res.slots = slots;
return res;
}
function getINSlots(signature) {
var slots = 0;
var pos = 0;
while (pos < signature.length) {
switch (signature[pos]) {
case TYPE.long:
case TYPE.double:
slots += 2;
break;
case TYPE.boolean:
case TYPE.byte:
case TYPE.char:
case TYPE.float:
case TYPE.int:
case TYPE.short:
slots++;
break;
case TYPE.object:
pos = signature.indexOf(';', pos + 1);
slots++;
break;
case ')':
return slots;
}
pos++;
}
return slots;
}
return {
parse: function(s) {
var IN = s.split(')')[0].substr(1);
var OUT = s.split(')')[1];
return {
IN: _parse(IN),
OUT: _parse(OUT)
};
},
getINSlots: getINSlots,
};
})();