rev 645 - in trunk: . include/prothon pr/test src

SVN User <[email protected]> Sat, 19 Jun 2004 20:42:47 -0400
Newsgroups gmane.comp.lang.prothon.cvs
Message-ID <[email protected]>
Author: mark
Date: 2004-06-19 20:42:44 -0400 (Sat, 19 Jun 2004)
New Revision: 645

Modified:
   trunk/STATUS.txt
   trunk/include/prothon/prothon.h
   trunk/include/prothon/prothon_dll.h
   trunk/pr/test/test.pr
   trunk/src/builtins-file.c
   trunk/src/builtins-list.c
   trunk/src/builtins-time.c
   trunk/src/memory_mgr.c
   trunk/src/object.c
Log:
changed Time to DateTime, changed DatTime constructor to match Python

Modified: trunk/STATUS.txt
===================================================================
--- trunk/STATUS.txt	2004-06-19 07:08:18 UTC (rev 644)
+++ trunk/STATUS.txt	2004-06-20 00:42:44 UTC (rev 645)
@@ -28,6 +28,8 @@
 --- add Object.data_ (builtins-databytes.c)
 --- Bytes methods?  copy struct module?
 
+--- weak references
+
 --- allow tracebacks in the constructors to exception objects or raise command
 --- Traceback objects (stack trace of an exception), exceptions should show function names
 --- Fix error reporting mess, hide fake file names

Modified: trunk/include/prothon/prothon.h
===================================================================
--- trunk/include/prothon/prothon.h	2004-06-19 07:08:18 UTC (rev 644)
+++ trunk/include/prothon/prothon.h	2004-06-20 00:42:44 UTC (rev 645)
@@ -305,7 +305,7 @@
 	FLOAT_PROTO,		// 5 Float
 	IMAG_PROTO,			// 6 Imaginary
 	SYMBOL_PROTO,		// 7 Symbol
-	TIME_PROTO,			// 8 Time
+	DATETIME_PROTO,			// 8 Time
 	SEQ_PROTO,			// 9 Sequence
 	BYTES_PROTO,		// 10 Bytes
 	STRING_PROTO,		// 11 String
@@ -773,7 +773,10 @@
 obj_p list10(isp ist,obj_p item1, obj_p item2, obj_p item3, obj_p item4, 
 			         obj_p item5, obj_p item6, obj_p item7, obj_p item8,
 					 obj_p item9, obj_p item10 );
-
+obj_p list16(isp ist, obj_p  item1, obj_p  item2, obj_p  item3, obj_p  item4, 
+			          obj_p  item5, obj_p  item6, obj_p  item7, obj_p  item8,
+			          obj_p  item9, obj_p item10, obj_p item11, obj_p item12,
+			          obj_p item13, obj_p item14, obj_p item15, obj_p item16);
 // DICT_ADD: Add a key/value pair to the dictionary.  Replace old one if key exists.
 // Key equality is determined by the eq__QUES function on the key objects.  The eq__QUES
 // function is called on the existing key in the dict with the passed key as the parameter.
