Example #1
0
void codegen::output(const char * filename, const char * packagename, const char * name, func_binary * bin)
{
	assert(m_byte_code_list.size() == m_byte_lineno_list.size());

	bin->m_filename = stringdump(m_fk, filename, strlen(filename));
	bin->m_packagename = stringdump(m_fk, packagename, strlen(packagename));
	bin->m_name = stringdump(m_fk, name, strlen(name));

	bin->m_maxstack = m_maxstackpos;
	
	bin->m_size = m_byte_code_list.size();
	if (bin->m_size > 0)
	{
		bin->m_buff = (command *)safe_fkmalloc(m_fk, (bin->m_size * sizeof(command)), emt_func_binary);
		memcpy(bin->m_buff, &m_byte_code_list[0], bin->m_size * sizeof(command));
	}
	
	bin->m_lineno_size = m_byte_lineno_list.size();
	if (bin->m_lineno_size > 0)
	{
		bin->m_lineno_buff = (int *)safe_fkmalloc(m_fk, (bin->m_lineno_size * sizeof(int)), emt_func_binary);
		memcpy(bin->m_lineno_buff, &m_byte_lineno_list[0], bin->m_lineno_size * sizeof(int));
	}

	bin->m_const_list_num = m_const_list.size();
	if (bin->m_const_list_num > 0)
	{
		bin->m_const_list = (variant *)safe_fkmalloc(m_fk, (bin->m_const_list_num * sizeof(variant)), emt_func_binary);
		memcpy(bin->m_const_list, &m_const_list[0], bin->m_const_list_num * sizeof(variant));
	}

	bin->m_container_addr_list_num = m_containeraddr_list.size();
	if (bin->m_container_addr_list_num > 0)
	{
		bin->m_container_addr_list = (container_addr *)safe_fkmalloc(m_fk, (bin->m_container_addr_list_num * sizeof(container_addr)), emt_func_binary);
		memcpy(bin->m_container_addr_list, &m_containeraddr_list[0], bin->m_container_addr_list_num * sizeof(container_addr));
	}

	bin->m_debug_stack_variant_info_num = m_debug_block_identifiers_list.size();
	if (bin->m_debug_stack_variant_info_num > 0)
	{
		bin->m_debug_stack_variant_info = (stack_variant_info *)safe_fkmalloc(m_fk, (bin->m_debug_stack_variant_info_num * sizeof(stack_variant_info)), emt_func_binary);
		memcpy(bin->m_debug_stack_variant_info, &m_debug_block_identifiers_list[0], bin->m_debug_stack_variant_info_num * sizeof(stack_variant_info));
	}

	bin->m_fresh++;

	FKLOG("codegen out %s %d", name, m_maxstackpos);
}
Example #2
0
void * myflexer::malloc(size_t size, const char * name)
{
	void * p = safe_fkmalloc(m_fk, size);
	FKLOG("flexer malloc %p %d %s", p, (int)size, name);
	m_nodelist.push_back((syntree_node*)p);
	return p;
}
// trim
void buildin_string_trim(fake * fk, interpreter * inter)
{
	BIF_CHECK_ARG_NUM(2);

	const char * trimstr = fkpspopcstrptr(fk);
	const char * str = fkpspopcstrptr(fk);
	if (trimstr && str)
	{
		// left
		int trimlen = strlen(trimstr);
		while (1)
		{
			const char * s = strstr(str, trimstr);
			if (s == str)
			{
				str += trimlen;
			}
			else
			{
				break;
			}
		}

		// right
		const char * srcstr = str;
		int endpos = strlen(str);
		int trimnum = 0;
		while (str < srcstr + endpos)
		{
			const char * s = strstr(str, trimstr);
			if (s == str)
			{
				str += trimlen;
				trimnum++;
			}
			else if (s)
			{
				trimnum = 0;
				str = s;
			}
			else
			{
				trimnum = 0;
				break;
			}
		}
		int afterlen = endpos - trimlen * trimnum;
		assert(afterlen >= 0);
		char * buf = (char *)safe_fkmalloc(fk, afterlen + 1, emt_tmp);
		buf[afterlen] = 0;
		memcpy(buf, srcstr, afterlen);
		fkpspush<const char *>(fk, buf);
		safe_fkfree(fk, buf);
	}
	else
	{
		fkpspush<const char *>(fk, str);
	}
}
Example #4
0
void buildin_buffer_popstring(fake * fk, interpreter * inter)
{
	int len = fkpspop<int>(fk);
	char * data = (char *)safe_fkmalloc(fk, len + 1);
	memset(data, 0, len + 1);
	buffer * b = fkpspop<buffer *>(fk);
	if (b)
	{
		b->read(data, len);
	}
	fkpspush<const char *>(fk, data);
	safe_fkfree(fk, data);
}
// substr
void buildin_string_substr(fake * fk, interpreter * inter)
{
	BIF_CHECK_ARG_NUM(3);

	int count = fkpspop<int>(fk);
	int pos = fkpspop<int>(fk);
	const char * srcstr = 0;
	variant * v = 0;
	bool err = false;
	PS_POP_AND_GET(fk->ps, v);
	V_GET_STRING(v, srcstr);
	CHECK_ERR(err);
	
	int len = srcstr ? v->data.str->sz : 0;
	if (count == -1)
	{
		count = 0x7FFFFFFF;
	}
	if (count < 0)
	{
		fkpspush<const char *>(fk, "");
		return;
	}
	if ((uint32_t)((uint32_t)pos + (uint32_t)count) > (uint32_t)len)
	{
		count = len - pos;
	}
	
	if (pos >= 0 && pos < len && srcstr && count > 0)
	{
		char * buf = (char *)safe_fkmalloc(fk, count + 1, emt_tmp);
		buf[count] = 0;
		memcpy(buf, srcstr + pos, count);
		fkpspush<const char *>(fk, buf);
		safe_fkfree(fk, buf);
	}
	else
	{
		fkpspush<const char *>(fk, "");
	}
}
Example #6
0
// freadall
void buildin_freadall(fake * fk, interpreter * inter)
{
	FILE * f = fkpspop<FILE *>(fk);
	if (f)
	{
		fseek(f, 0, SEEK_END);
		size_t filesize = ftell(f);
		fseek(f, 0, SEEK_SET);
		
		char * buffer = (char *)safe_fkmalloc(fk, filesize + 1, emt_tmp);
		buffer[filesize] = 0;
		if (fread(buffer, filesize, 1, f) == 1)
		{
			fkpspush<char *>(fk, buffer);
			safe_fkfree(fk, buffer);
			return;
		}
		safe_fkfree(fk, buffer);
	}
	const char * ret = "";
	fkpspush<const char *>(fk, ret);
}
Example #7
0
void * myflexer::malloc(size_t size, const char * name)
{
	void * p = safe_fkmalloc(m_fk, size);
	FKLOG("flexer malloc %p %d %s", p, (int)size, name);
	return p;
}
// replace
void buildin_string_replace(fake * fk, interpreter * inter)
{
	BIF_CHECK_ARG_NUM(3);

	const char * tostr = fkpspopcstrptr(fk);
	const char * fromstr = fkpspopcstrptr(fk);
	const char * str = fkpspopcstrptr(fk);

	if (!tostr || !fromstr || !str)
	{
		fkpspush<const char *>(fk, "");
		return;
	}
	
	int str_size = strlen(str);
	int from_size = strlen(fromstr);
	int to_size = strlen(tostr);

	if (from_size == 0)
	{
		fkpspush<const char *>(fk, str);
		return;
	}

	char * tmpbuff = 0;

	int delta = to_size - from_size;
	if (delta == 0)
	{
		tmpbuff = (char *)safe_fkmalloc(fk, str_size + 1, emt_tmp);
		memcpy(tmpbuff, str, str_size);
		tmpbuff[str_size] = 0;
			
		int pos = 0;
		const char * find = strstr(tmpbuff + pos, fromstr);
		while (find)
		{
	        memcpy((void*)find, tostr, to_size);
			pos = find - tmpbuff + to_size;
			find = strstr(tmpbuff + pos, fromstr);
		}
	}
	else
	{
		int num = 0;
		
		int pos = 0;
		const char * find = strstr(str + pos, fromstr);
		while (find)
		{
			num++;
			pos = find - str + from_size;
			find = strstr(str + pos, fromstr);
		}

		if (num >= 0)
		{
			int new_str_size = str_size + num * delta + 1;
			tmpbuff = (char *)safe_fkmalloc(fk, new_str_size, emt_tmp);
			tmpbuff[str_size + num * delta] = 0;
		
			char * pbuff = tmpbuff;
			
			int pos = 0;
			const char * find = strstr(str + pos, fromstr);
			while (find)
			{
				int skip_size = find - str - pos;
				if (skip_size > 0)
				{
					memcpy(pbuff, str + pos, skip_size);
					pbuff += skip_size;
				}

				memcpy(pbuff, tostr, to_size);
				pbuff += to_size;
			
				pos = find - str + from_size;
				find = strstr(str + pos, fromstr);
			}

			if (pos < str_size)
			{
				memcpy(pbuff, str + pos, str_size - pos);
			}			
		}
		else
		{
			fkpspush<const char *>(fk, str);
			return;
		}
	}
	
	fkpspush<const char *>(fk, tmpbuff);
	safe_fkfree(fk, tmpbuff);
}