view modules/os.tp @ 331:61f5b794d939

Breaking change: method call syntax now always uses the syntactic receiver as the actual receiver. This makes its behavior different from function call syntax, but solves some problems with methods being shadowed by local variables and the like.
author Michael Pavone <pavone@retrodev.com>
date Sat, 28 Mar 2015 14:21:04 -0700
parents f987bb2a1911
children
line wrap: on
line source

{
	_constant <- macro: :name {
		quote: (llMessage: name withVars: {
			uintret <- obj_int32 ptr
		} andCode: {
			uintret <- make_object: (addr_of: obj_int32_meta) NULL 0
			uintret num!: name
			uintret
		})
	}
	#{
		includeSystemHeader: "sys/stat.h"
		includeSystemHeader: "fcntl.h"
		includeSystemHeader: "stdlib.h"
		includeSystemHeader: "time.h"
		includeSystemHeader: "unistd.h"

		llMessage: write withVars: {
			str <- string ptr
			intret <- obj_int32 ptr
			filedes <- obj_int32 ptr
		} andCode: :filedes str {
			intret <- make_object: (addr_of: obj_int32_meta) NULL 0
			intret num!: (write: (filedes num) (str data) (str bytes))
			intret
		}

		llMessage: read withVars: {
			str <- string ptr
			size <- obj_int32 ptr
			filedes <- obj_int32 ptr
		} andCode: :filedes size {
			str <- make_object: (addr_of: string_meta) NULL 0
			str data!: (GC_MALLOC_ATOMIC: (size num) + 1)
			str bytes!: (read: (filedes num) (str data) (size num))
			if: (str bytes) < 0 {
				str bytes!: 0
			}
			str len!: (str bytes)
			(str data) set: (str bytes) 0
			str
		}

		llMessage: readFrom:to withVars: {
			buffer <- object ptr
			bufOpaque <- cpointer ptr
			size <- obj_int32 ptr
			filedes <- obj_int32 ptr
			intret <- obj_int32 ptr
		} andCode: :filedes buffer {
			bufOpaque <- (mcall: _buf_ptr 1 buffer) castTo: (cpointer ptr)
			size <- (mcall: length 1 buffer) castTo: (obj_int32 ptr)
			intret <- make_object: (addr_of: obj_int32_meta) NULL 0
			intret num!: (read: (filedes num) (bufOpaque val) (size num))
			intret
		}

		open <- :filename flags {
			open: filename flags createPerm: 0b110110110
		}

		llMessage: open:createPerm withVars: {
			filename <- string ptr
			flags <- obj_int32 ptr
			perm <- obj_int32 ptr
			filedes <- obj_int32 ptr
		} andCode: :filename flags :perm {
			filedes <- make_object: (addr_of: obj_int32_meta) NULL 0
			filedes num!: (open: (filename data) (flags num) (perm num))
			filedes
		}

		llMessage: close withVars: {
			filedes <- obj_int32 ptr
			intret <- obj_int32 ptr
		} andCode: :filedes {
			intret <- make_object: (addr_of: obj_int32_meta) NULL 0
			intret num!: (close: (filedes num))
			intret
		}

		_constant: O_RDONLY
		_constant: O_WRONLY
		_constant: O_RDWR
		_constant: O_CREAT
		_constant: O_APPEND
		_constant: O_TRUNC

		llMessage: rand withVars: {
			intret <- obj_int32 ptr
		} andCode: {
			intret <- make_object: (addr_of: obj_int32_meta) NULL 0
			intret num!: (rand: )
			intret
		}

		llMessage: srand withVars: {
			oseed <- object ptr
			seed <- obj_int32 ptr
		} andCode: :oseed {
			seed <- (mcall: i32 1 oseed) castTo: (obj_int32 ptr)
			srand: (seed num)
			seed
		}

		llMessage: time withVars: {
			intret64 <- obj_int64 ptr
		} andCode: {
			intret64 <- make_object: (addr_of: obj_int64_meta) NULL 0
			intret64 num!: (time: NULL)
			intret64
		}

		llMessage: sleep withVars: {
			osecs <- object ptr
			secs <- obj_int32 ptr
			intret <- obj_int32 ptr
		} andCode: :osecs {
			secs <- (mcall: i32 1 osecs) castTo: (obj_int32 ptr)
			intret <- make_object: (addr_of: obj_int32_meta) NULL 0
			intret num!: (sleep: (secs num))
			intret
		}

		llMessage: execv withVars: {
			opath <- object ptr
			path <- string ptr
			eargs <- object ptr
			oarglen <- object ptr
			arglen <- obj_int32 ptr
			i <- int32_t
			oi <- obj_int32 ptr
			oarg <- object ptr
			arg <- string ptr
			cargs <- (char ptr) ptr
		} andCode: :opath eargs {
			path <- (mcall: string 1 opath) castTo: (string ptr)
			oarglen <- mcall: length 1 eargs
			arglen <- (mcall: int32 1 oarglen) castTo: (obj_int32 ptr)
			cargs <- GC_MALLOC_ATOMIC: (sizeof: (char ptr)) * ((arglen num) + 1)
			i <- 0
			while: { i < (arglen num) } do: {
				oi <- make_object: (addr_of: obj_int32_meta) NULL 0
				oi num!: i
				oarg <- mcall: get 2 eargs oi
				arg <- (mcall: string 1 oarg) castTo: (string ptr)
				cargs set: i (arg data)
				i <- i + 1
			}
			cargs set: i NULL
			i <- execv: (path data) cargs
			oi <- make_object: (addr_of: obj_int32_meta) NULL 0
			oi num!: i
			oi
		}

		llMessage: execvp withVars: {
			opath <- object ptr
			path <- string ptr
			eargs <- object ptr
			oarglen <- object ptr
			arglen <- obj_int32 ptr
			i <- int32_t
			oi <- obj_int32 ptr
			oarg <- object ptr
			arg <- string ptr
			cargs <- (char ptr) ptr
		} andCode: :opath eargs {
			path <- (mcall: string 1 opath) castTo: (string ptr)
			oarglen <- mcall: length 1 eargs
			arglen <- (mcall: int32 1 oarglen) castTo: (obj_int32 ptr)
			cargs <- GC_MALLOC_ATOMIC: (sizeof: (char ptr)) * ((arglen num) + 1)
			i <- 0
			while: { i < (arglen num) } do: {
				oi <- make_object: (addr_of: obj_int32_meta) NULL 0
				oi num!: i
				oarg <- mcall: get 2 eargs oi
				arg <- (mcall: string 1 oarg) castTo: (string ptr)
				cargs set: i (arg data)
				i <- i + 1
			}
			cargs set: i NULL
			i <- execvp: (path data) cargs
			oi <- make_object: (addr_of: obj_int32_meta) NULL 0
			oi num!: i
			oi
		}

		llMessage: execve withVars: {
			opath <- object ptr
			path <- string ptr
			eargs <- object ptr
			env <- object ptr
			oarglen <- object ptr
			arglen <- obj_int32 ptr
			i <- int32_t
			oi <- obj_int32 ptr
			oarg <- object ptr
			arg <- string ptr
			cargs <- (char ptr) ptr
			cenv <- (char ptr) ptr
		} andCode: :opath eargs env {
			path <- (mcall: string 1 opath) castTo: (string ptr)
			oarglen <- mcall: length 1 eargs
			arglen <- (mcall: int32 1 oarglen) castTo: (obj_int32 ptr)
			cargs <- GC_MALLOC_ATOMIC: (sizeof: (char ptr)) * ((arglen num) + 1)
			i <- 0
			while: { i < (arglen num) } do: {
				oi <- make_object: (addr_of: obj_int32_meta) NULL 0
				oi num!: i
				oarg <- mcall: get 2 eargs oi
				arg <- (mcall: string 1 oarg) castTo: (string ptr)
				cargs set: i (arg data)
				i <- i + 1
			}
			cargs set: i NULL

			oarglen <- mcall: length 1 eargs
			arglen <- (mcall: int32 1 oarglen) castTo: (obj_int32 ptr)
			cenv <- GC_MALLOC_ATOMIC: (sizeof: (char ptr)) * ((arglen num) + 1)
			i <- 0
			while: { i < (arglen num) } do: {
				oi <- make_object: (addr_of: obj_int32_meta) NULL 0
				oi num!: i
				oarg <- mcall: get 2 env oi
				arg <- (mcall: string 1 oarg) castTo: (string ptr)
				cenv set: i (arg data)
				i <- i + 1
			}
			cenv set: i NULL

			i <- execve: (path data) cargs cenv
			oi <- make_object: (addr_of: obj_int32_meta) NULL 0
			oi num!: i
			oi
		}
	}
}