Home | History | Annotate | Download | only in python-yasm
      1 # Python bindings for Yasm: Main Pyrex input file
      2 #
      3 #  Copyright (C) 2006  Michael Urman, Peter Johnson
      4 #
      5 # Redistribution and use in source and binary forms, with or without
      6 # modification, are permitted provided that the following conditions
      7 # are met:
      8 # 1. Redistributions of source code must retain the above copyright
      9 #    notice, this list of conditions and the following disclaimer.
     10 # 2. Redistributions in binary form must reproduce the above copyright
     11 #    notice, this list of conditions and the following disclaimer in the
     12 #    documentation and/or other materials provided with the distribution.
     13 #
     14 # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND OTHER CONTRIBUTORS ``AS IS''
     15 # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     16 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     17 # ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR OTHER CONTRIBUTORS BE
     18 # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     19 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     20 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     21 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     22 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     23 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     24 # POSSIBILITY OF SUCH DAMAGE.
     25 """Interface to the Yasm library.
     26 
     27 The Yasm library (aka libyasm) provides the core functionality of the Yasm
     28 assembler.  Classes in this library provide for manipulation of machine
     29 instructions and object file constructs such as symbol tables and sections.
     30 
     31 Expression objects encapsulate complex expressions containing registers,
     32 symbols, and operations such as SEG.
     33 
     34 Bytecode objects encapsulate data or code objects such as data, reserve,
     35 align, or instructions.
     36 
     37 Section objects encapsulate an object file section, including the section
     38 name, any Bytecode objects contained within that section, and other
     39 information.
     40 
     41 """
     42 
     43 cdef extern from "Python.h":
     44     cdef object PyCObject_FromVoidPtr(void *cobj, void (*destr)(void *))
     45     cdef object PyCObject_FromVoidPtrAndDesc(void *cobj, void *desc,
     46                                              void (*destr)(void *, void *))
     47     cdef int PyType_Check(object)
     48     cdef int PyCObject_Check(object)
     49     cdef void *PyCObject_AsVoidPtr(object)
     50     cdef void *PyCObject_GetDesc(object)
     51 
     52     cdef object _PyLong_FromByteArray(unsigned char *bytes, unsigned int n,
     53                                       int little_endian, int is_signed)
     54     cdef int _PyLong_AsByteArray(object v, unsigned char *bytes, unsigned int n,
     55                                  int little_endian, int is_signed) except -1
     56 
     57     cdef void Py_INCREF(object o)
     58     cdef void Py_DECREF(object o)
     59 
     60     cdef void PyErr_SetString(object type, char *message)
     61     cdef object PyErr_Format(object type, char *format, ...)
     62 
     63 cdef extern from "stdlib.h":
     64     cdef void *malloc(int n)
     65     cdef void free(void *p)
     66 
     67 include "_yasm.pxi"
     68 
     69 cdef object __pass_voidp(void *obj, object forclass):
     70     return PyCObject_FromVoidPtrAndDesc(obj, <void *>forclass, NULL)
     71 
     72 cdef void *__get_voidp(object obj, object forclass) except NULL:
     73     cdef void* desc
     74 
     75     if not PyCObject_Check(obj):
     76         msg = "obj %r is not a CObject" % obj
     77         PyErr_SetString(TypeError, msg)
     78         return NULL
     79 
     80     desc = PyCObject_GetDesc(obj)
     81 
     82     if desc != <void *>forclass:
     83         if desc == NULL:
     84             msg = "CObject type is not set (expecting %s)" % forclass
     85         elif PyType_Check(<object>desc):
     86             msg = "CObject is for %s not %s" % (<object>desc, forclass)
     87         else:
     88             msg = "CObject is incorrect (expecting %s)" % forclass
     89         PyErr_SetString(TypeError, msg)
     90         return NULL
     91 
     92     return PyCObject_AsVoidPtr(obj)
     93 
     94 #
     95 # Link to associated data mechanism to keep Python references paired with
     96 # yasm objects.
     97 #
     98 cdef class __assoc_data_callback:
     99     cdef yasm_assoc_data_callback *cb
    100     def __cinit__(self, destroy, print_):
    101         self.cb = <yasm_assoc_data_callback *>malloc(sizeof(yasm_assoc_data_callback))
    102         self.cb.destroy = <void (*) (void *)>PyCObject_AsVoidPtr(destroy)
    103         #self.cb.print_ = <void (*) (void *, FILE *, int)>PyCObject_AsVoidPtr(print_)
    104     def __dealloc__(self):
    105         free(self.cb)
    106 
    107 
    108 cdef class Register:
    109     cdef unsigned long reg
    110     def __cinit__(self, reg):
    111         self.reg = reg
    112 
    113 include "errwarn.pxi"
    114 include "intnum.pxi"
    115 include "floatnum.pxi"
    116 include "expr.pxi"
    117 include "symrec.pxi"
    118 include "value.pxi"
    119 
    120 include "bytecode.pxi"
    121 
    122 cdef __initialize():
    123     BitVector_Boot()
    124     yasm_intnum_initialize()
    125     yasm_floatnum_initialize()
    126     yasm_errwarn_initialize()
    127 
    128 def __cleanup():
    129     yasm_floatnum_cleanup()
    130     yasm_intnum_cleanup()
    131     yasm_errwarn_cleanup()
    132     BitVector_Shutdown()
    133 
    134 __initialize()
    135 import atexit
    136 atexit.register(__cleanup)
    137 
    138