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 ******************************