rev 595 - in trunk: . pr/test src

SVN User <[email protected]> Thu, 10 Jun 2004 15:29:06 -0400
Newsgroups gmane.comp.lang.prothon.cvs
Message-ID <[email protected]>
Author: mark
Date: 2004-06-10 15:29:04 -0400 (Thu, 10 Jun 2004)
New Revision: 595

Modified:
   trunk/STATUS.txt
   trunk/pr/test/test.pr
   trunk/src/builtins-bytes.c
   trunk/src/builtins-int.c
   trunk/src/object.h
   trunk/src/prothon.y
Log:
added list of ints constructor to Bytes object

Modified: trunk/STATUS.txt
===================================================================
--- trunk/STATUS.txt	2004-06-10 07:23:26 UTC (rev 594)
+++ trunk/STATUS.txt	2004-06-10 19:29:04 UTC (rev 595)
@@ -3,6 +3,7 @@
 
 --- allow lists of ints in Bytes constructor
 --- allow Bytes object in String constructor with encoding param
+--- allow lists of ints in Bytes constructor
 
 --- allow tracebacks in the constructors to exception objects or raise command
 

Modified: trunk/pr/test/test.pr
===================================================================
--- trunk/pr/test/test.pr	2004-06-10 07:23:26 UTC (rev 594)
+++ trunk/pr/test/test.pr	2004-06-10 19:29:04 UTC (rev 595)
@@ -1,109 +1,3 @@
 #!/usr/bin/env prothon
 
-# strmod.pr
-
-# TODO:
-#  *) More comprehensive tests, especially replace() and split().
-#  *) Test binary string handling (when parser is fixed).
-
-failures = 0
-
-s = "test %4d..%4.2e..%s" % (-12, 100/3, 'jhgdjhg')
-
-if s != 'test  -12..3.33e+01..jhgdjhg': 
-	print 'error 1'
-	print s
-	failures = failures+1
-	
-if "abCDefG".lower() != "abcdefg":
-	print "lower() failed!"
-	failures = failures+1
-
-if "abCDefG345%^&".lower() != "abcdefg345%^&":
-	print "lower() failed!"
-	failures = failures+1
-
-if "abCDefG".upper() != "ABCDEFG":
-	print "upper() failed!"
-	failures = failures+1
-
-if "+_098abCDefG".upper() != "+_098ABCDEFG":
-	print "upper() failed!"
-	failures = failures+1
-
-if "abCDefG".replace("CDe","456") != "ab456fG":
-	print "replace() failed!"
-	failures = failures+1
-
-if "abcdefg".capitalize() != "Abcdefg":
-	print "capitalize() failed!"
-	failures = failures+1
-
-if "a\tb\tcde".expandTabs() != "a        b        cde":
-	print "expandtabs() failed!"
-	failures = failures+1
-
-if " \t \r\n abc".lStrip() != "abc":
-	print "lstrip() failed!"
-	failures = failures+1
-
-if "abc \t \r\n ".rStrip() != "abc":
-	print "rstrip() failed!"
-	failures = failures+1
-
-if " \t \r\n abc \t \r\n ".strip() != "abc":
-	print "strip() failed!"
-	failures = failures+1
-
-if ".a.bc.def.ghij.".split('.') != ['', 'a', 'bc', 'def', 'ghij', '']:
-	print "split() failed!"
-	failures = failures+1
-
-if "a.bc.def.ghij".split('.') != ['a', 'bc', 'def', 'ghij']:
-	print "split() failed!"
-	failures = failures+1
-
-if "a.bc.def.ghij.".split('.') != ['a', 'bc', 'def', 'ghij', '']:
-	print "split() failed!"
-	failures = failures+1
-
-if "..a.bc.def.ghij.".split('.') != ['', '', 'a', 'bc', 'def', 'ghij', '']:
-	print "split() failed!"
-	failures = failures+1
-
-if "a.bc.def.ghij".split('a') != ['', '.bc.def.ghij']:
-	print "split() failed!"
-	failures = failures+1
-
-if "a.ab.abc.abcd".split('a') != ['', '.', 'b.', 'bc.', 'bcd']:
-	print "split() failed!"
-	failures = failures+1
-
-if ".a.ab.abc.abcd".split('a') != ['.', '.', 'b.', 'bc.', 'bcd']:
-	print "split() failed!"
-	failures = failures+1
-
-if ".a.ab.abc.abcd.".split('a') != ['.', '.', 'b.', 'bc.', 'bcd.']:
-	print "split() failed!"
-	failures = failures+1
-
-if "aaaaabaacaadaaaaabaacaad".split("aab") != ["aaa","aacaadaaa","aacaad"]:
-	print "split() failed!"
-	failures = failures+1
-
-if "aaaaabaacaadaaaaabaacaad".find("aab",0) != 3:
-	print "split() failed!"
-	failures = failures+1
-
-s = "%d" % 3333
-
-if s != '3333': 
-	print 'error 2'
-	print s
-	failures = failures+1
-
-if failures==0:
-	print '\nall tests passed\n'
-else:
-	print "%d failure(s) occurred!\n"%failures
-	Sys.exit(1)
+Bytes([9999999999999999999999999999999999999999999])
\ No newline at end of file

