FazBrowse GitHub Viewer
|
Trending
|
URL:
|
Home
Tools:
[Download Repo ZIP]
[View Raw Code]
[Original HTTPS Page]
jruby/core/src/main/java/org/jruby/FlagRegistry.java at master · jruby/jruby · GitHub
Uh oh!
There was an error while loading.
Please reload this page
.
jruby
/
jruby
Public
Uh oh!
There was an error while loading.
Please reload this page
.
Notifications
You must be signed in to change notification settings
Fork
946
Star
3.9k
Code
Issues
840
Pull requests
109
Discussions
Actions
Projects
Wiki
Security and quality
0
Insights
Additional navigation options
Code
Issues
Pull requests
Discussions
Actions
Projects
Wiki
Security and quality
Insights
Expand file tree
Breadcrumbs
jruby
/
core
/
src
/
main
/
java
/
org
/
jruby
/
FlagRegistry.java
Copy path
More file actions
More file actions
Latest commit
History
History
History
75 lines (66 loc) · 2.67 KB
Breadcrumbs
jruby
/
core
/
src
/
main
/
java
/
org
/
jruby
/
FlagRegistry.java
Copy path
File metadata and controls
75 lines (66 loc) · 2.67 KB
Raw
Copy raw file
Download raw file
Open symbols panel
Edit and raw actions
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
package
org
.
jruby
;
import
java
.
util
.
BitSet
;
import
java
.
util
.
HashMap
;
import
java
.
util
.
Map
;
/**
* This class serves as a registry of all bit flags we use on JRuby objects.
*
* In order to maximally use our bit flags and prevent overlap between ancestors and dependents,
* this class registers flags on a first-come, first-served basis using previous flags registered
* for ancestor classes as a base line for new flags in a descendant.
*
* Because of the first-come, first-served nature, the most general types will need to register
* their flags first. This guarantees all bit flags from the progenitor on down will be packed
* tightly while avoiding overlaps.
*/
public
class
FlagRegistry
{
private
final
Map
<
Class
,
Integer
>
currentShift
=
new
HashMap
<>();
private
final
Map
<
Class
,
BitSet
>
registry
=
new
HashMap
<>();
/**
* Register a new flag for the given class.
*
* The bit index for the new flag will be calculated at runtime, by walking parent classes
* and looking for previously-registered flags. Ancestors should register all their flags
* before descendants (which means they should not be registered in a static initializer
* unless the parent is known to have fully run its own static initializers).
*
* @param klass the class for which to register a new flag
* @return an integer with the new flag bit set
*/
public
synchronized
int
newFlag
(
Class
klass
) {
Class
currentKlass
=
klass
;
Integer
shift
=
null
;
while
(
currentKlass
!=
null
&&
(
shift
=
currentShift
.
get
(
currentKlass
)) ==
null
) {
currentKlass
=
currentKlass
.
getSuperclass
();
}
if
(
shift
==
null
)
shift
=
0
;
BitSet
flags
=
registry
.
get
(
klass
);
if
(
flags
==
null
) {
flags
=
new
BitSet
();
registry
.
put
(
klass
,
flags
);
}
flags
.
set
(
shift
);
assert
flagsAreValid
(
klass
,
shift
);
currentShift
.
put
(
klass
,
shift
+
1
);
return
1
<<
shift
++;
}
public
synchronized
void
printFlags
() {
System
.
out
.
println
(
registry
);
}
private
boolean
flagsAreValid
(
Class
klass
,
int
bitIndex
) {
BitSet
gathered
=
new
BitSet
();
Class
currentKlass
=
klass
;
while
(
currentKlass
!=
null
) {
BitSet
flags
=
registry
.
get
(
klass
);
if
(
flags
!=
null
) {
if
(
flags
.
intersects
(
gathered
)) {
throw
new
AssertionError
(
klass
.
getName
() +
" uses flag "
+
bitIndex
+
" that overlaps with "
+
currentKlass
);
}
gathered
.
and
(
flags
);
}
currentKlass
=
currentKlass
.
getSuperclass
();
}
return
true
;
}
}
Back
|
FazBrowse Home
|
New Git URL