@@ -960,10 +963,17 @@
 #define FPARM4(lab1, val1, lab2, val2, lab3, val3, lab4, val4)	\
 	list8(ist, sym(ist, #lab1), val1, sym(ist, #lab2), val2,    \
                sym(ist, #lab3), val3, sym(ist, #lab4), val4 )
-#define FPARM5(lab1, val1, lab2, val2, lab3, val3, lab4, val4,lab5, val5) \
-	list10(ist, sym(ist, #lab1), val1, sym(ist, #lab2), val2,	          \
-                sym(ist, #lab3), val3, sym(ist, #lab4), val4,             \
+#define FPARM5(lab1, val1, lab2, val2, lab3, val3, lab4, val4,  \
+               lab5, val5)                                      \
+	list10(ist, sym(ist, #lab1), val1, sym(ist, #lab2), val2,   \
+                sym(ist, #lab3), val3, sym(ist, #lab4), val4,   \
 			    sym(ist, #lab5), val5 )
+#define FPARM8(lab1, val1, lab2, val2, lab3, val3, lab4, val4,  \
+               lab5, val5, lab6, val6, lab7, val7, lab8, val8)  \
+	list16(ist, sym(ist, #lab1), val1, sym(ist, #lab2), val2,   \
+                sym(ist, #lab3), val3, sym(ist, #lab4), val4,   \
+                sym(ist, #lab5), val5, sym(ist, #lab6), val6,   \
+                sym(ist, #lab7), val7, sym(ist, #lab8), val8 )
 
 // xxx_PARAM: Convenience macro for validation and assignment of params
 // index is 1..n where 1 is first parameter and n is last

Modified: trunk/include/prothon/prothon_dll.h
===================================================================
--- trunk/include/prothon/prothon_dll.h	2004-06-19 07:08:18 UTC (rev 644)
+++ trunk/include/prothon/prothon_dll.h	2004-06-20 00:42:44 UTC (rev 645)
@@ -90,6 +90,10 @@
 	obj_p		(*list10)(isp ist, obj_p p1, obj_p p2, obj_p p3, obj_p p4, 
 		                           obj_p p5, obj_p p6, obj_p p7, obj_p p8,
 								   obj_p p9, obj_p p10);
+	obj_p		(*list16)(isp ist, obj_p  item1, obj_p  item2, obj_p  item3, obj_p  item4, 
+			          obj_p  item5, obj_p  item6, obj_p  item7, obj_p  item8,
+			          obj_p  item9, obj_p item10, obj_p item11, obj_p item12,
+			          obj_p item13, obj_p item14, obj_p item15, obj_p item16);
 	obj_p		(*new_hash_obj)(isp ist, i32_t num);
 	obj_p		(*new_int_obj)(isp ist, i64_t num);
 	obj_p		(*new_float_obj)(isp ist, double num);
@@ -314,6 +318,7 @@
 #define list6				(*services->list6)
 #define list8				(*services->list8)
 #define list10				(*services->list10)
+#define list16				(*services->list16)
 #define raise_exception		(*services->raise_exception)
 #define new_object			(*services->new_object)
 #define copy_object_data	(*services->copy_object_data)

Modified: trunk/pr/test/test.pr
===================================================================
--- trunk/pr/test/test.pr	2004-06-19 07:08:18 UTC (rev 644)
+++ trunk/pr/test/test.pr	2004-06-20 00:42:44 UTC (rev 645)
@@ -1,15 +1,3 @@
 #!/usr/bin/env prothon
 
-l = [1,2]
-print l +! [3,4]
-print l
-
-print l *! 2
-print l
-
-print l *! 1
-print l
-
-print l *! 0
-print l
-
+print DateTime(1975, 10, 19)

Modified: trunk/src/builtins-file.c
===================================================================
--- trunk/src/builtins-file.c	2004-06-19 07:08:18 UTC (rev 644)
+++ trunk/src/builtins-file.c	2004-06-20 00:42:44 UTC (rev 645)
@@ -495,7 +495,7 @@
 	filep = self->data.ptr;
 	time_obj = parms[1];
 	if (time_obj == OBJ(NONE)) time_obj = new_time_obj(ist, apr_time_now());
-	CHECK_TYPE_EXC(time_obj, OBJ(TIME_PROTO), time);
+	CHECK_TYPE_EXC(time_obj, OBJ(DATETIME_PROTO), time);
 	path = pr2c_strptr(ist, get_attr(ist, self, sym(ist, "path")));
 	path[strlen(path)-1] = 0;
 	aprerr = apr_file_mtime_set(path, time_obj->data.i64, filep->pool);
@@ -834,7 +834,7 @@
 	filep = self->data.ptr;
 	time_obj = parms[1];
 	if (time_obj == OBJ(NONE)) time_obj = new_time_obj(ist, apr_time_now());
-	CHECK_TYPE_EXC(time_obj, OBJ(TIME_PROTO), time);
+	CHECK_TYPE_EXC(time_obj, OBJ(DATETIME_PROTO), time);
 	path = pr2c_strptr(ist, get_attr(ist, self, sym(ist, "path")));
 	aprerr = apr_file_mtime_set(path, time_obj->data.i64, filep->pool);
 	IF_APR_ERR("setting file modification time") return NULL;
Modified: trunk/src/builtins-list.c
===================================================================
--- trunk/src/builtins-list.c	2004-06-19 07:08:18 UTC (rev 644)
+++ trunk/src/builtins-list.c	2004-06-20 00:42:44 UTC (rev 645)
@@ -248,6 +248,23 @@
 	return list_obj;
 }
 
+//********************************* list16 ************************************
+obj_p list16(isp ist, obj_p  item1, obj_p  item2, obj_p  item3, obj_p  item4, 
+			          obj_p  item5, obj_p  item6, obj_p  item7, obj_p  item8,
+			          obj_p  item9, obj_p item10, obj_p item11, obj_p item12,
+					  obj_p item13, obj_p item14, obj_p item15, obj_p item16) {
+	obj_p list_obj = NEW_LIST(16);
+	list_append_no_lock(list_obj, item1); list_append_no_lock(list_obj, item2);
+	list_append_no_lock(list_obj, item3); list_append_no_lock(list_obj, item4);
+	list_append_no_lock(list_obj, item5); list_append_no_lock(list_obj, item6);
+	list_append_no_lock(list_obj, item7); list_append_no_lock(list_obj, item8);
+	list_append_no_lock(list_obj, item9); list_append_no_lock(list_obj, item10);
+	list_append_no_lock(list_obj, item11); list_append_no_lock(list_obj, item12);
+	list_append_no_lock(list_obj, item13); list_append_no_lock(list_obj, item14);
+	list_append_no_lock(list_obj, item15); list_append_no_lock(list_obj, item16);
+	return list_obj;
+}
+
 //********************************* quicksort *********************************
 int obj_lt(obj_p a, obj_p b, isp ist, obj_p cmp_func) {
 	obj_p res, arr[4];

Modified: trunk/src/builtins-time.c
===================================================================
--- trunk/src/builtins-time.c	2004-06-19 07:08:18 UTC (rev 644)
+++ trunk/src/builtins-time.c	2004-06-20 00:42:44 UTC (rev 645)
@@ -63,53 +63,90 @@
 #include "object.h"
 #include <prothon/prothon_dll.h>
 
-MODULE_DECLARE(Time);
+MODULE_DECLARE(DateTime);
 
 //********************************* new_time_obj *****************************
 obj_p new_time_obj(isp ist, i64_t usecs){
-	obj_p obj = NEW_OBJ(Time_OBJ);
-	SET_TYPE_IF_EXC(Time_OBJ, obj, DATA_TYPE_IMMDATA) return NULL;
+	obj_p obj = NEW_OBJ(DateTime_OBJ);
+	SET_TYPE_IF_EXC(DateTime_OBJ, obj, DATA_TYPE_IMMDATA) return NULL;
 	obj->imm_data_len = 8;
 	obj->data.i64 = usecs;
 	obj->immutable = TRUE;
 	return obj;
 }
 
-MODULE_START(Time)
+MODULE_START(DateTime)
 {
-	Time_OBJ = OBJ(TIME_PROTO);
+	DateTime_OBJ = OBJ(DATETIME_PROTO);
 
-	set_obj_doc(Time_OBJ, "Time object prototype");
-	set_obj_id(Time_OBJ, *, Time);
+	set_obj_doc(DateTime_OBJ, "DateTime object prototype");
+	set_obj_id(DateTime_OBJ, *, DateTime);
 
-	set_attr(ist, OBJ(OBJECT), sym(ist, "Time"), Time_OBJ);
+	set_attr(ist, OBJ(OBJECT), sym(ist, "DateTime"), DateTime_OBJ);
 
-	SET_TYPE_IF_EXC(Time_OBJ, Time_OBJ, DATA_TYPE_IMMDATA) return;
-	Time_OBJ->imm_data_len = 8;
-	Time_OBJ->data.i64     = apr_time_now();
+	SET_TYPE_IF_EXC(DateTime_OBJ, DateTime_OBJ, DATA_TYPE_IMMDATA) return;
+	DateTime_OBJ->imm_data_len = 8;
+	DateTime_OBJ->data.i64     = apr_time_now();
 }
 
-DEF(Time, init_, FPARM1(usecs, NEW_INT(-1))) { 
-	apr_time_t usecs;
+DEF(DateTime, init_, FPARM8( year,        NEW_INT(0), month,  NEW_INT(0), 
+	                         day,         NEW_INT(0), hour,   NEW_INT(0),      
+						     minute,      NEW_INT(0), second, NEW_INT(0), 
+						     microsecond, NEW_INT(0), tzinfo, OBJ(NONE) ) ) {
+	apr_status_t aprerr;
+	apr_time_t result;
+	apr_time_exp_t aprxt;
+	i32_t year,month,day,hour,minute,second;
+	i64_t microsecond; 
+	obj_p tzinfo;
+
 	BIN_EMPTY_CHK();
-	INT_64_PARAM(1, usecs);
-	SET_TYPE_IF_EXC(Time_OBJ, self, DATA_TYPE_IMMDATA) return NULL;
+	INT_32_PARAM(1, year);
+	INT_32_PARAM(2, month);
+	INT_32_PARAM(3, day);
+	INT_32_PARAM(4, hour);
+	INT_32_PARAM(5, minute);
+	INT_32_PARAM(6, second);
+	INT_64_PARAM(7, microsecond);
+	tzinfo = parms[15];
+
+	SET_TYPE_IF_EXC(DateTime_OBJ, self, DATA_TYPE_IMMDATA) return NULL;
 	self->imm_data_len = 8;
-	if (usecs < 0)
+	if ( !year && !month && !day && !hour && 
+		!minute && !second && !microsecond ) {
 		self->data.i64 = apr_time_now();
-	else
-		self->data.i64 = usecs;
+		return OBJ(NONE);
+	}
+	if (!year && !month) {
+		self->data.i64 = 
+			(((i64_t)day)*24*60*60*1000000) + 
+		    (((i64_t)hour)*60*60*1000000) + 
+		    (((i64_t)minute)*60*1000000) + 
+		    (((i64_t)second)*1000000) + microsecond;
+		return OBJ(NONE);
+	}
+	memset(&aprxt, 0, sizeof(aprxt));
+	aprxt.tm_year = year-1900;
+	aprxt.tm_mon  = month-1;
+	aprxt.tm_mday = day;
+	aprxt.tm_hour = hour;
+	aprxt.tm_min  = minute;
+	aprxt.tm_sec  = second;
+	aprxt.tm_usec = (apr_int32_t) microsecond;
+	aprerr = apr_time_exp_gmt_get(&result, &aprxt);
+	IF_APR_ERR("converting time params") return NULL;
+	self->data.i64 = result;
 	return OBJ(NONE);
 }
 
-DEF(Time, hash_, NULL) { 
-	BIN_CONTENT_CHK(Time);
+DEF(DateTime, hash_, NULL) { 
+	BIN_CONTENT_CHK(DateTime);
 	return new_hash_obj(ist, self->data.i32[0]+self->data.i32[1]);
 }
 
-DEF(Time, cmp_, FORM_RPARAM){
-	BIN_CONTENT_CHK(Time);
-	CHECK_TYPE_EXC(parms[1], Time_OBJ, Time);
+DEF(DateTime, cmp_, FORM_RPARAM){
+	BIN_CONTENT_CHK(DateTime);
+	CHECK_TYPE_EXC(parms[1], DateTime_OBJ, DateTime);
 	if (self->data.i64 == parms[1]->data.i64)
 		return NEW_INT(0);
 	else if (self->data.i64 > parms[1]->data.i64)
@@ -118,16 +155,16 @@
 		return NEW_INT(-1);
 }
 
-DEF(Time, eq__QUES, FORM_RPARAM){
-	BIN_CONTENT_CHK(Time);
-	CHECK_TYPE_EXC(parms[1], Time_OBJ, Time);
+DEF(DateTime, eq__QUES, FORM_RPARAM){
+	BIN_CONTENT_CHK(DateTime);
+	CHECK_TYPE_EXC(parms[1], DateTime_OBJ, DateTime);
 	if (self->data.i64 == parms[1]->data.i64) return OBJ(PR_TRUE);
 	else                                      return OBJ(PR_FALSE);
 }
 
-DEF(Time, str_, FPARM1(spec, NEW_STRING(""))) {
+DEF(DateTime, str_, FPARM1(spec, NEW_STRING(""))) {
 	char buf[APR_RFC822_DATE_LEN], *spec;
-	BIN_STR_CHK(Time);
+	BIN_STR_CHK(DateTime);
 	STRING_PARAM(1, spec);
 	if (strlen(spec) > 0) {
 		raise_exception(ist, OBJ(OVERFLOW_EXC), "time str_ spec not supported yet");
@@ -137,14 +174,14 @@
 	return NEW_STRING(buf);
 }
 
-MAIN_MODULE_INIT(Time)
+MAIN_MODULE_INIT(DateTime)
 {
-	MODULE_SUB_INIT(Time);
-	MODULE_ADD_SYM(Time, init_);
-	MODULE_ADD_SYM(Time, str_);
-	MODULE_ADD_SYM(Time, hash_);
-	MODULE_ADD_SYM(Time, eq__QUES);
-	MODULE_ADD_SYM(Time, cmp_);
+	MODULE_SUB_INIT(DateTime);
+	MODULE_ADD_SYM(DateTime, init_);
+	MODULE_ADD_SYM(DateTime, str_);
+	MODULE_ADD_SYM(DateTime, hash_);
+	MODULE_ADD_SYM(DateTime, eq__QUES);
+	MODULE_ADD_SYM(DateTime, cmp_);
 
 	check_exceptions(ist);
 }

Modified: trunk/src/memory_mgr.c
===================================================================
--- trunk/src/memory_mgr.c	2004-06-19 07:08:18 UTC (rev 644)
+++ trunk/src/memory_mgr.c	2004-06-20 00:42:44 UTC (rev 645)
@@ -276,7 +276,7 @@
 			obj_count++;
 			if (obj->state != OBJ_STATE_NEW_OR_MARKED && !obj->del_locked) {
 				call_func(ist, obj, SYM(DEL_), 0, NULL, NULL);
-				ist->exception_obj = 0;
+				check_exceptions(ist);
 				mm_write_lock(ist, obj);
 				ist->exception_obj = 0;
 				obj->state = OBJ_STATE_DELETED;
@@ -316,7 +316,7 @@
 		while(obj) {
 			obj_count++;
 			call_func(ist, obj, SYM(DEL_), 0, NULL, NULL);
-			ist->exception_obj = 0;
+			check_exceptions(ist);
 			pr_lock(&object_list_lock); 
 			obj = obj->next_obj;
 			pr_unlock(&object_list_lock); 

Modified: trunk/src/object.c
===================================================================
--- trunk/src/object.c	2004-06-19 07:08:18 UTC (rev 644)
+++ trunk/src/object.c	2004-06-20 00:42:44 UTC (rev 645)
@@ -159,6 +159,7 @@
 	dll_services.list6			  = list6;		
 	dll_services.list8			  = list8;		
 	dll_services.list10			  = list10;		
+	dll_services.list16			  = list16;		
 	dll_services.raise_exception  = raise_exception;
 	dll_services.new_object       = new_object;
 	dll_services.copy_object_data = copy_object_data;
@@ -216,7 +217,7 @@
 	OBJ(TUPLE_PROTO)        = NEW_OBJ(OBJ(SEQ_PROTO));
 	OBJ(LIST_PROTO)         = NEW_OBJ(OBJ(TUPLE_PROTO));
 	OBJ(SYMBOL_PROTO)       = NEW_OBJ(NULL);
-	OBJ(TIME_PROTO)         = NEW_OBJ(NULL);
+	OBJ(DATETIME_PROTO)         = NEW_OBJ(NULL);
 
 	OBJ(HASH_PROTO)         = NEW_OBJ(NULL);
 	OBJ(SLICE_PROTO)        = NEW_OBJ(NULL);
@@ -264,7 +265,7 @@
 	BUILTIN_LOAD(String);
 	BUILTIN_LOAD(Thread);
 	BUILTIN_LOAD(Tuple);
-	BUILTIN_LOAD(Time);
+	BUILTIN_LOAD(DateTime);
 }
 
 //********************************* debug_object ******************************