Class: AsmJIT::BaseEmitter

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

Direct Known Subclasses

X86::Assembler

Instance Method Summary collapse

Instance Method Details

#_emit(*args) ⇒ Object



421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
# File 'ext/asmjit/asmjit.cc', line 421

VALUE base_emitter_emit(int argc, VALUE* argv, VALUE self) {
    BaseEmitter *emitter = get_emitter(self);

    if (argc < 1) return Qnil;
    if (argc > 7) return Qnil;

    VALUE insn_name = argv[0];
    Check_Type(insn_name, T_STRING);
    InstId inst_id = InstAPI::stringToInstId(emitter->arch(), RSTRING_PTR(insn_name), RSTRING_LEN(insn_name));

    Operand operands[6];
    for (int i = 0; i < argc - 1; i++) {
        operands[i] = opnd_get(argv[i + 1]);
    }

    emitter->emitOpArray(inst_id, &operands[0], argc - 1);

    return self;
}

#bind(labelv) ⇒ Object



408
409
410
411
412
413
414
415
416
417
418
419
# File 'ext/asmjit/asmjit.cc', line 408

VALUE base_emitter_bind(VALUE self, VALUE labelv) {
    BaseEmitter *emitter = get_emitter(self);

    Label label = label_get(labelv);

    int err = emitter->bind(label);
    if (err) {
        rb_raise(rb_eAsmJITError, "error binding label");
    }

    return labelv;
}

#new_labelObject



395
396
397
398
399
400
401
402
403
404
405
406
# File 'ext/asmjit/asmjit.cc', line 395

VALUE base_emitter_new_label(VALUE self) {
    BaseEmitter *emitter = get_emitter(self);

    Label label = emitter->newLabel();

    OperandWrapper *opnd_wrapper = static_cast<OperandWrapper *>(xmalloc(sizeof(OperandWrapper)));
    opnd_wrapper->opnd = label;

    VALUE obj = TypedData_Wrap_Struct(cLabel, &operand_type, opnd_wrapper);
    rb_iv_set(obj, "@emitter", self);
    return obj;
}