Modified: trunk/src/builtins-bytes.c
===================================================================
--- trunk/src/builtins-bytes.c	2004-06-10 07:23:26 UTC (rev 594)
+++ trunk/src/builtins-bytes.c	2004-06-10 19:29:04 UTC (rev 595)
@@ -138,7 +138,6 @@
 		char* encoding_str;
 		int latin = FALSE;
 		u8_t* buf;
-
 		STRING_PARAM(2, encoding_str);
 		if (!strcmp(encoding_str, "latin-1"))
 			latin = TRUE;
@@ -159,6 +158,35 @@
 		pr_str2bytes(ist, buf, parms[1], latin);
 		self->immutable = TRUE;
 		return OBJ(NONE);
+	} else if (has_proto(ist, parms[1], OBJ(LIST_PROTO))) {
+		obj_p list = parms[1];
+		size_t i, len = list_len(ist, list);
+		u8_t* bufp;
+		if (len <= IMM_DATA_LEN) {
+			SET_TYPE_IF_EXC(OBJ(BYTES_PROTO), self, DATA_TYPE_IMMDATA) return NULL;
+			self->imm_data_len = (int) len;
+			bufp = self->data.bytes;
+		} else {
+			obj_byt = obj_malloc(ist, OBJ(BYTES_PROTO), self, sizeof(byt_t)+len); if_exc_return NULL;
+			obj_byt->len = (data_size_t) len;
+			bufp = &(obj_byt->byt[0]);
+		}
+		for(i=0; i < len; i++) {
+			i32_t val;
+			obj_p item = list_item(ist, list, (int) i);
+			if (!has_proto(ist, item, OBJ(INT_PROTO))) {
+				raise_exception(ist, OBJ(VALUE_EXC), "list item must be an integer");
+				return NULL;
+			}
+			val = int2i32t(ist, item); if_exc_return NULL;
+			if (val < 0 || val > 255) {
+				raise_exception(ist, OBJ(VALUE_EXC), "invalid byte value(%d)", val);
+				return NULL;
+			}
+			*(bufp++) = (u8_t) val;
+		}
+		self->immutable = TRUE;
+		return OBJ(NONE);
 	} else if (has_proto(ist, parms[1], OBJ(BYTES_PROTO))) {
 		return copy_object(ist, parms[1]);
 	} else {
Modified: trunk/src/builtins-int.c
===================================================================
--- trunk/src/builtins-int.c	2004-06-10 07:23:26 UTC (rev 594)
+++ trunk/src/builtins-int.c	2004-06-10 19:29:04 UTC (rev 595)
@@ -246,7 +246,7 @@
 }
 
 /* Create a new long int object from a C double */
