view runtime/builtin.c @ 53:70af7fa155d0

Cleaned up some C warnings and added a simple compile script
author Mike Pavone <pavone@retrodev.com>
date Thu, 29 Apr 2010 04:32:54 +0000
parents 079200bc3e75
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