Mercurial > repos > tabletprog
view modules/bytearray.tp @ 294:d1dc2d70bdfd
Move OS module out of backend Javascript into a proper module file. Add normal bytearray to bytearray module. Add read:to method to os module for reading into a bytearray.
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Thu, 24 Jul 2014 21:58:26 -0700 |
parents | fb922651db29 |
children | 2a0a88799737 |
line wrap: on
line source
#{ includeSystemHeader: "unistd.h" includeSystemHeader: "sys/mman.h" normal <- :size { #{ llProperty: bytes withType: uint32_t llProperty: buffer withType: (void ptr) llMessage: _init_buf withVars: { sz <_ obj_int32 ptr } andCode: :sz { bytes <- sz num buffer <- GC_MALLOC_ATOMIC: bytes self } llMessage: _buf_ptr withVArs: { ptrret <- cpointer ptr } andCode: { ptrret <- make_object: (addr_of: cpointer_meta) NULL 0 ptrret val!: buffer ptrret } llMessage: length withVars: { intret <- obj_int32 ptr } andCode: { intret <- make_object: (addr_of: obj_int32_meta) NULL 0 intret num!: bytes intret } llMessage: set withVars: { offset <- obj_int32 ptr newval <- obj_uint8 ptr } andCode: :offset newval { (buffer castTo: (uint8_t ptr)) set: (offset num) (newval num) self } llMessage: get withVars: { offset <- obj_int32 ptr ret <- obj_uint8 ptr } andCode: :offset { ret <- make_object: (addr_of: obj_uint8_meta) NULL 0 ret num!: ((buffer castTo: (uint8_t ptr)) get: (offset num)) ret } llMessage: stringFrom:to withVars:{ from <- obj_int32 ptr to <- obj_int32 ptr str <- string ptr } andCode: :from :to { //probably should do some UTF-8 validation at some point str <- make_object: (addr_of: string_meta) NULL 0 str bytes!: (to num) - (from num) str len!: (str bytes) str data!: (GC_MALLOC_ATOMIC: (str bytes) + 1) memcpy: (str data) buffer (str bytes) (str data) set: (str bytes) 0 str } string <- { stringFrom: 0 to: } findChar:else <- :char found :else { notfound <- true n <- length i <- 0 while: { notFound && i < n } do: { if: (get: i) = char { notfound <- false } else: { i <- i + 1 } } if: notfound else else: { found: i } } } _init_buf: size } executable <- :size { buf <- #{ llProperty: bytes withType: uint32_t llProperty: buffer withType: (void ptr) llMessage: _init withVars: { sz <- obj_int32 ptr } andCode: :sz { bytes <- sz num buffer <- sbrk: bytes mprotect: buffer bytes (PROT_READ or PROT_WRITE or PROT_EXEC) self } llMessage: set withVars: { offset <- obj_int32 ptr newval <- obj_uint8 ptr } andCode: :offset newval { (buffer castTo: (uint8_t ptr)) set: (offset num) (newval num) self } llMessage: get withVars: { offset <- obj_int32 ptr ret <- obj_uint8 ptr } andCode: :offset { ret <- make_object: (addr_of: obj_uint8_meta) NULL 0 ret num!: ((buffer castTo: (uint8_t ptr)) get: (offset num)) ret } llMessage: run withVars: { fun <- uint64_t funptr funret <- obj_uint64 ptr } andCode: { funret <- make_object: (addr_of: obj_uint64_meta) NULL 0 fun <- buffer funret num!: ( fun: ) funret } llMessage: runWithArg withVars: { fun <- uint64_t funptr: uint64_t funret <- obj_uint64 ptr arg <- obj_uint64 ptr } andCode: :arg { fun <- buffer funret <- make_object: (addr_of: obj_uint64_meta) NULL 0 funret num!: ( fun: (arg num) ) funret } } buf _init: size } executableFromBytes <- :bytes { totalSize <- bytes fold: 0 with: :acc el { acc + (el length) } ba <- executable: totalSize bytes fold: 0 with: :idx el { el flattenTo: ba at: idx } ba } }