Class: AsmJIT::CodeHolder

Inherits:
Object
  • Object
show all
Defined in:
lib/asmjit.rb,
ext/asmjit/asmjit.cc

Instance Method Summary collapse

Constructor Details

#initializeObject



108
109
110
111
112
113
114
115
116
# File 'ext/asmjit/asmjit.cc', line 108

VALUE code_holder_initialize(VALUE self) {
    CodeHolderWrapper *wrapper;
    TypedData_Get_Struct(self, CodeHolderWrapper, &code_holder_type, wrapper);

    CodeHolder *code = wrapper->code;
    code->init(jit_runtime.environment());

    return self;
}

Instance Method Details

#assemblerObject



14
15
16
# File 'lib/asmjit.rb', line 14

def assembler
  X86::Assembler.new(self)
end

#binaryObject



151
152
153
154
155
156
157
158
159
160
161
162
# File 'ext/asmjit/asmjit.cc', line 151

VALUE code_holder_binary(VALUE self) {
    CodeHolderWrapper *wrapper;
    TypedData_Get_Struct(self, CodeHolderWrapper, &code_holder_type, wrapper);

    CodeHolder *code = wrapper->code;

    CodeBuffer buffer = code->sectionById(0)->buffer();
    return rb_str_new(
            reinterpret_cast<const char *>(buffer.data()),
            buffer.size()
            );
}

#def_class(arity, method_name: :call) ⇒ Object



34
35
36
37
38
# File 'lib/asmjit.rb', line 34

def def_class(arity, method_name: :call)
  mod = Class.new
  self.def_method(mod, method_name, arity)
  mod
end

#def_method(mod, name, arity_val) ⇒ Object



132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
# File 'ext/asmjit/asmjit.cc', line 132

VALUE code_holder_define_method(VALUE self, VALUE mod, VALUE name, VALUE arity_val) {
    CodeHolderWrapper *wrapper;
    TypedData_Get_Struct(self, CodeHolderWrapper, &code_holder_type, wrapper);

    CodeHolder *code = wrapper->code;

    int arity = FIX2INT(arity_val);
    ID id = rb_sym2id(name);

    VALUE (*fn)(ANYARGS);
    jit_runtime.add(&fn, code);

    // avoid cxxanyargs
#undef rb_define_method_id
    rb_define_method_id(mod, id, fn, arity);

    return name;
}

#def_module(arity, method_name: :call) ⇒ Object



28
29
30
31
32
# File 'lib/asmjit.rb', line 28

def def_module(arity, method_name: :call)
  mod = Module.new
  self.def_method(mod, method_name, arity)
  mod
end

#loggerObject



97
98
99
100
101
102
103
104
105
106
# File 'ext/asmjit/asmjit.cc', line 97

VALUE code_holder_get_logger(VALUE self) {
    CodeHolderWrapper *wrapper;
    TypedData_Get_Struct(self, CodeHolderWrapper, &code_holder_type, wrapper);

    if (wrapper->logger) {
        return wrapper->logger->obj;
    } else {
        return Qnil;
    }
}

#logger=(object) ⇒ Object



79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# File 'ext/asmjit/asmjit.cc', line 79

VALUE code_holder_set_logger(VALUE self, VALUE object) {
    CodeHolderWrapper *wrapper;
    TypedData_Get_Struct(self, CodeHolderWrapper, &code_holder_type, wrapper);

    if (wrapper->logger) {
        wrapper->code->resetLogger();
        delete wrapper->logger;
    }

    if (RTEST(object)) {
        wrapper->logger = new RubyLogger(object);
        wrapper->logger->setFlags(FormatFlags::kHexImms);
        wrapper->code->setLogger(wrapper->logger);
    }

    return object;
}

#to_fiddle(inputs: nil, output: nil) ⇒ Object



18
19
20
21
22
23
24
25
26
# File 'lib/asmjit.rb', line 18

def to_fiddle(inputs: nil, output: nil)
  ptr = to_ptr

  Fiddle::Function.new(
    ptr,
    inputs || [],
    output || Fiddle::TYPE_INT
  )
end

#to_ptrObject



118
119
120
121
122
123
124
125
126
127
128
# File 'ext/asmjit/asmjit.cc', line 118

VALUE code_holder_to_ptr(VALUE self) {
    CodeHolderWrapper *wrapper;
    TypedData_Get_Struct(self, CodeHolderWrapper, &code_holder_type, wrapper);

    CodeHolder *code = wrapper->code;

    int (*fn)(void);
    jit_runtime.add(&fn, code);

    return ULL2NUM(uintptr_t(fn));
}