Mercurial > repos > rhope
view runtime/builtin.c @ 54:243d013a49cb
Defer processing of string literals until after simpler ones to avoid a segfault
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Thu, 29 Apr 2010 01:12:43 -0400 |
parents | 70af7fa155d0 |
children | 04baa003de5a |
line wrap: on
line source
#include "builtin.h" #include "object.h" #include "integer.h" #include "bool.h" #include <stddef.h> #include <stdio.h> #include <stdlib.h> #include <string.h> void register_builtin_type(uint32_t type) { blueprint * bp; switch(type) { case TYPE_BLUEPRINT: bp = register_type_byid(TYPE_BLUEPRINT, sizeof(blueprint *), NULL, NULL, NULL); break; } } void register_builtin_types() { uint32_t i; for(i = 0; i < TYPE_FIRST_USER; ++i) register_builtin_type(i); } object * make_Int64(int64_t val) { t_Int64 * obj; object * ret = new_object(TYPE_INT64); obj = (t_Int64 *)ret; obj->Num = val; return ret; } object * make_Int32(int32_t val) { t_Int32 * obj; object * ret = new_object(TYPE_INT32); obj = (t_Int32 *)ret; obj->Num = val; return ret; } object * make_Int16(int16_t val) { t_Int16 * obj; object * ret = new_object(TYPE_INT16); obj = (t_Int16 *)ret; obj->Num = val; return ret; } object * make_Int8(int8_t val) { t_Int8 * obj; object * ret = new_object(TYPE_INT8); obj = (t_Int8 *)ret; obj->Num = val; return ret; } object * make_UInt64(uint64_t val) { t_UInt64 * obj; object * ret = new_object(TYPE_UINT64); obj = (t_UInt64 *)ret; obj->Num = val; return ret; } object * make_UInt32(uint32_t val) { t_UInt32 * obj; object * ret = new_object(TYPE_UINT32); obj = (t_UInt32 *)ret; obj->Num = val; return ret; } object * make_UInt16(uint16_t val) { t_UInt16 * obj; object * ret = new_object(TYPE_UINT16); obj = (t_UInt16 *)ret; obj->Num = val; return ret; } object * make_UInt8(uint8_t val) { t_UInt8 * obj; object * ret = new_object(TYPE_UINT8); obj = (t_UInt8 *)ret; obj->Num = val; return ret; } object * make_String(char * text) { returntype ret; context * ct; calldata * cdata; object * retobj; t_Array * arr = (t_Array *)_internal_array_allocnaked(strlen(text), make_Blueprint(TYPE_UINT8)); arr->payload.Length = arr->payload.Storage; memcpy(((char *)arr) + sizeof(t_Array), text, arr->payload.Length); //This is really ugly, but I don't see a good way around it at the moment ct = new_context(); cdata = alloc_cdata(ct, 1); cdata->params[0] = (object *)arr; cdata->num_params = 1; cdata->resume = 0; ret = f_String(cdata); while(ret == TAIL_RETURN) ret = cdata->tail_func(cdata); if(ret == EXCEPTION_RETURN) { puts("Exception while building string literal!"); exit(-1); } retobj = cdata->params[0]; free_context(ct); return retobj; } #define lval ((t_Boolean *)(cdata->params[0]))->Val MethodNoLocals(If,Boolean, NumParams 1, CallSpace 1) Param(0, TYPE_BOOLEAN) if(lval) { Ret(1, NULL) } else { Ret(1, cdata->params[0]); Ret(0, NULL) } EndFunc