-long_p  double2longp(double dval) {
+long_p  double2longp(isp ist, double dval) {
 	long_p v;
 	double frac;
 	int i, ndig, expo, neg;
@@ -282,7 +282,7 @@
 /* Get a C long int from a long int object.
   Returns -1 and sets an error condition if overflow occurs. */
 
-i64_t longp2int64(long_p vv) {
+i64_t longp2int64(isp ist, long_p vv) {
 	/* This version by Tim Peters */
 	register long_p v;
 	u64_t x, prev;
@@ -317,7 +317,42 @@
 	return -1;
 }
 
-size_t _PyLong_NumBits(long_p vv)
+i32_t longp2int32(isp ist, long_p vv) {
+	/* This version by Tim Peters */
+	register long_p v;
+	u64_t x, prev;
+	int i, sign;
+
+	v = (long_p) vv;
+	i = v->dsize;
+	sign = 1;
+	x = 0;
+	if (i < 0) {
+		sign = -1;
+		i = -(i);
+	}
+	while (--i >= 0) {
+		prev = x;
+		x = (x << SHIFT) + v->digit[i];
+		if ((x >> SHIFT) != prev)
+			goto overflow;
+	}
+	/* Haven't lost any bits, but if the sign bit is set we're in
+	 * trouble *unless* this is the min negative number. So,
+	 * trouble iff sign bit set && (positive || some bit set other
+	 * than the sign bit).
+	 */
+	if ((i32_t) x < 0 && (sign > 0 || (x << 1) != 0))
+		goto overflow;
+	return (i32_t) x * sign;
+
+ overflow:
+	raise_exception(ist, OBJ(OVERFLOW_EXC),
+			"long int too large to convert to int");
+	return -1;
+}
+
+size_t _PyLong_NumBits(isp ist, long_p vv)
 {
 	long_p v = (long_p)vv;
 	size_t result = 0;
@@ -397,7 +432,7 @@
 
 /* Get a C double from a long int object. */
 
-double PyLong_AsDouble(long_p vv)
+double PyLong_AsDouble(isp ist, long_p vv)
 {
 	int e;
 	double x;
@@ -684,7 +719,7 @@
  * The point to this routine is that it takes time linear in the number of
  * string characters.
  */
-static long_p long_from_binary_base(char **str, int base) {
+static long_p long_from_binary_base(isp ist, char **str, int base) {
 	char *p = *str;
 	char *start = p;
 	int bits_per_char;
@@ -765,7 +800,7 @@
 	return long_normalize(z);
 }
 
-long_p PyLong_FromString(char *str, char **pend, int base)
+long_p cstr2longp(isp ist, char *str, char **pend, int base)
 {
 	int sign = 1;
 	char *start, *orig_str = str;
@@ -798,7 +833,7 @@
 		str += 2;
 	start = str;
 	if ((base & (base - 1)) == 0)
-		z = long_from_binary_base(&str, base);
+		z = long_from_binary_base(ist, &str, base);
 	else {
 		z = new_longp_non_init(0);
 		for ( ; z != NULL; ++str) {
@@ -842,7 +877,7 @@
 }
 
 #ifdef Py_USING_UNICODE
-long_p PyLong_FromUnicode(Py_UNICODE *u, int length, int base)
+long_p PyLong_FromUnicode(isp ist, Py_UNICODE *u, int length, int base)
 {
 	long_p result;
 	char *buffer = PyMem_MALLOC(length+1);
@@ -854,21 +889,18 @@
 		PyMem_FREE(buffer);
 		return NULL;
 	}
-	result = PyLong_FromString(buffer, NULL, base);
+	result = cstr2longp(ist, buffer, NULL, base);
 	PyMem_FREE(buffer);
 	return result;
 }
 #endif
 
 /* forward */
-static long_p x_divrem
-	(long_p, long_p, long_p *);
-static int long_divrem(long_p, long_p,
-	long_p *, long_p *);
+static long_p x_divrem(long_p, long_p, long_p *);
 
 /* Long division with remainder, top-level routine */
 
-static int long_divrem(long_p a, long_p b, long_p *pdiv, long_p *prem) {
+static int long_divrem(isp ist, long_p a, long_p b, long_p *pdiv, long_p *prem) {
 	int size_a = abs(a->dsize), size_b = abs(b->dsize);
 	long_p z;
 
@@ -1533,11 +1565,11 @@
   have different signs. We then subtract one from the 'div'
   part of the outcome to keep the invariant intact. */
 
-static int l_divmod(long_p v, long_p w, long_p *pdiv, long_p *pmod)
+static int l_divmod(isp ist, long_p v, long_p w, long_p *pdiv, long_p *pmod)
 {
 	long_p div, mod;
 
-	if (long_divrem(v, w, &div, &mod) < 0)
+	if (long_divrem(ist, v, w, &div, &mod) < 0)
 		return -1;
 	if ((mod->dsize < 0 && w->dsize > 0) ||
 	  (mod->dsize > 0 && w->dsize < 0)) {
@@ -1573,7 +1605,7 @@
 
 	CONVERT_BINOP(v, w, &a, &b);
 
-	if (l_divmod(a, b, &div, &mod) < 0) {
+	if (l_divmod(ist, a, b, &div, &mod) < 0) {
 		pr_free(a);
 		pr_free(b);
 		return NULL;
@@ -1584,13 +1616,13 @@
 	return (long_p) div;
 }
 
-static long_p long_mod(long_p v, long_p w)
+static long_p long_mod(isp ist, long_p v, long_p w)
 {
 	long_p a, b, div, mod;
 
 	CONVERT_BINOP(v, w, &a, &b);
 
-	if (l_divmod(a, b, &div, &mod) < 0) {
+	if (l_divmod(ist, a, b, &div, &mod) < 0) {
 		pr_free(a);
 		pr_free(b);
 		return NULL;
@@ -1603,7 +1635,7 @@
 
 // w must be positive
 // handle negative using floats without calling this
-static long_p long_pow(long_p v, long_p w, long_p x)
+static long_p long_pow(isp ist, long_p v, long_p w, long_p x)
 {
 	long_p a, b;
 	long_p c;
@@ -1630,7 +1662,7 @@
 			if (bi & 1) {
 				temp = (long_p)long_mul(z, a);
 			 	if (c && temp!=NULL) {
-			 		if (l_divmod(temp,(long_p)c,
+			 		if (l_divmod(ist, temp,(long_p)c,
 							&div,&mod) < 0) {
 						pr_free(temp);
 						pr_free(z);
@@ -1651,7 +1683,7 @@
 				break;
 			temp = (long_p)long_mul(a, a);
 		 	if (c && temp!=NULL) {
-			 	if (l_divmod(temp, (long_p)c, &div,
+			 	if (l_divmod(ist, temp, (long_p)c, &div,
 							&mod) < 0) {
 					pr_free(temp);
 					pr_free(z);
@@ -1674,7 +1706,7 @@
 			break;
 	}
 	if (c && z!=NULL) {
-		if (l_divmod(z, (long_p)c, &div, &mod) < 0) {
+		if (l_divmod(ist, z, (long_p)c, &div, &mod) < 0) {
 //			pr_free(z);
 			z = NULL;
 		}
@@ -1691,7 +1723,7 @@
 	return (long_p) z;
 }
 
-static long_p long_invert(long_p v)
+static long_p long_invert(isp ist, long_p v)
 {
 	/* Implement ~x as -(x+1) */
 	long_p x;
@@ -1707,7 +1739,7 @@
 	return (long_p)x;
 }
 
-static long_p long_rshift(long_p v, long_p w) {
+static long_p long_rshift(isp ist, long_p v, long_p w) {
 	long_p a, b;
 	long_p z = NULL;
 	i64_t shiftby, newsize, wordshift, loshift, hishift;
@@ -1719,19 +1751,19 @@
 	if (a->dsize < 0) {
 		/* Right shifting negative numbers is harder */
 		long_p a1, a2;
-		a1 = (long_p) long_invert(a);
+		a1 = (long_p) long_invert(ist, a);
 		if (a1 == NULL)
 			goto rshift_error;
-		a2 = (long_p) long_rshift(a1, b);
+		a2 = (long_p) long_rshift(ist, a1, b);
 		pr_free(a1);
 		if (a2 == NULL)
 			goto rshift_error;
-		z = (long_p) long_invert(a2);
+		z = (long_p) long_invert(ist, a2);
 		pr_free(a2);
 	}
 	else {
 
-		shiftby = longp2int64((long_p)b);
+		shiftby = longp2int64(ist, (long_p)b);
 		if (shiftby < 0) {
 			raise_exception(ist, OBJ(VALUE_EXC),
 					"negative shift count");
@@ -1769,7 +1801,7 @@
 
 }
 
-static long_p long_lshift(long_p v, long_p w)
+static long_p long_lshift(isp ist, long_p v, long_p w)
 {
 	/* This version due to Tim Peters */
 	long_p a, b;
@@ -1780,7 +1812,7 @@
 
 	CONVERT_BINOP(v, w, &a, &b);
 
-	shiftby = longp2int64((long_p)b);
+	shiftby = longp2int64(ist, (long_p)b);
 	if (shiftby < 0) {
 		raise_exception(ist, OBJ(VALUE_EXC), "negative shift count");
 		goto lshift_error;
@@ -1825,7 +1857,7 @@
 
 /* Bitwise and/xor/or operations */
 
-static long_p long_bitwise(long_p a, int op, /* '&', '|', '^' */ long_p b)
+static long_p long_bitwise(isp ist, long_p a, int op, /* '&', '|', '^' */ long_p b)
 {
 	digit maska, maskb; /* 0 or MASK */
 	int negz;
@@ -1836,7 +1868,7 @@
 	long_p v;
 
 	if (a->dsize < 0) {
-		a = (long_p) long_invert(a);
+		a = (long_p) long_invert(ist, a);
 		maska = MASK;
 	}
 	else {
@@ -1844,7 +1876,7 @@
 		maska = 0;
 	}
 	if (b->dsize < 0) {
-		b = (long_p) long_invert(b);
+		b = (long_p) long_invert(ist, b);
 		maskb = MASK;
 	}
 	else {
@@ -1915,38 +1947,38 @@
 	z = long_normalize(z);
 	if (negz == 0)
 		return (long_p) z;
-	v = long_invert(z);
+	v = long_invert(ist, z);
 	pr_free(z);
 	return v;
 }
 
-static long_p long_and(long_p v, long_p w) {
+static long_p long_and(isp ist, long_p v, long_p w) {
 	long_p a, b;
 	long_p c;
 	CONVERT_BINOP(v, w, &a, &b);
-	c = long_bitwise(a, '&', b);
+	c = long_bitwise(ist, a, '&', b);
 	pr_free(a);
 	pr_free(b);
 	return c;
 }
 
-static long_p long_xor(long_p v, long_p w)
+static long_p long_xor(isp ist, long_p v, long_p w)
 {
 	long_p a, b;
 	long_p c;
 	CONVERT_BINOP(v, w, &a, &b);
-	c = long_bitwise(a, '^', b);
+	c = long_bitwise(ist, a, '^', b);
 	pr_free(a);
 	pr_free(b);
 	return c;
 }
 
-static long_p long_or(long_p v, long_p w)
+static long_p long_or(isp ist, long_p v, long_p w)
 {
 	long_p a, b;
 	long_p c;
 	CONVERT_BINOP(v, w, &a, &b);
-	c = long_bitwise(a, '|', b);
+	c = long_bitwise(ist, a, '|', b);
 	pr_free(a);
 	pr_free(b);
 	return c;
@@ -1989,10 +2021,16 @@
 		raise_exception(ist, OBJ(INTERNAL_EXC),					
 			"object has wrong binary data, expected Integer");	
 		return 0; }											
-	if (self->data_type == DATA_TYPE_IMMDATA)
+	if (self->data_type == DATA_TYPE_IMMDATA) {
+		if ( self->data.i64 >  ((i64_t) 0x7fffffff) || 
+			 self->data.i64 < -((i64_t) 0x80000000) ) {
+			raise_exception(ist, OBJ(OVERFLOW_EXC),					
+						         "integer too large to convert");	
+			return 0;											
+		}
 		return (i32_t) self->data.i64;
-	else
-		return (i32_t) longp2int64(self->data.ptr);
+	} else
+		return longp2int32(ist, self->data.ptr);
 }
 
 i64_t int2i64t(isp ist, obj_p self) {
@@ -2005,9 +2043,9 @@
 			"object has wrong binary data, expected Integer");	
 		return 0; }											
 	if (self->data_type == DATA_TYPE_IMMDATA)
-		return (i32_t) self->data.i64;
+		return self->data.i64;
 	else
-		return longp2int64(self->data.ptr);
+		return longp2int64(ist, self->data.ptr);
 }
 
 // ***************************** INT MODULE ***********************************
@@ -2227,7 +2265,7 @@
 			b = new_longp(other->data.i64);
 		else
 			b = other->data.ptr;
-		return new_int_long_obj(ist, long_mod(a,b));
+		return new_int_long_obj(ist, long_mod(ist, a,b));
 	}
 }
 
@@ -2318,7 +2356,7 @@
 		b = new_longp(other->data.i64);
 	else
 		b = other->data.ptr;
-	return new_int_long_obj(ist, long_pow(a, b, NULL));
+	return new_int_long_obj(ist, long_pow(ist, a, b, NULL));
 }
 
 DEF(Int, cmp, FORM_RPARAM){
@@ -2385,7 +2423,7 @@
 	if ( self->data_type  == DATA_TYPE_IMMDATA)
 		return NEW_INT( ~ int_imm_value(self) );
 	else
-		return new_int_long_obj(ist, long_invert(self->data.ptr));
+		return new_int_long_obj(ist, long_invert(ist, self->data.ptr));
 }
 
 DEF(Int, xor_, FORM_RPARAM) {
@@ -2408,7 +2446,7 @@
 			b = new_longp(other->data.i64);
 		else
 			b = other->data.ptr;
-		return new_int_long_obj(ist, long_xor(a, b));
+		return new_int_long_obj(ist, long_xor(ist, a, b));
 	}
 }
 
@@ -2432,7 +2470,7 @@
 			b = new_longp(other->data.i64);
 		else
 			b = other->data.ptr;
-		return new_int_long_obj(ist, long_and(a, b));
+		return new_int_long_obj(ist, long_and(ist, a, b));
 	}
 }
 
@@ -2456,7 +2494,7 @@
 			b = new_longp(other->data.i64);
 		else
 			b = other->data.ptr;
-		return new_int_long_obj(ist, long_or(a, b));
+		return new_int_long_obj(ist, long_or(ist, a, b));
 	}
 }
 
@@ -2484,7 +2522,7 @@
 			b = new_longp(other->data.i64);
 		else
 			b = other->data.ptr;
-		return new_int_long_obj(ist, long_rshift(a, b));
+		return new_int_long_obj(ist, long_rshift(ist, a, b));
 	}
 }
 
@@ -2512,7 +2550,7 @@
 			b = new_longp(other->data.i64);
 		else
 			b = other->data.ptr;
-		return new_int_long_obj(ist, long_lshift(a, b));
+		return new_int_long_obj(ist, long_lshift(ist, a, b));
 	}
 }
 

Modified: trunk/src/object.h
===================================================================
--- trunk/src/object.h	2004-06-10 07:23:26 UTC (rev 594)
+++ trunk/src/object.h	2004-06-10 19:29:04 UTC (rev 595)
@@ -144,7 +144,7 @@
 obj_p new_hash_obj(isp ist, i32_t num);
 obj_p new_int_obj(isp ist, i64_t num);
 obj_p new_int_long_obj(isp ist, long_p longp);
-long_p PyLong_FromString(char *str, char **pend, int base);
+long_p cstr2longp(isp ist, char *str, char **pend, int base);
 obj_p long_format(long_p aa, int base, int addL);\
 long_p new_longp(i64_t ival);
 int int_is_zero(obj_p obj);

Modified: trunk/src/prothon.y
===================================================================
--- trunk/src/prothon.y	2004-06-10 07:23:26 UTC (rev 594)
+++ trunk/src/prothon.y	2004-06-10 19:29:04 UTC (rev 595)
@@ -73,6 +73,7 @@
 #include <apr_strings.h>
 
 #define state ((parse_state*) yylex_param)
+#define IST  (((parse_state*) yylex_param)->ist)
 
 #define TD new_string_obj(state->ist, "~")
 
@@ -992,9 +993,9 @@
 		str_ptr[str_index++]=0;		
 		str_ptr = pr_realloc(str_ptr, str_index);
 		if (x_flag)
-			lvalp->str_type = new_bytes_obj((((parse_state*) yylex_param)->ist), str_ptr, str_index-1);
+			lvalp->str_type = new_bytes_obj(IST, str_ptr, str_index-1);
 		else
-			lvalp->str_type = new_string_n_obj((((parse_state*) yylex_param)->ist), str_ptr, str_index-1); 
+			lvalp->str_type = new_string_n_obj(IST, str_ptr, str_index-1); 
 #ifdef TRACE_PARSER
 	if (trace_parser){
 		fprintf(((parse_state*) yylex_param)->debug_stream, "\"%s\"\n",str_ptr);
@@ -1160,7 +1161,7 @@
 		if (!strcmp(str_ptr,"yield")) 	return YIELD;
 
 		str_ptr = pr_realloc(str_ptr, str_index);
-		lvalp->str_type = new_string_n_obj((((parse_state*) yylex_param)->ist), str_ptr, str_index-1); 
+		lvalp->str_type = new_string_n_obj(IST, str_ptr, str_index-1); 
 #ifdef TRACE_PARSER
 	if (trace_parser){
 		fprintf(((parse_state*) yylex_param)->debug_stream, "\"%s\"\n",str_ptr);
@@ -1217,17 +1218,14 @@
 					ungetch(c, state);
 				str_ptr[str_index++] = 0;
 				if (hex_flag) {
-					lvalp->int_type = new_int_long_obj( (((parse_state*) yylex_param)->ist), 
-													    PyLong_FromString(str_ptr+2, NULL, 16) );
+					lvalp->int_type = new_int_long_obj( IST, cstr2longp(IST, str_ptr+2, NULL, 16) );
 				} else if (str_ptr[0] == '0' && strlen(str_ptr) > 2) {
-					lvalp->int_type = new_int_long_obj( (((parse_state*) yylex_param)->ist), 
-														PyLong_FromString(str_ptr+1, NULL, 8) );
+					lvalp->int_type = new_int_long_obj( IST, cstr2longp(IST, str_ptr+1, NULL, 8) );
 				} else {
 					if (strlen(str_ptr) < 16)
-						lvalp->int_type = new_int_obj((((parse_state*) yylex_param)->ist), apr_atoi64(str_ptr));
+						lvalp->int_type = new_int_obj(IST, apr_atoi64(str_ptr));
 					else
-						lvalp->int_type = new_int_long_obj( (((parse_state*) yylex_param)->ist), 
-						                                    PyLong_FromString(str_ptr, NULL, 10) );
+						lvalp->int_type = new_int_long_obj( IST, cstr2longp(IST, str_ptr, NULL, 10) );
 				}
 				if (nonzero_flag && int_is_zero(lvalp->int_type)){
 					printf("Lexical error: invalid integer number format\n");