-
Notifications
You must be signed in to change notification settings - Fork 610
/
vm.rb
82 lines (67 loc) · 2.17 KB
/
vm.rb
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
# -*- encoding: us-ascii -*-
class Rubinius::VM
# Get an Array of Rubinius::Location objects representing the current
# call stack. +frames_to_skip+ says how many initial frames to ignore.
# If +include_vars+ is set, then the Location objects also include a
# Rubinius::VariableScope object that can be used to access the frames
# running information like locals, self, etc.
#
def self.backtrace(frames_to_skip, include_vars=false)
Rubinius.primitive :vm_backtrace
# Add the + 1 to skip this frame
backtrace(Integer(frames_to_skip) + 1, include_vars)
end
def self.stats
Rubinius.primitive :vm_stats
raise PrimitiveFailure, "Rubinius::VM.stats primitive failed"
end
def self.dump_heap(path)
Rubinius.primitive :vm_dump_heap
raise PrimitiveFailure, "Rubinius::VM.dump_heap failed"
end
def self.__jit_info__
Rubinius.primitive :vm_jit_info
raise PrimitiveFailure, "Rubinius::VM.jit_info primitive failed"
end
class JITInfo
def initialize(methods, bytes, nanoseconds, accessors_inlined, uncommons)
@jitted_methods = methods
@code_bytes = bytes
@nanoseconds = nanoseconds
@accessors_inlined = accessors_inlined
@uncommons = uncommons
end
attr_reader :jitted_methods
attr_reader :code_bytes
attr_reader :nanoseconds
attr_reader :accessors_inlined
attr_reader :uncommons
def milliseconds
@nanoseconds / 1_000_000
end
def seconds
@nanoseconds.to_f / 1_000_000_000
end
def bytes_per_method
@code_bytes.to_f / @jitted_methods
end
end
def self.jit_info
JITInfo.new(*__jit_info__)
end
def self.load_library(path, name)
Rubinius.primitive :load_library
raise PrimitiveFailure, "Rubinius::VM.load_library primitive failed"
end
def self.coerce_to_array(object)
array = object.respond_to?(:to_a) ? object.to_a : [object]
raise(TypeError, "`to_a' did not return Array") unless array.is_a?(Array)
array
end
# Semantics of this are very important. ret MUST be returned.
def self.perform_hook(obj, meth, arg, ret)
# The VM already verified the method exists
obj.__send__(meth, arg)
return ret
end
end