diff options
69 files changed, 0 insertions, 20705 deletions
diff --git a/TSRM/Makefile.am b/TSRM/Makefile.am deleted file mode 100644 index 6bea4e8cc6..0000000000 --- a/TSRM/Makefile.am +++ /dev/null @@ -1,4 +0,0 @@ -## process this file with automake to produce Makefile.am -AUTOMAKE_OPTIONS=foreign -lib_LIBRARIES=libtsrm.a -libtsrm_a_SOURCES = TSRM.c diff --git a/TSRM/TSRM.c b/TSRM/TSRM.c deleted file mode 100644 index 8178d37035..0000000000 --- a/TSRM/TSRM.c +++ /dev/null @@ -1,424 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | Thread Safe Resource Manager | - +----------------------------------------------------------------------+ - | Copyright (c) 1998, 1999 Zeev Suraski | - +----------------------------------------------------------------------+ - | This source file is subject to the Zend license, that is bundled | - | with this package in the file LICENSE. If you did not receive a | - | copy of the Zend license, please mail us at zend@zend.com so we can | - | send you a copy immediately. | - +----------------------------------------------------------------------+ - | Author: Zeev Suraski <zeev@zend.com> | - +----------------------------------------------------------------------+ -*/ - - -#include "TSRM.h" -#include <stdio.h> -#include <stdlib.h> - -#if HAVE_STDARG_H -#include <stdarg.h> -#endif - -typedef struct _tsrm_tls_entry tsrm_tls_entry; - -struct _tsrm_tls_entry { - void **storage; - int count; - THREAD_T thread_id; - tsrm_tls_entry *next; -}; - - -typedef struct { - size_t size; - void (*ctor)(void *resource); - void (*dtor)(void *resource); -} tsrm_resource_type; - - -/* The memory manager table */ -static tsrm_tls_entry **tsrm_tls_table; -static int tsrm_tls_table_size; -static ts_rsrc_id id_count; - -/* The resource sizes table */ -static tsrm_resource_type *resource_types_table; -static int resource_types_table_size; - - -static MUTEX_T tsmm_mutex; /* thread-safe memory manager mutex */ - -/* New thread handlers */ -static void (*tsrm_new_thread_begin_handler)(); -static void (*tsrm_new_thread_end_handler)(); - -/* Debug support */ -static int tsrm_debug(const char *format, ...); -static int tsrm_debug_status; - - -/* Startup TSRM (call once for the entire process) */ -TSRM_API int tsrm_startup(int expected_threads, int expected_resources, int debug_status) -{ - tsrm_tls_table_size = expected_threads; - tsrm_tls_table = (tsrm_tls_entry **) calloc(tsrm_tls_table_size, sizeof(tsrm_tls_entry *)); - if (!tsrm_tls_table) { - return 0; - } - id_count=0; - - resource_types_table_size = expected_resources; - resource_types_table = (tsrm_resource_type *) calloc(resource_types_table_size, sizeof(tsrm_resource_type)); - if (!resource_types_table) { - free(tsrm_tls_table); - return 0; - } - - tsmm_mutex = tsrm_mutex_alloc(); - - tsrm_new_thread_begin_handler = tsrm_new_thread_end_handler = NULL; - - tsrm_debug_status = debug_status; - - tsrm_debug("Started up TSRM, %d expected threads, %d expected resources\n", expected_threads, expected_resources); - return 1; -} - - -/* Shutdown TSRM (call once for the entire process) */ -TSRM_API void tsrm_shutdown() -{ - int i; - - if (tsrm_tls_table) { - for (i=0; i<tsrm_tls_table_size; i++) { - tsrm_tls_entry *p = tsrm_tls_table[i], *next_p; - - while (p) { - int j; - - next_p = p->next; - for (j=0; j<id_count; j++) { - free(p->storage[j]); - } - free(p->storage); - free(p); - p = next_p; - } - } - free(tsrm_tls_table); - } - if (resource_types_table) { - free(resource_types_table); - } - tsrm_mutex_free(tsmm_mutex); - tsrm_debug("Shutdown TSRM\n"); -} - - -/* allocates a new thread-safe-resource id */ -TSRM_API ts_rsrc_id ts_allocate_id(size_t size, void (*ctor)(void *resource), void (*dtor)(void *resource)) -{ - ts_rsrc_id new_id; - int i; - - tsrm_debug("Obtaining a new resource id, %d bytes\n", size); - - tsrm_mutex_lock(tsmm_mutex); - - /* obtain a resource id */ - new_id = id_count++; - tsrm_debug("Obtained resource id %d\n", new_id); - - /* store the new resource type in the resource sizes table */ - if (resource_types_table_size < id_count) { - resource_types_table = (tsrm_resource_type *) realloc(resource_types_table, sizeof(tsrm_resource_type)*id_count); - if (!resource_types_table) { - return -1; - } - resource_types_table_size = id_count; - } - resource_types_table[new_id].size = size; - resource_types_table[new_id].ctor = ctor; - resource_types_table[new_id].dtor = dtor; - - /* enlarge the arrays for the already active threads */ - for (i=0; i<tsrm_tls_table_size; i++) { - tsrm_tls_entry *p = tsrm_tls_table[i]; - - while (p) { - if (p->count < id_count) { - int j; - - p->storage = (void *) realloc(p->storage, sizeof(void *)*id_count); - for (j=p->count; j<id_count; j++) { - p->storage[j] = (void *) malloc(resource_types_table[j].size); - if (resource_types_table[j].ctor) { - resource_types_table[j].ctor(p->storage[j]); - } - } - p->count = id_count; - } - p = p->next; - } - } - tsrm_mutex_unlock(tsmm_mutex); - - tsrm_debug("Successfully allocated new resource id %d\n", new_id); - return new_id; -} - - -static void allocate_new_resource(tsrm_tls_entry **thread_resources_ptr, THREAD_T thread_id) -{ - int i; - - if (tsrm_new_thread_begin_handler) { - tsrm_new_thread_begin_handler(thread_id); - } - - (*thread_resources_ptr) = (tsrm_tls_entry *) malloc(sizeof(tsrm_tls_entry)); - (*thread_resources_ptr)->storage = (void **) malloc(sizeof(void *)*id_count); - (*thread_resources_ptr)->count = id_count; - (*thread_resources_ptr)->thread_id = thread_id; - (*thread_resources_ptr)->next = NULL; - for (i=0; i<id_count; i++) { - (*thread_resources_ptr)->storage[i] = (void *) malloc(resource_types_table[i].size); - if (resource_types_table[i].ctor) { - resource_types_table[i].ctor((*thread_resources_ptr)->storage[i]); - } - } - if (tsrm_new_thread_end_handler) { - tsrm_new_thread_end_handler(thread_id); - } -} - - -/* fetches the requested resource for the current thread */ -void *ts_resource(ts_rsrc_id id) -{ - THREAD_T thread_id = tsrm_thread_id(); - int hash_value; - tsrm_tls_entry *thread_resources; - void *resource; - - tsrm_debug("Fetching resource id %d for thread %ld\n", id, (long) thread_id); - tsrm_mutex_lock(tsmm_mutex); - - hash_value = THREAD_HASH_OF(thread_id, tsrm_tls_table_size); - thread_resources = tsrm_tls_table[hash_value]; - - if (!thread_resources) { - allocate_new_resource(&tsrm_tls_table[hash_value], thread_id); - thread_resources = tsrm_tls_table[hash_value]; - } else { - do { - if (thread_resources->thread_id == thread_id) { - break; - } - if (thread_resources->next) { - thread_resources = thread_resources->next; - } else { - allocate_new_resource(&thread_resources->next, thread_id); - thread_resources = thread_resources->next; - break; - } - } while (thread_resources); - } - - resource = thread_resources->storage[id]; - - tsrm_mutex_unlock(tsmm_mutex); - - tsrm_debug("Successfully fetched resource id %d for thread id %ld - %x\n", id, (long) thread_id, (long) resource); - return resource; -} - - -/* frees all resources allocated for the current thread */ -void ts_free_thread() -{ - THREAD_T thread_id = tsrm_thread_id(); - int hash_value; - tsrm_tls_entry *thread_resources; - tsrm_tls_entry *last=NULL; - - tsrm_mutex_lock(tsmm_mutex); - hash_value = THREAD_HASH_OF(thread_id, tsrm_tls_table_size); - thread_resources = tsrm_tls_table[hash_value]; - - while (thread_resources) { - if (thread_resources->thread_id == thread_id) { - int i; - - for (i=0; i<thread_resources->count; i++) { - if (resource_types_table[i].dtor) { - resource_types_table[i].dtor(thread_resources->storage[i]); - } - free(thread_resources->storage[i]); - } - free(thread_resources->storage); - if (last) { - last->next = thread_resources->next; - } else { - tsrm_tls_table[hash_value]=NULL; - } - free(thread_resources); - break; - } - if (thread_resources->next) { - last = thread_resources; - } - thread_resources = thread_resources->next; - } - tsrm_mutex_unlock(tsmm_mutex); -} - - -/* deallocates all occurrences of a given id */ -void ts_free_id(ts_rsrc_id id) -{ -} - - - - -/* - * Utility Functions - */ - -/* Obtain the current thread id */ -TSRM_API THREAD_T tsrm_thread_id(void) -{ -#ifdef WIN32 - return GetCurrentThreadId(); -#elif defined(PTHREADS) - return pthread_self(); -#elif defined(NSAPI) - return systhread_current(); -#elif defined(PI3WEB) - return PIThread_getCurrent(); -#endif -} - - -/* Allocate a mutex */ -TSRM_API MUTEX_T tsrm_mutex_alloc( void ) -{ - MUTEX_T mutexp; - -#ifdef WIN32 - mutexp = CreateMutex(NULL,FALSE,NULL); -#elif defined(PTHREADS) - mutexp = (pthread_mutex_t *)malloc(sizeof(pthread_mutex_t)); - pthread_mutex_init(mutexp,NULL); -#elif defined(NSAPI) - mutexp = crit_init(); -#elif defined(PI3WEB) - mutexp = PIPlatform_allocLocalMutex(); -#endif -#ifdef THR_DEBUG - printf("Mutex created thread: %d\n",mythreadid()); -#endif - return( mutexp ); -} - - -/* Free a mutex */ -TSRM_API void tsrm_mutex_free( MUTEX_T mutexp ) -{ - if (mutexp) { -#ifdef WIN32 - CloseHandle(mutexp); -#elif defined(PTHREADS) - free(mutexp); -#elif defined(NSAPI) - crit_terminate(mutexp); -#elif defined(PI3WEB) - PISync_delete(mutexp) -#endif - } -#ifdef THR_DEBUG - printf("Mutex freed thread: %d\n",mythreadid()); -#endif -} - - -/* Lock a mutex */ -TSRM_API int tsrm_mutex_lock( MUTEX_T mutexp ) -{ - //tsrm_debug("Mutex locked thread: %ld\n",tsrm_thread_id()); -#ifdef WIN32 - return WaitForSingleObject(mutexp,1000); -#elif defined(PTHREADS) - return pthread_mutex_lock(mutexp); -#elif defined(NSAPI) - return crit_enter(mutexp); -#elif defined(PI3WEB) - return PISync_lock(mutexp); -#endif -} - - -/* Unlock a mutex */ -TSRM_API int tsrm_mutex_unlock( MUTEX_T mutexp ) -{ - //tsrm_debug("Mutex unlocked thread: %ld\n",tsrm_thread_id()); -#ifdef WIN32 - return ReleaseMutex(mutexp); -#elif defined(PTHREADS) - return pthread_mutex_unlock(mutexp); -#elif defined(NSAPI) - return crit_exit(mutexp); -#elif defined(PI3WEB) - return PISync_unlock(mutexp); -#endif -} - - -TSRM_API void *tsrm_set_new_thread_begin_handler(void (*new_thread_begin_handler)(THREAD_T thread_id)) -{ - void *retval = (void *) tsrm_new_thread_begin_handler; - - tsrm_new_thread_begin_handler = new_thread_begin_handler; - return retval; -} - - -TSRM_API void *tsrm_set_new_thread_end_handler(void (*new_thread_end_handler)(THREAD_T thread_id)) -{ - void *retval = (void *) tsrm_new_thread_end_handler; - - tsrm_new_thread_end_handler = new_thread_end_handler; - return retval; -} - - - -/* - * Debug support - */ - -static int tsrm_debug(const char *format, ...) -{ - if (tsrm_debug_status) { - va_list args; - int size; - - va_start(args, format); - size = vprintf(format, args); - va_end(args); - return size; - } else { - return 0; - } -} - - -void tsrm_debug_set(int status) -{ - tsrm_debug_status = status; -} diff --git a/TSRM/TSRM.dsp b/TSRM/TSRM.dsp deleted file mode 100644 index 7b284ab3eb..0000000000 --- a/TSRM/TSRM.dsp +++ /dev/null @@ -1,100 +0,0 @@ -# Microsoft Developer Studio Project File - Name="TSRM" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Static Library" 0x0104 - -CFG=TSRM - Win32 Debug_TS -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "TSRM.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "TSRM.mak" CFG="TSRM - Win32 Debug_TS" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "TSRM - Win32 Debug_TS" (based on "Win32 (x86) Static Library") -!MESSAGE "TSRM - Win32 Release_TS" (based on "Win32 (x86) Static Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "TSRM - Win32 Debug_TS" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "TSRM___Win32_Debug_TS" -# PROP BASE Intermediate_Dir "TSRM___Win32_Debug_TS" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "Debug_TS" -# PROP Intermediate_Dir "Debug_TS" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /I "C:\Projects\TSRM" /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c -# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "." /D "_DEBUG" /D "TSRM_EXPORTS" /D "WIN32" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c -# ADD BASE RSC /l 0x40d /d "_DEBUG" -# ADD RSC /l 0x40d /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo - -!ELSEIF "$(CFG)" == "TSRM - Win32 Release_TS" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "TSRM___Win32_Release_TS" -# PROP BASE Intermediate_Dir "TSRM___Win32_Release_TS" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Release_TS" -# PROP Intermediate_Dir "Release_TS" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c -# ADD CPP /nologo /MD /W3 /GX /O2 /I "." /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "TSRM_EXPORTS" /YX /FD /c -# ADD BASE RSC /l 0x40d /d "NDEBUG" -# ADD RSC /l 0x40d /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo - -!ENDIF - -# Begin Target - -# Name "TSRM - Win32 Debug_TS" -# Name "TSRM - Win32 Release_TS" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=.\TSRM.c -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# Begin Source File - -SOURCE=.\TSRM.h -# End Source File -# End Group -# End Target -# End Project diff --git a/TSRM/TSRM.h b/TSRM/TSRM.h deleted file mode 100644 index 9f55a7683d..0000000000 --- a/TSRM/TSRM.h +++ /dev/null @@ -1,103 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | Thread Safe Resource Manager | - +----------------------------------------------------------------------+ - | Copyright (c) 1998, 1999 Zeev Suraski | - +----------------------------------------------------------------------+ - | This source file is subject to the Zend license, that is bundled | - | with this package in the file LICENSE. If you did not receive a | - | copy of the Zend license, please mail us at zend@zend.com so we can | - | send you a copy immediately. | - +----------------------------------------------------------------------+ - | Author: Zeev Suraski <zeev@zend.com> | - +----------------------------------------------------------------------+ -*/ - - -#ifndef _TSRM_H -#define _TSRM_H - -#ifdef HAVE_CONFIG_H -# undef PACKAGE -# undef VERSION -# include "tsrm_config.h" -# undef PACKAGE -# undef VERSION -#endif - -#if WIN32||WINNT -# include <windows.h> -#elif defined(PTHREADS) -# include <pthread.h> -#endif - -typedef int ts_rsrc_id; - -#if WIN32||WINNT -# ifdef TSRM_EXPORTS -# define TSRM_API __declspec(dllexport) -# else -# define TSRM_API __declspec(dllimport) -# endif -#else -# define TSRM_API -#endif - - -/* Define THREAD_T and MUTEX_T */ -#if defined(WIN32) -# define THREAD_T DWORD -# define MUTEX_T void * -#elif defined(PTHREADS) -# define THREAD_T pthread_t -# define MUTEX_T pthread_mutex_t * -#elif defined(NSAPI) -# define THREAD_T SYS_THREAD -# define MUTEX_T CRITICAL -#elif defined(PI3WEB) -# define THREAD_T PIThread * -# define MUTEX_T PISync * -#endif - - -#define THREAD_HASH_OF(thr,ts) thr%ts - -#ifdef __cplusplus -extern "C" { -#endif - -/* startup/shutdown */ -TSRM_API int tsrm_startup(int expected_threads, int expected_resources, int debug_status); -TSRM_API void tsrm_shutdown(); - -/* allocates a new thread-safe-resource id */ -TSRM_API ts_rsrc_id ts_allocate_id(size_t size, void (*ctor)(void *resource), void (*dtor)(void *resource)); - -/* fetches the requested resource for the current thread */ -TSRM_API void *ts_resource(ts_rsrc_id id); - -/* frees all resources allocated for the current thread */ -TSRM_API void ts_free_thread(); - -/* deallocates all occurrences of a given id */ -TSRM_API void ts_free_id(ts_rsrc_id id); - - -/* Debug support */ -TSRM_API void tsrm_debug_set(int status); - -/* utility functions */ -TSRM_API THREAD_T tsrm_thread_id(void); -TSRM_API MUTEX_T tsrm_mutex_alloc(void); -TSRM_API void tsrm_mutex_free(MUTEX_T mutexp); -TSRM_API int tsrm_mutex_lock(MUTEX_T mutexp); -TSRM_API int tsrm_mutex_unlock(MUTEX_T mutexp); - -TSRM_API void *tsrm_set_new_thread_begin_handler(void (*new_thread_begin_handler)(THREAD_T thread_id)); -TSRM_API void *tsrm_set_new_thread_end_handler(void (*new_thread_end_handler)(THREAD_T thread_id)); - -#ifdef __cplusplus -} -#endif - -#endif /* _TSRM_H */ diff --git a/TSRM/acconfig.h b/TSRM/acconfig.h deleted file mode 100644 index 2b94cf35e7..0000000000 --- a/TSRM/acconfig.h +++ /dev/null @@ -1 +0,0 @@ -#undef PTHREADS diff --git a/TSRM/buildconf b/TSRM/buildconf deleted file mode 100755 index 60251e105b..0000000000 --- a/TSRM/buildconf +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/sh - -mv aclocal.m4 aclocal.m4.old 2>/dev/null -aclocal -if cmp aclocal.m4.old aclocal.m4 > /dev/null 2>&1; then - echo "buildconf: keeping ${1}aclocal.m4" - mv aclocal.m4.old aclocal.m4 -else - echo "buildconf: created or modified ${1}aclocal.m4" -fi - -#autoheader - -automake --add-missing --include-deps - -mv configure configure.old 2>/dev/null -autoconf -if cmp configure.old configure > /dev/null 2>&1; then - echo "buildconf: keeping ${1}configure" - mv configure.old configure -else - echo "buildconf: created or modified ${1}configure" -fi - diff --git a/TSRM/configure.in b/TSRM/configure.in deleted file mode 100644 index 2509a915af..0000000000 --- a/TSRM/configure.in +++ /dev/null @@ -1,30 +0,0 @@ -dnl $Id$ -dnl -dnl Minimalistic configure.in for TSRM. -dnl - -AC_INIT(TSRM.c) -AM_INIT_AUTOMAKE(TSRM, 1.0) -AM_CONFIG_HEADER(tsrm_config.h) - -AC_PROG_CC -AM_PROG_CC_STDC -AC_PROG_CC_C_O -AC_PROG_RANLIB - -AC_CHECK_LIB(c_r, pthread_create) -AC_CHECK_LIB(pthread, pthread_create) - -AC_CHECK_FUNCS(pthread_create) - -if test "$ac_cv_func_pthread_create" != "yes"; then - AC_MSG_ERROR(You need pthreads to build TSRM.) -fi - -AC_DEFINE(PTHREADS) - -AC_CHECK_HEADERS(stdarg.h) - -AC_OUTPUT(Makefile tsrm_config) - -chmod +x tsrm_config diff --git a/TSRM/tsrm_config.h.in b/TSRM/tsrm_config.h.in deleted file mode 100644 index 211c8ac5cc..0000000000 --- a/TSRM/tsrm_config.h.in +++ /dev/null @@ -1,25 +0,0 @@ -/* tsrm_config.h.in. Generated automatically from configure.in by autoheader. */ - -/* Define if your C compiler doesn't accept -c and -o together. */ -#undef NO_MINUS_C_MINUS_O - -#undef PTHREADS - -/* Define if you have the pthread_create function. */ -#undef HAVE_PTHREAD_CREATE - -/* Define if you have the <stdarg.h> header file. */ -#undef HAVE_STDARG_H - -/* Define if you have the c_r library (-lc_r). */ -#undef HAVE_LIBC_R - -/* Define if you have the pthread library (-lpthread). */ -#undef HAVE_LIBPTHREAD - -/* Name of package */ -#undef PACKAGE - -/* Version number of package */ -#undef VERSION - diff --git a/TSRM/tsrm_config.in b/TSRM/tsrm_config.in deleted file mode 100755 index c80000c8da..0000000000 --- a/TSRM/tsrm_config.in +++ /dev/null @@ -1,43 +0,0 @@ -#! /bin/sh -# -# $Id$ -# -# Written by Sascha Schumann <sascha@schumann.cx> - - -# taken from autoconf - -if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then - # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. - if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then - ac_n= ac_c=' -' ac_t=' ' - else - ac_n=-n ac_c= ac_t= - fi -else - ac_n= ac_c='\c' ac_t= -fi - - -flags_libs="@LIBS@" -flags_ldflags="@LDFLAGS@" -flags_cflags="@CPPFLAGS@ @CFLAGS@" - -case "$1" in ---ldflags) - echo $ac_n "$flags_ldflags$ac_c" -;; ---cflags) - echo $ac_n "$flags_cflags$ac_c" -;; ---libs) - echo $ac_n "$flags_libs$ac_c" -;; -*) - echo "$0 [--libs|--cflags|--ldflags]" - exit 1 -;; -esac - -exit 0 diff --git a/Zend/FlexLexer.h b/Zend/FlexLexer.h deleted file mode 100644 index 549177b8b9..0000000000 --- a/Zend/FlexLexer.h +++ /dev/null @@ -1,186 +0,0 @@ -// $Header$ - -// FlexLexer.h -- define interfaces for lexical analyzer classes generated -// by flex - -// Copyright (c) 1993 The Regents of the University of California. -// All rights reserved. -// -// This code is derived from software contributed to Berkeley by -// Kent Williams and Tom Epperly. -// -// Redistribution and use in source and binary forms with or without -// modification are permitted provided that: (1) source distributions retain -// this entire copyright notice and comment, and (2) distributions including -// binaries display the following acknowledgement: ``This product includes -// software developed by the University of California, Berkeley and its -// contributors'' in the documentation or other materials provided with the -// distribution and in all advertising materials mentioning features or use -// of this software. Neither the name of the University nor the names of -// its contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. - -// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED -// WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - -// This file defines FlexLexer, an abstract class which specifies the -// external interface provided to flex C++ lexer objects, and yyFlexLexer, -// which defines a particular lexer class. -// -// If you want to create multiple lexer classes, you use the -P flag -// to rename each yyFlexLexer to some other xxFlexLexer. You then -// include <FlexLexer.h> in your other sources once per lexer class: -// -// #undef yyFlexLexer -// #define yyFlexLexer xxFlexLexer -// #include <FlexLexer.h> -// -// #undef yyFlexLexer -// #define yyFlexLexer zzFlexLexer -// #include <FlexLexer.h> -// ... - -#ifndef __FLEX_LEXER_H -// Never included before - need to define base class. -#define __FLEX_LEXER_H -#include <iostream.h> - -extern "C++" { - -struct yy_buffer_state; -typedef int yy_state_type; - -class FlexLexer { -public: - virtual ~FlexLexer() { } - - const char* YYText() { return yytext; } - int YYLeng() { return yyleng; } - - virtual void - yy_switch_to_buffer( struct yy_buffer_state* new_buffer ) = 0; - virtual struct yy_buffer_state* - yy_create_buffer( istream* s, int size ) = 0; - virtual void yy_delete_buffer( struct yy_buffer_state* b ) = 0; - virtual void yyrestart( istream* s ) = 0; - - virtual int yylex() = 0; - - // Call yylex with new input/output sources. - int yylex( istream* new_in, ostream* new_out = 0 ) - { - switch_streams( new_in, new_out ); - return yylex(); - } - - // Switch to new input/output streams. A nil stream pointer - // indicates "keep the current one". - virtual void switch_streams( istream* new_in = 0, - ostream* new_out = 0 ) = 0; - - int lineno() const { return yylineno; } - - int debug() const { return yy_flex_debug; } - void set_debug( int flag ) { yy_flex_debug = flag; } - -protected: - char* yytext; - int yyleng; - int yylineno; // only maintained if you use %option yylineno - int yy_flex_debug; // only has effect with -d or "%option debug" -}; - -} -#endif - -#if defined(yyFlexLexer) || ! defined(yyFlexLexerOnce) -// Either this is the first time through (yyFlexLexerOnce not defined), -// or this is a repeated include to define a different flavor of -// yyFlexLexer, as discussed in the flex man page. -#define yyFlexLexerOnce - -class yyFlexLexer : public FlexLexer { -public: - // arg_yyin and arg_yyout default to the cin and cout, but we - // only make that assignment when initializing in yylex(). - yyFlexLexer( istream* arg_yyin = 0, ostream* arg_yyout = 0 ); - - virtual ~yyFlexLexer(); - - void yy_switch_to_buffer( struct yy_buffer_state* new_buffer ); - struct yy_buffer_state* yy_create_buffer( istream* s, int size ); - void yy_delete_buffer( struct yy_buffer_state* b ); - void yyrestart( istream* s ); - - virtual int yylex(); - virtual void switch_streams( istream* new_in, ostream* new_out ); - -protected: - virtual int LexerInput( char* buf, int max_size ); - virtual void LexerOutput( const char* buf, int size ); - virtual void LexerError( const char* msg ); - - void yyunput( int c, char* buf_ptr ); - int yyinput(); - - void yy_load_buffer_state(); - void yy_init_buffer( struct yy_buffer_state* b, istream* s ); - void yy_flush_buffer( struct yy_buffer_state* b ); - - int yy_start_stack_ptr; - int yy_start_stack_depth; - int* yy_start_stack; - - void yy_push_state( int new_state ); - void yy_pop_state(); - int yy_top_state(); - - yy_state_type yy_get_previous_state(); - yy_state_type yy_try_NUL_trans( yy_state_type current_state ); - int yy_get_next_buffer(); - - istream* yyin; // input source for default LexerInput - ostream* yyout; // output sink for default LexerOutput - - struct yy_buffer_state* yy_current_buffer; - - // yy_hold_char holds the character lost when yytext is formed. - char yy_hold_char; - - // Number of characters read into yy_ch_buf. - int yy_n_chars; - - // Points to current character in buffer. - char* yy_c_buf_p; - - int yy_init; // whether we need to initialize - int yy_start; // start state number - - // Flag which is used to allow yywrap()'s to do buffer switches - // instead of setting up a fresh yyin. A bit of a hack ... - int yy_did_buffer_switch_on_eof; - - // The following are not always needed, but may be depending - // on use of certain flex features (like REJECT or yymore()). - - yy_state_type yy_last_accepting_state; - char* yy_last_accepting_cpos; - - yy_state_type* yy_state_buf; - yy_state_type* yy_state_ptr; - - char* yy_full_match; - int* yy_full_state; - int yy_full_lp; - - int yy_lp; - int yy_looking_for_trail_begin; - - int yy_more_flag; - int yy_more_len; - int yy_more_offset; - int yy_prev_more_offset; -}; - -#endif diff --git a/Zend/LICENSE b/Zend/LICENSE deleted file mode 100644 index 1dd42f1ff3..0000000000 --- a/Zend/LICENSE +++ /dev/null @@ -1,116 +0,0 @@ ---------------------------------------------------------------------------- - The Zend License, version 0.91 - Copyright (C) 1999 Andi Gutmans & Zeev Suraski ---------------------------------------------------------------------------- - -The Zend scripting engine library is a product of Andi Gutmans and -Zeev Suraski. It may be used and/or distributed under the terms of the -Q Public License (QPL) version 1.0, enclosed below. - -For more information about Zend please visit http://www.zend.com/ -For license related questions please mail license@zend.com - -=========================================================================== - - THE Q PUBLIC LICENSE - version 1.0 - - Copyright (C) 1999 Troll Tech AS, Norway. - Everyone is permitted to copy and - distribute this license document. - -The intent of this license is to establish freedom to share and change the -software regulated by this license under the open source model. - -This license applies to any software containing a notice placed by the -copyright holder saying that it may be distributed under the terms of -the Q Public License version 1.0. Such software is herein referred to as -the Software. This license covers modification and distribution of the -Software, use of third-party application programs based on the Software, -and development of free software which uses the Software. - - Granted Rights - -1. You are granted the non-exclusive rights set forth in this license - provided you agree to and comply with any and all conditions in this - license. Whole or partial distribution of the Software, or software - items that link with the Software, in any form signifies acceptance of - this license. - -2. You may copy and distribute the Software in unmodified form provided - that the entire package, including - but not restricted to - copyright, - trademark notices and disclaimers, as released by the initial developer - of the Software, is distributed. - -3. You may make modifications to the Software and distribute your - modifications, in a form that is separate from the Software, such as - patches. The following restrictions apply to modifications: - - a. Modifications must not alter or remove any copyright notices in - the Software. - - b. When modifications to the Software are released under this - license, a non-exclusive royalty-free right is granted to the - initial developer of the Software to distribute your modification - in future versions of the Software provided such versions remain - available under these terms in addition to any other license(s) of - the initial developer. - -4. You may distribute machine-executable forms of the Software or - machine-executable forms of modified versions of the Software, provided - that you meet these restrictions: - - a. You must include this license document in the distribution. - - b. You must ensure that all recipients of the machine-executable forms - are also able to receive the complete machine-readable source code - to the distributed Software, including all modifications, without - any charge beyond the costs of data transfer, and place prominent - notices in the distribution explaining this. - - c. You must ensure that all modifications included in the - machine-executable forms are available under the terms of this - license. - -5. You may use the original or modified versions of the Software to - compile, link and run application programs legally developed by you - or by others. - -6. You may develop application programs, reusable components and other - software items that link with the original or modified versions of the - Software. These items, when distributed, are subject to the following - requirements: - - a. You must ensure that all recipients of machine-executable forms of - these items are also able to receive and use the complete - machine-readable source code to the items without any charge - beyond the costs of data transfer. - - b. You must explicitly license all recipients of your items to use - and re-distribute original and modified versions of the items in - both machine-executable and source code forms. The recipients must - be able to do so without any charges whatsoever, and they must be - able to re-distribute to anyone they choose. - - - c. If the items are not available to the general public, and the - initial developer of the Software requests a copy of the items, - then you must supply one. - - Limitations of Liability - -In no event shall the initial developers or copyright holders be liable -for any damages whatsoever, including - but not restricted to - lost -revenue or profits or other direct, indirect, special, incidental or -consequential damages, even if they have been advised of the possibility -of such damages, except to the extent invariable law, if any, provides -otherwise. - - No Warranty - -The Software and this license document are provided AS IS with NO WARRANTY -OF ANY KIND, INCLUDING THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS -FOR A PARTICULAR PURPOSE. - - -===========================================================================
\ No newline at end of file diff --git a/Zend/Makefile.am b/Zend/Makefile.am deleted file mode 100644 index b566f441e9..0000000000 --- a/Zend/Makefile.am +++ /dev/null @@ -1,32 +0,0 @@ -## Process this file with automake to produce Makefile.in -*- makefile -*- - -#CLEANFILES = zend-parser.c zend-parser.h zend-scanner.c zend-parser.output - -AUTOMAKE_OPTIONS=foreign -noinst_LIBRARIES=libzend.a -libzend_a_SOURCES=\ - zend-parser.y zend-scanner.l \ - zend_alloc.c zend_compile.c zend_constants.c \ - zend_execute.c zend_execute_API.c zend_highlight.c zend_llist.c \ - zend_opcode.c zend_operators.c zend_ptr_stack.c zend_stack.c \ - zend_variables.c zend.c zend_API.c zend_extensions.c zend_hash.c \ - zend_list.c zend_indent.c zend_builtin_functions.c - -# taken from automake 1.4 -CXXCOMPILE = $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) - -# automake isn't too clever about "non-standard" use of lex and yacc - -zend-scanner.o: @ZEND_SCANNER_SRC@ - @ZEND_SCANNER_COMPILE@ - -zend-scanner.c: zend-scanner.l - $(LEX) -Pzend -ozend-scanner.c -i $(srcdir)/zend-scanner.l - -zend-scanner.cc: zend-scanner.l - $(LEX) -+ -B -i -S$(srcdir)/flex.skl -Pzend -ozend-scanner.cc $(srcdir)/zend-scanner.l - -zend-parser.h: zend-parser.c -zend-parser.c: zend-parser.y - $(YACC) -p zend -v -d $(srcdir)/zend-parser.y -o zend-parser.c - diff --git a/Zend/ZEND_CHANGES b/Zend/ZEND_CHANGES deleted file mode 100644 index 0c144e2d5c..0000000000 --- a/Zend/ZEND_CHANGES +++ /dev/null @@ -1,111 +0,0 @@ -Improvements ------------- - -Zend was designed from the ground up for increased speed, -reduced memory consumption and more reliable execution. We dare -say it meets all of these goals and does so pretty well. Beyond -that, there are several improvements in the language engine -features: - -* References support. $foo = &$a; would make $foo and $a be two - names to the same variable. This works with arrays as well, - on either side; e.g., $foo = &$a[7]; would make $foo and $a[7] - be two names to the same variable. Changing one would change - the other and vice versa. -* Object overloading support. This feature allows various OO - libraries to use the OO notation of PHP to access their - functionality. Right now, no use is made of that feature, - but we'd have a COM module ready by the time PHP 4.0 is released. - A CORBA module would probably follow. -* include() and eval() are now functions, and not statements. - That means they return a value. The default return value from - include() and eval() is 1, so that you can do if (include()) - without further coding. The return value may be changed by - returning a value from the global scope of the included file - or the evaluated string. For example, if 'return 7;' is executed - in the global scope of foo.inc, include("foo.inc") would evaluate - to 7. -* Automatic resource deallocation. Several people have been bitten - by the fact that PHP 3.0 had no concept of reference counting. - Zend adds full reference counting for every value in the system, - including resources. As soon as a resource is no longer referenced - from any variable, it is automatically destroyed to save memory - and resources. The most obvious example for the advantage in this - is a loop that has an SQL query inside it, something like - '$result = sql_query(...);'. In PHP 3.0, every iteration resulted - in another SQL result-set allocated in the memory, and all of the - result sets weren't destroyed until the end of the script's execution. - In Zend, as soon as we overwrite an old result set with a new one, - the old result set which is no longer referenced, is destroyed. -* Full support for nesting arrays and objects within each other, in - as many levels as you want. -* Boolean type. true and false are now constants of type boolean. - Comparing any other value to them would convert that value to a - boolean first, and conduct the comparison later. That means, for - example, that 5==true would evaluate to true (in PHP 3.0, true - was nothing but a constant for the integer value of 1, so 5==true - was identical to 5==1, which was false). -* Runtime binding of function names. This complex name has a simple - explanation - you can now call functions before they're declared! -* Added here-docs support. -* Added foreach. Two syntaxes supported: - foreach(array_expr as $val) statement - foreach(array_expr as $key => $val) statement -* A true unset() implementation. A variable or element that is unset(), is now - sent to oblivion in its entirely, no trace remains from it. -* Output buffering support! Use ob_start() to begin output buffering, ob_end_flush() - to end buffering and send out the buffered contents, ob_end_clean() to end buffering - without sending the buffered contents, and ob_get_contents() to retreive the current - contents of the output buffer. - Header information (header(), content type, cookies) are not buffered. By turning - on output buffering, you can effectively send header information all throughout your - file, regardless of whether you've emitted body output or not. -* Full variable reference within quoted strings: - ${expr} - full indirect reference support for scalar variables - {variable} - full variable support - For example: - $foo[5]["bar"] = "foobar"; - print "{$foo[5]["bar"]}"; // would print "foobar" -* Ability to call member functions of other classes from within member functions or from - the global scope. You can now, for example, override a parent function with a child function, - and call the parent function from it. -* Runtime information for classes (class name, parent, available functions, etc.). -* Much more efficient syntax highlighter - runs much quicker, performs more reliably, and - generates much tighter HTML. -* A full-featured debugger has been integrated with the language (supports breakpoints, - expression evaluation, step-in/over, function call backtrace, and more). - - -Incompatabilities ------------------ - -Zend claims 100% compatability with the engine of PHP 3.0, and is -shamelessly lying about it. Here's why: - -* static variable initializers only accept scalar values - (in PHP 3.0 they accepted any valid expression). The impact - should be somewhere in between void and non existant, since - initializing a static variable with anything but a simple - static value makes no sense at all. - -* The scope of break and continue is local to that of an - include()'d file or an eval()'d string. The impact should - be somewhat smaller of the one above. - -* return statement from a require()'d file no longer works. It - hardly worked in PHP 3.0, so the impact should be fairly small. - If you want this functionality - use include() instead. - -* unset() is no longer a function, but a statement. It was never - documented as a function so the impact should be no bigger than - nada. - -* The following letter combination is not supported within encapsulated - strings: "{$". If you have a string that includes this letter - combination, for example, print "{$somevar"; (which printed the - letter { and the contents of the variable $somevar in PHP 3.0), - it will result in a parse error under Zend. In this case, you - would have to change the code to print "\{$somevar"; - This incompatability is due to the full variable reference - within quoted strings feature added in Zend. - diff --git a/Zend/ZendCore.dep b/Zend/ZendCore.dep deleted file mode 100644 index 5320a0b674..0000000000 --- a/Zend/ZendCore.dep +++ /dev/null @@ -1,258 +0,0 @@ -# Microsoft Developer Studio Generated Dependency File, included by ZendCore.mak - -.\zend_alloc.c : \ - "..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\ - ".\zend_alloc.h"\ - ".\zend_compile.h"\ - ".\zend_config.w32.h"\ - ".\zend_execute.h"\ - ".\zend_llist.h"\ - ".\zend_ptr_stack.h"\ - ".\zend_stack.h"\ - ".\zend.h"\ - ".\zend_errors.h"\ - ".\zend_globals.h"\ - ".\zend_hash.h"\ - - -.\alloca.c : \ - "..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\ - ".\zend_config.w32.h"\ - ".\zend.h"\ - ".\zend_errors.h"\ - ".\zend_hash.h"\ - - -.\zend_compile.c : \ - "..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\ - ".\zend_alloc.h"\ - ".\zend_compile.h"\ - ".\zend_config.w32.h"\ - ".\zend_execute.h"\ - ".\zend_llist.h"\ - ".\modules.h"\ - ".\zend_operators.h"\ - ".\zend_ptr_stack.h"\ - ".\zend_stack.h"\ - ".\zend_variables.h"\ - ".\zend.h"\ - ".\zend_API.h"\ - ".\zend_errors.h"\ - ".\zend_globals.h"\ - ".\zend_hash.h"\ - ".\zend_ini.h"\ - - -.\zend_constants.c : \ - "..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\ - ".\zend_alloc.h"\ - ".\zend_config.w32.h"\ - ".\zend_constants.h"\ - ".\zend_operators.h"\ - ".\zend_variables.h"\ - ".\zend.h"\ - ".\zend_errors.h"\ - ".\zend_hash.h"\ - - -.\zend_execute.c : \ - "..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\ - ".\zend_alloc.h"\ - ".\zend_compile.h"\ - ".\zend_config.w32.h"\ - ".\zend_constants.h"\ - ".\zend_execute.h"\ - ".\zend_llist.h"\ - ".\modules.h"\ - ".\zend_operators.h"\ - ".\zend_ptr_stack.h"\ - ".\zend_stack.h"\ - ".\zend_variables.h"\ - ".\zend.h"\ - ".\zend_API.h"\ - ".\zend_errors.h"\ - ".\zend_globals.h"\ - ".\zend_hash.h"\ - ".\zend_ini.h"\ - - -.\zend_highlight.c : \ - "..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\ - ".\zend_alloc.h"\ - ".\zend_compile.h"\ - ".\zend_config.w32.h"\ - ".\zend_execute.h"\ - ".\zend_highlight.h"\ - ".\zend_llist.h"\ - ".\zend_ptr_stack.h"\ - ".\zend_stack.h"\ - ".\zend-parser.tab.h"\ - ".\zend.h"\ - ".\zend_errors.h"\ - ".\zend_globals.h"\ - ".\zend_hash.h"\ - - -.\zend_llist.c : \ - "..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\ - ".\zend_alloc.h"\ - ".\zend_config.w32.h"\ - ".\zend_llist.h"\ - ".\zend.h"\ - ".\zend_errors.h"\ - ".\zend_hash.h"\ - - -.\zend_opcode.c : \ - "..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\ - ".\zend_alloc.h"\ - ".\zend_compile.h"\ - ".\zend_config.w32.h"\ - ".\zend_execute.h"\ - ".\zend_llist.h"\ - ".\modules.h"\ - ".\zend_operators.h"\ - ".\zend_ptr_stack.h"\ - ".\zend_stack.h"\ - ".\zend_variables.h"\ - ".\zend.h"\ - ".\zend_API.h"\ - ".\zend_errors.h"\ - ".\zend_globals.h"\ - ".\zend_hash.h"\ - ".\zend_ini.h"\ - - -.\zend_operators.c : \ - "..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\ - ".\zend_alloc.h"\ - ".\zend_compile.h"\ - ".\zend_config.w32.h"\ - ".\zend_execute.h"\ - ".\zend_llist.h"\ - ".\zend_operators.h"\ - ".\zend_ptr_stack.h"\ - ".\zend_stack.h"\ - ".\zend_variables.h"\ - ".\zend.h"\ - ".\zend_errors.h"\ - ".\zend_globals.h"\ - ".\zend_hash.h"\ - - -.\zend_ptr_stack.c : \ - "..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\ - ".\zend_alloc.h"\ - ".\zend_config.w32.h"\ - ".\zend_ptr_stack.h"\ - ".\zend.h"\ - ".\zend_errors.h"\ - ".\zend_hash.h"\ - - -.\zend_stack.c : \ - "..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\ - ".\zend_alloc.h"\ - ".\zend_config.w32.h"\ - ".\zend_stack.h"\ - ".\zend.h"\ - ".\zend_errors.h"\ - ".\zend_hash.h"\ - - -.\zend_variables.c : \ - "..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\ - ".\zend_alloc.h"\ - ".\zend_compile.h"\ - ".\zend_config.w32.h"\ - ".\zend_constants.h"\ - ".\zend_execute.h"\ - ".\zend_llist.h"\ - ".\modules.h"\ - ".\zend_ptr_stack.h"\ - ".\zend_stack.h"\ - ".\zend_variables.h"\ - ".\zend.h"\ - ".\zend_API.h"\ - ".\zend_errors.h"\ - ".\zend_globals.h"\ - ".\zend_hash.h"\ - ".\zend_ini.h"\ - ".\zend_list.h"\ - - -.\zend.c : \ - "..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\ - ".\zend_alloc.h"\ - ".\zend_config.w32.h"\ - ".\zend_operators.h"\ - ".\zend_variables.h"\ - ".\zend.h"\ - ".\zend_errors.h"\ - ".\zend_hash.h"\ - - -.\zend_API.c : \ - "..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\ - ".\zend_alloc.h"\ - ".\zend_compile.h"\ - ".\zend_config.w32.h"\ - ".\zend_constants.h"\ - ".\zend_execute.h"\ - ".\zend_llist.h"\ - ".\modules.h"\ - ".\zend_operators.h"\ - ".\zend_ptr_stack.h"\ - ".\zend_stack.h"\ - ".\zend_variables.h"\ - ".\zend.h"\ - ".\zend_API.h"\ - ".\zend_errors.h"\ - ".\zend_globals.h"\ - ".\zend_hash.h"\ - ".\zend_ini.h"\ - ".\zend_list.h"\ - - -.\zend_hash.c : \ - "..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\ - ".\zend_config.w32.h"\ - ".\zend.h"\ - ".\zend_errors.h"\ - ".\zend_hash.h"\ - - -.\zend_ini.c : \ - "..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\ - ".\zend_alloc.h"\ - ".\zend_config.w32.h"\ - ".\zend.h"\ - ".\zend_errors.h"\ - ".\zend_hash.h"\ - ".\zend_ini.h"\ - - -!IF "$(CFG)" == "ZendCore - Win32 Release" - -!ELSEIF "$(CFG)" == "ZendCore - Win32 Debug" - -!ENDIF - -!IF "$(CFG)" == "ZendCore - Win32 Release" - -!ELSEIF "$(CFG)" == "ZendCore - Win32 Debug" - -!ENDIF - -!IF "$(CFG)" == "ZendCore - Win32 Release" - -!ELSEIF "$(CFG)" == "ZendCore - Win32 Debug" - -!ENDIF - -!IF "$(CFG)" == "ZendCore - Win32 Release" - -!ELSEIF "$(CFG)" == "ZendCore - Win32 Debug" - -!ENDIF - diff --git a/Zend/acconfig.h b/Zend/acconfig.h deleted file mode 100644 index 76cb26f3f4..0000000000 --- a/Zend/acconfig.h +++ /dev/null @@ -1,90 +0,0 @@ -#define ZEND_API - -@TOP@ - -/* This is the default configuration file to read */ -#define USE_CONFIG_FILE 1 - -/* these are defined by automake */ -#undef PACKAGE -#undef VERSION - -/* define uint by configure if it is missed (QNX and BSD derived) */ -#undef uint - -/* define ulong by configure if it is missed (most probably is) */ -#undef ulong - -/* Undefine if you want stricter XML/SGML compliance by default */ -/* (this disables "<?expression?>" by default) */ -#define T_DEFAULT_SHORT_OPEN_TAG 1 - -/* Define both of these if you want the bundled REGEX library */ -#define REGEX 0 -#define HSREGEX 0 - -#undef ZEND_DEBUG - -/* Define if you want to enable bc style precision math support */ -#define WITH_BCMATH 0 - -/* Define if you want to enable memory limit support */ -#define MEMORY_LIMIT 0 - -/* Define if you have broken sprintf function like SunOS 4 */ -#define BROKEN_SPRINTF 0 - -/* Define to compile Zend thread safe */ -#undef ZTS - -#undef HAVE_LIBDL - -@BOTTOM@ - -#ifdef HAVE_STDLIB_H -# include <stdlib.h> -#endif - -#ifdef HAVE_SYS_TYPES_H -# include <sys/types.h> -#endif - -#ifdef HAVE_STRING_H -# include <string.h> -#else -# include <strings.h> -#endif - -/* Define if you have stdiostream.h */ -#undef HAVE_STDIOSTREAM_H - -#ifdef HAVE_LIBDL -# ifdef HAVE_DLFCN_H -# include <dlfcn.h> -# endif -# define DL_LOAD(libname) dlopen(libname, RTLD_NOW) -# define DL_UNLOAD dlclose -# define DL_FETCH_SYMBOL dlsym -# define DL_HANDLE void * -# define ZEND_EXTENSIONS_SUPPORT 1 -#else -# define DL_HANDLE void * -# define ZEND_EXTENSIONS_SUPPORT 0 -#endif - -#if ZEND_BROKEN_SPRINTF -int zend_sprintf(char *buffer, const char *format, ...); -#else -# define zend_sprintf sprintf -#endif - -#if ZEND_DEBUG -# define inline -#endif - -/* - * Local variables: - * tab-width: 4 - * c-basic-offset: 4 - * End: - */ diff --git a/Zend/acinclude.m4 b/Zend/acinclude.m4 deleted file mode 100644 index f8a1eb75d8..0000000000 --- a/Zend/acinclude.m4 +++ /dev/null @@ -1,20 +0,0 @@ -dnl $Id$ -dnl -dnl This file contains local autoconf functions. - -dnl -dnl Check for broken sprintf() -dnl -AC_DEFUN(AC_ZEND_BROKEN_SPRINTF,[ - AC_MSG_CHECKING([for broken sprintf]) - AC_TRY_RUN([main() { char buf[20]; exit (sprintf(buf,"testing 123")!=11); }],[ - AC_DEFINE(ZEND_BROKEN_SPRINTF,0) - AC_MSG_RESULT(ok) - ],[ - AC_DEFINE(ZEND_BROKEN_SPRINTF,1) - AC_MSG_RESULT(broken) - ],[ - AC_DEFINE(ZEND_BROKEN_SPRINTF,0) - AC_MSG_RESULT(cannot check, guessing ok) - ]) -]) diff --git a/Zend/buildconf b/Zend/buildconf deleted file mode 100755 index deb6aedb79..0000000000 --- a/Zend/buildconf +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/sh - -mv aclocal.m4 aclocal.m4.old 2>/dev/null -aclocal -if cmp aclocal.m4.old aclocal.m4 > /dev/null 2>&1; then - echo "buildconf: keeping ${1}aclocal.m4" - mv aclocal.m4.old aclocal.m4 -else - echo "buildconf: created or modified ${1}aclocal.m4" -fi - -autoheader - -automake --add-missing --include-deps - -mv configure configure.old 2>/dev/null -autoconf -if cmp configure.old configure > /dev/null 2>&1; then - echo "buildconf: keeping ${1}configure" - mv configure.old configure -else - echo "buildconf: created or modified ${1}configure" -fi - diff --git a/Zend/configure.in b/Zend/configure.in deleted file mode 100644 index dba42d2e72..0000000000 --- a/Zend/configure.in +++ /dev/null @@ -1,173 +0,0 @@ -dnl $Id$ -dnl Process this file with autoconf to produce a configure script. - -AC_INIT(zend.c) -AM_INIT_AUTOMAKE(zend, 0.80A) -AM_CONFIG_HEADER(zend_config.h) -AM_SANITY_CHECK -AM_MAINTAINER_MODE -ZEND_VERSION=$VERSION - -dnl We want this one before the checks, so the checks can modify CFLAGS. -test -z "$CFLAGS" && auto_cflags=1 - -dnl Checks for programs. -AC_PROG_YACC -if test "$YACC" != "bison -y"; then - AC_MSG_WARN(You will need bison if you want to regenerate the Zend parser.) -else - AC_MSG_CHECKING(bison version) - set `bison --version| sed -e 's/^GNU Bison version //' -e 's/\./ /'` - if test "$1" = "1" -a "$2" -lt "25"; then - AC_MSG_WARN(You will need bison 1.25 if you want to regenerate the Zend parser (found $1.$2).) - fi - AC_MSG_RESULT($1.$2 (ok)) -fi -AC_PROG_CC -if test "$enable_thread_safety" = "yes" ; then -AC_PROG_CXX -fi -AC_PROG_RANLIB -AC_PROG_CC_C_O -AM_PROG_LEX - -AM_PROG_CC_STDC - -dnl Hack to work around a Mac OS X cpp problem -dnl Known versions needing this workaround are 5.3 and 5.4 -if test "$ac_cv_prog_gcc" = "yes" -a "`uname -s`" = "Rhapsody"; then - CPPFLAGS="$CPPFLAGS -traditional-cpp" -fi - -dnl Ugly hack to get around a problem with gcc on AIX. -if test "$CC" = "gcc" -a "$ac_cv_prog_cc_g" = "yes" -a \ - "`uname -sv`" = "AIX 4"; then - CFLAGS=`echo $CFLAGS | sed -e 's/-g//'` -fi - -dnl -dnl Check for /usr/pkg/{lib,include} which is where NetBSD puts binary -dnl and source packages. This should be harmless on other OSs. -dnl -if test -d /usr/pkg/include -a -d /usr/pkg/lib ; then - CFLAGS="$CFLAGS -I/usr/pkg/include" - LDFLAGS="$LDFLAGS -L/usr/pkg/lib" -fi - -AC_CHECK_LIB(c, dlopen, [ - # fake it - AC_DEFINE(HAVE_LIBDL) ], [ - AC_CHECK_LIB(dl, dlopen, [ - LIBS="-ldl $LIBS" - AC_DEFINE(HAVE_LIBDL) ], []) ]) - -dnl Checks for header files. -AC_HEADER_STDC - -dnl QNX requires unix.h to allow functions in libunix to work properly -AC_CHECK_HEADERS(limits.h malloc.h string.h unistd.h stdarg.h sys/types.h signal.h unix.h dlfcn.h) - -if test "$enable_thread_safety" = "yes" ; then -dnl C++ specific header files -AC_LANG_CPLUSPLUS -AC_CHECK_HEADER(stdiostream.h, [ AC_DEFINE(HAVE_STDIOSTREAM_H) ]) -AC_LANG_C -fi - -dnl Checks for types -AC_TYPE_SIZE_T -AC_TYPE_SIGNAL - -dnl This is required for QNX and may be some BSD derived systems -AC_CHECK_TYPE( uint, unsigned int ) -AC_CHECK_TYPE( ulong, unsigned long ) - -dnl Checks for library functions. -AC_FUNC_VPRINTF -AC_FUNC_MEMCMP -AC_FUNC_ALLOCA -AC_CHECK_FUNCS(memcpy strdup getpid kill strtod strtol) -AC_ZEND_BROKEN_SPRINTF - -AC_MSG_CHECKING(whether to include debugging symbols) -AC_ARG_ENABLE(debug, -[ --disable-debug Compile without debugging symbols], -[ - if test "$enableval" = "yes"; then - AC_MSG_RESULT(yes) - AC_DEFINE(ZEND_DEBUG,1) - DEBUG_CFLAGS="-g" - test -n "$GCC" && DEBUG_CFLAGS="$DEBUG_CFLAGS -Wall" - test -n "$GCC" && test "$USE_MAINTAINER_MODE" = "yes" && \ - DEBUG_CFLAGS="$DEBUG_CFLAGS -Wmissing-prototypes -Wstrict-prototypes -Wmissing-declarations" - else - AC_MSG_RESULT(no) - AC_DEFINE(ZEND_DEBUG,0) - DEBUG_CFLAGS="" - fi -],[ - AC_MSG_RESULT(yes) - AC_DEFINE(ZEND_DEBUG,1) - DEBUG_CFLAGS="-g" -]) -AC_SUBST(DEBUG_CFLAGS) -CFLAGS="$CFLAGS $DEBUG_CFLAGS" - -AC_MSG_CHECKING(whether to enable a memory limit) -AC_ARG_ENABLE(memory-limit, -[ --enable-memory-limit Compile with memory limit support. ], -[ - if test "$enableval" = "yes"; then - AC_DEFINE(MEMORY_LIMIT, 1) - AC_MSG_RESULT(yes) - else - AC_DEFINE(MEMORY_LIMIT, 0) - AC_MSG_RESULT(no) - fi -],[ - AC_DEFINE(MEMORY_LIMIT, 0) - AC_MSG_RESULT(no) -]) - - -dnl Sigh. This will probably break automake's automatic dependencies.. -AC_MSG_CHECKING(whether to build Zend thread-safe) -AC_ARG_ENABLE(thread-safety, -[ --enable-thread-safety Whether to build Zend thread-safe.],[ - if test "$enableval" = "yes"; then - AC_DEFINE(ZTS) - ZEND_SCANNER_SRC=zend-scanner.cc - ZEND_SCANNER_COMPILE='$(CXXCOMPILE) -c $< -o $@' - CPPFLAGS="$CPPFLAGS -I../TSRM" - AC_MSG_RESULT(yes) - else - ZEND_SCANNER_SRC=zend-scanner.c - ZEND_SCANNER_COMPILE='$(COMPILE) -c $<' - AC_MSG_RESULT(no) - fi -],[ - ZEND_SCANNER_SRC=zend-scanner.c - ZEND_SCANNER_COMPILE='$(COMPILE) -c $<' - AC_MSG_RESULT(no) -]) -AC_SUBST(TSRM_DIR) -AC_SUBST(TSRM_LIB) -AC_SUBST(ZEND_SCANNER_SRC) -AC_SUBST(ZEND_SCANNER_COMPILE) - -if test "$enable_thread_safety" = "yes" ; then -AC_CHECK_LIB(C, cin) -AC_CHECK_LIB(g++, cin) -AC_CHECK_LIB(stdc++, cin) -fi - -AC_SUBST(CFLAGS_SHLIB) -AC_SUBST(LDFLAGS_SHLIB) -AC_SUBST(LDFLAGS_SHLIB_EXPORT) - -AC_OUTPUT(Makefile zend_config) - - -# Local Variables: -# tab-width: 4 -# End: diff --git a/Zend/flex.skl b/Zend/flex.skl deleted file mode 100644 index 7c87706948..0000000000 --- a/Zend/flex.skl +++ /dev/null @@ -1,1541 +0,0 @@ -/* A lexical scanner generated by flex */ - -/* Scanner skeleton version: - * $Header$ - */ - -#define FLEX_SCANNER -#define YY_FLEX_MAJOR_VERSION 2 -#define YY_FLEX_MINOR_VERSION 5 - -%- -#include <stdio.h> -%* - - -/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */ -#ifdef c_plusplus -#ifndef __cplusplus -#define __cplusplus -#endif -#endif - - -#ifdef __cplusplus - -#include <stdlib.h> -%+ -class istream; -%* -#if HAVE_UNISTD_H -#include <unistd.h> -#endif - -/* Use prototypes in function declarations. */ -#define YY_USE_PROTOS - -/* The "const" storage-class-modifier is valid. */ -#define YY_USE_CONST - -#else /* ! __cplusplus */ - -#if __STDC__ - -#define YY_USE_PROTOS -#define YY_USE_CONST - -#endif /* __STDC__ */ -#endif /* ! __cplusplus */ - -#ifdef __TURBOC__ - #pragma warn -rch - #pragma warn -use -#include <io.h> -#include <stdlib.h> -#define YY_USE_CONST -#define YY_USE_PROTOS -#endif - -#ifdef YY_USE_CONST -#define yyconst const -#else -#define yyconst -#endif - - -#ifdef YY_USE_PROTOS -#define YY_PROTO(proto) proto -#else -#define YY_PROTO(proto) () -#endif - -/* Returned upon end-of-file. */ -#define YY_NULL 0 - -/* Promotes a possibly negative, possibly signed char to an unsigned - * integer for use as an array index. If the signed char is negative, - * we want to instead treat it as an 8-bit unsigned char, hence the - * double cast. - */ -#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) - -/* Enter a start condition. This macro really ought to take a parameter, - * but we do it the disgusting crufty way forced on us by the ()-less - * definition of BEGIN. - */ -#define BEGIN yy_start = 1 + 2 * - -/* Translate the current start state into a value that can be later handed - * to BEGIN to return to the state. The YYSTATE alias is for lex - * compatibility. - */ -#define YY_START ((yy_start - 1) / 2) -#define YYSTATE YY_START - -/* Action number for EOF rule of a given start state. */ -#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) - -/* Special action meaning "start processing a new file". */ -#define YY_NEW_FILE yyrestart( yyin ) - -#define YY_END_OF_BUFFER_CHAR 0 - -/* Size of default input buffer. */ -#define YY_BUF_SIZE 16384 - -typedef struct yy_buffer_state *YY_BUFFER_STATE; - -extern int yyleng; -%- -extern FILE *yyin, *yyout; -%* - -#define EOB_ACT_CONTINUE_SCAN 0 -#define EOB_ACT_END_OF_FILE 1 -#define EOB_ACT_LAST_MATCH 2 - -/* The funky do-while in the following #define is used to turn the definition - * int a single C statement (which needs a semi-colon terminator). This - * avoids problems with code like: - * - * if ( condition_holds ) - * yyless( 5 ); - * else - * do_something_else(); - * - * Prior to using the do-while the compiler would get upset at the - * "else" because it interpreted the "if" statement as being all - * done when it reached the ';' after the yyless() call. - */ - -/* Return all but the first 'n' matched characters back to the input stream. */ - -#define yyless(n) \ - do \ - { \ - /* Undo effects of setting up yytext. */ \ - *yy_cp = yy_hold_char; \ - yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \ - YY_DO_BEFORE_ACTION; /* set up yytext again */ \ - } \ - while ( 0 ) - -#define unput(c) yyunput( c, yytext_ptr ) - -/* The following is because we cannot portably get our hands on size_t - * (without autoconf's help, which isn't available because we want - * flex-generated scanners to compile on their own). - */ -typedef unsigned int yy_size_t; - - -struct yy_buffer_state - { -%- - FILE *yy_input_file; -%+ - istream* yy_input_file; -%* - - char *yy_ch_buf; /* input buffer */ - char *yy_buf_pos; /* current position in input buffer */ - - /* Size of input buffer in bytes, not including room for EOB - * characters. - */ - yy_size_t yy_buf_size; - - /* Number of characters read into yy_ch_buf, not including EOB - * characters. - */ - int yy_n_chars; - - /* Whether we "own" the buffer - i.e., we know we created it, - * and can realloc() it to grow it, and should free() it to - * delete it. - */ - int yy_is_our_buffer; - - /* Whether this is an "interactive" input source; if so, and - * if we're using stdio for input, then we want to use getc() - * instead of fread(), to make sure we stop fetching input after - * each newline. - */ - int yy_is_interactive; - - /* Whether we're considered to be at the beginning of a line. - * If so, '^' rules will be active on the next match, otherwise - * not. - */ - int yy_at_bol; - - /* Whether to try to fill the input buffer when we reach the - * end of it. - */ - int yy_fill_buffer; - - int yy_buffer_status; -#define YY_BUFFER_NEW 0 -#define YY_BUFFER_NORMAL 1 - /* When an EOF's been seen but there's still some text to process - * then we mark the buffer as YY_EOF_PENDING, to indicate that we - * shouldn't try reading from the input source any more. We might - * still have a bunch of tokens to match, though, because of - * possible backing-up. - * - * When we actually see the EOF, we change the status to "new" - * (via yyrestart()), so that the user can continue scanning by - * just pointing yyin at a new input file. - */ -#define YY_BUFFER_EOF_PENDING 2 - }; - -%- Standard (non-C++) definition -static YY_BUFFER_STATE yy_current_buffer = 0; -%* - -/* We provide macros for accessing buffer states in case in the - * future we want to put the buffer states in a more general - * "scanner state". - */ -#define YY_CURRENT_BUFFER yy_current_buffer - - -%- Standard (non-C++) definition -/* yy_hold_char holds the character lost when yytext is formed. */ -static char yy_hold_char; - -static int yy_n_chars; /* number of characters read into yy_ch_buf */ - - -int yyleng; - -/* Points to current character in buffer. */ -static char *yy_c_buf_p = (char *) 0; -static int yy_init = 1; /* whether we need to initialize */ -static int yy_start = 0; /* start state number */ - -/* Flag which is used to allow yywrap()'s to do buffer switches - * instead of setting up a fresh yyin. A bit of a hack ... - */ -static int yy_did_buffer_switch_on_eof; - -void yyrestart YY_PROTO(( FILE *input_file )); - -void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer )); -void yy_load_buffer_state YY_PROTO(( void )); -YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size )); -void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b )); -void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file )); -void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b )); -#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer ) - -YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size )); -YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str )); -YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len )); -%* - -static void *yy_flex_alloc YY_PROTO(( yy_size_t )); -static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t )); -static void yy_flex_free YY_PROTO(( void * )); - -#define yy_new_buffer yy_create_buffer - -#define yy_set_interactive(is_interactive) \ - { \ - if ( ! yy_current_buffer ) \ - yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ - yy_current_buffer->yy_is_interactive = is_interactive; \ - } - -#define yy_set_bol(at_bol) \ - { \ - if ( ! yy_current_buffer ) \ - yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ - yy_current_buffer->yy_at_bol = at_bol; \ - } - -#define YY_AT_BOL() (yy_current_buffer->yy_at_bol) - -%% yytext/yyin/yyout/yy_state_type/yylineno etc. def's & init go here - -%- Standard (non-C++) definition -static yy_state_type yy_get_previous_state YY_PROTO(( void )); -static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state )); -static int yy_get_next_buffer YY_PROTO(( void )); -static void yy_fatal_error YY_PROTO(( yyconst char msg[] )); -%* - -/* Done after the current pattern has been matched and before the - * corresponding action - sets up yytext. - */ -#define YY_DO_BEFORE_ACTION \ - yytext_ptr = yy_bp; \ -%% code to fiddle yytext and yyleng for yymore() goes here - yy_hold_char = *yy_cp; \ - *yy_cp = '\0'; \ -%% code to copy yytext_ptr to yytext[] goes here, if %array - yy_c_buf_p = yy_cp; - -%% data tables for the DFA and the user's section 1 definitions go here - -/* Macros after this point can all be overridden by user definitions in - * section 1. - */ - -#ifndef YY_SKIP_YYWRAP -#ifdef __cplusplus -extern "C" int yywrap YY_PROTO(( void )); -#else -extern int yywrap YY_PROTO(( void )); -#endif -#endif - -%- -#ifndef YY_NO_UNPUT -static void yyunput YY_PROTO(( int c, char *buf_ptr )); -#endif -%* - -#ifndef yytext_ptr -static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int )); -#endif - -#ifdef YY_NEED_STRLEN -static int yy_flex_strlen YY_PROTO(( yyconst char * )); -#endif - -#ifndef YY_NO_INPUT -%- Standard (non-C++) definition -#ifdef __cplusplus -static int yyinput YY_PROTO(( void )); -#else -static int input YY_PROTO(( void )); -#endif -%* -#endif - -#if YY_STACK_USED -static int yy_start_stack_ptr = 0; -static int yy_start_stack_depth = 0; -static int *yy_start_stack = 0; -#ifndef YY_NO_PUSH_STATE -static void yy_push_state YY_PROTO(( int new_state )); -#endif -#ifndef YY_NO_POP_STATE -static void yy_pop_state YY_PROTO(( void )); -#endif -#ifndef YY_NO_TOP_STATE -static int yy_top_state YY_PROTO(( void )); -#endif - -#else -#define YY_NO_PUSH_STATE 1 -#define YY_NO_POP_STATE 1 -#define YY_NO_TOP_STATE 1 -#endif - -#ifdef YY_MALLOC_DECL -YY_MALLOC_DECL -#else -#if __STDC__ -#ifndef __cplusplus -#include <stdlib.h> -#endif -#else -/* Just try to get by without declaring the routines. This will fail - * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int) - * or sizeof(void*) != sizeof(int). - */ -#endif -#endif - -/* Amount of stuff to slurp up with each read. */ -#ifndef YY_READ_BUF_SIZE -#define YY_READ_BUF_SIZE 8192 -#endif - -/* Copy whatever the last rule matched to the standard output. */ - -#ifndef ECHO -%- Standard (non-C++) definition -/* This used to be an fputs(), but since the string might contain NUL's, - * we now use fwrite(). - */ -#define ECHO (void) fwrite( yytext, yyleng, 1, yyout ) -%+ C++ definition -#define ECHO LexerOutput( yytext, yyleng ) -%* -#endif - -/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, - * is returned in "result". - */ -#ifndef YY_INPUT -#define YY_INPUT(buf,result,max_size) \ -%% fread()/read() definition of YY_INPUT goes here unless we're doing C++ -%+ C++ definition - if ( (result = LexerInput( (char *) buf, max_size )) < 0 ) \ - YY_FATAL_ERROR( "input in flex scanner failed" ); -%* -#endif - -/* No semi-colon after return; correct usage is to write "yyterminate();" - - * we don't want an extra ';' after the "return" because that will cause - * some compilers to complain about unreachable statements. - */ -#ifndef yyterminate -#define yyterminate() return YY_NULL -#endif - -/* Number of entries by which start-condition stack grows. */ -#ifndef YY_START_STACK_INCR -#define YY_START_STACK_INCR 25 -#endif - -/* Report a fatal error. */ -#ifndef YY_FATAL_ERROR -%- -#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) -%+ -#define YY_FATAL_ERROR(msg) LexerError( msg ) -%* -#endif - -/* Default declaration of generated scanner - a define so the user can - * easily add parameters. - */ -#ifndef YY_DECL -%- Standard (non-C++) definition -#define YY_DECL int yylex YY_PROTO(( void )) -%+ C++ definition -#define YY_DECL int yyFlexLexer::yylex() -%* -#endif - -/* Code executed at the beginning of each rule, after yytext and yyleng - * have been set up. - */ -#ifndef YY_USER_ACTION -#define YY_USER_ACTION -#endif - -/* Code executed at the end of each rule. */ -#ifndef YY_BREAK -#define YY_BREAK break; -#endif - -%% YY_RULE_SETUP definition goes here - -YY_DECL - { - register yy_state_type yy_current_state; - register char *yy_cp, *yy_bp; - register int yy_act; - -%% user's declarations go here - - if ( yy_init ) - { - yy_init = 0; - -#ifdef YY_USER_INIT - YY_USER_INIT; -#endif - - if ( ! yy_start ) - yy_start = 1; /* first start state */ - - if ( ! yyin ) -%- - yyin = stdin; -%+ - yyin = &cin; -%* - - if ( ! yyout ) -%- - yyout = stdout; -%+ - yyout = &cout; -%* - - if ( ! yy_current_buffer ) - yy_current_buffer = - yy_create_buffer( yyin, YY_BUF_SIZE ); - - yy_load_buffer_state(); - } - - while ( 1 ) /* loops until end-of-file is reached */ - { -%% yymore()-related code goes here - yy_cp = yy_c_buf_p; - - /* Support of yytext. */ - *yy_cp = yy_hold_char; - - /* yy_bp points to the position in yy_ch_buf of the start of - * the current run. - */ - yy_bp = yy_cp; - -%% code to set up and find next match goes here - -yy_find_action: -%% code to find the action number goes here - - YY_DO_BEFORE_ACTION; - -%% code for yylineno update goes here - -do_action: /* This label is used only to access EOF actions. */ - -%% debug code goes here - - switch ( yy_act ) - { /* beginning of action switch */ -%% actions go here - - case YY_END_OF_BUFFER: - { - /* Amount of text matched not including the EOB char. */ - int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1; - - /* Undo the effects of YY_DO_BEFORE_ACTION. */ - *yy_cp = yy_hold_char; - - if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW ) - { - /* We're scanning a new file or input source. It's - * possible that this happened because the user - * just pointed yyin at a new source and called - * yylex(). If so, then we have to assure - * consistency between yy_current_buffer and our - * globals. Here is the right place to do so, because - * this is the first action (other than possibly a - * back-up) that will match for the new input source. - */ - yy_n_chars = yy_current_buffer->yy_n_chars; - yy_current_buffer->yy_input_file = yyin; - yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL; - } - - /* Note that here we test for yy_c_buf_p "<=" to the position - * of the first EOB in the buffer, since yy_c_buf_p will - * already have been incremented past the NUL character - * (since all states make transitions on EOB to the - * end-of-buffer state). Contrast this with the test - * in input(). - */ - if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] ) - { /* This was really a NUL. */ - yy_state_type yy_next_state; - - yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text; - - yy_current_state = yy_get_previous_state(); - - /* Okay, we're now positioned to make the NUL - * transition. We couldn't have - * yy_get_previous_state() go ahead and do it - * for us because it doesn't know how to deal - * with the possibility of jamming (and we don't - * want to build jamming into it because then it - * will run more slowly). - */ - - yy_next_state = yy_try_NUL_trans( yy_current_state ); - - yy_bp = yytext_ptr + YY_MORE_ADJ; - - if ( yy_next_state ) - { - /* Consume the NUL. */ - yy_cp = ++yy_c_buf_p; - yy_current_state = yy_next_state; - goto yy_match; - } - - else - { -%% code to do back-up for compressed tables and set up yy_cp goes here - goto yy_find_action; - } - } - - else switch ( yy_get_next_buffer() ) - { - case EOB_ACT_END_OF_FILE: - { - yy_did_buffer_switch_on_eof = 0; - - if ( yywrap() ) - { - /* Note: because we've taken care in - * yy_get_next_buffer() to have set up - * yytext, we can now set up - * yy_c_buf_p so that if some total - * hoser (like flex itself) wants to - * call the scanner after we return the - * YY_NULL, it'll still work - another - * YY_NULL will get returned. - */ - yy_c_buf_p = yytext_ptr + YY_MORE_ADJ; - - yy_act = YY_STATE_EOF(YY_START); - goto do_action; - } - - else - { - if ( ! yy_did_buffer_switch_on_eof ) - YY_NEW_FILE; - } - break; - } - - case EOB_ACT_CONTINUE_SCAN: - yy_c_buf_p = - yytext_ptr + yy_amount_of_matched_text; - - yy_current_state = yy_get_previous_state(); - - yy_cp = yy_c_buf_p; - yy_bp = yytext_ptr + YY_MORE_ADJ; - goto yy_match; - - case EOB_ACT_LAST_MATCH: - yy_c_buf_p = - &yy_current_buffer->yy_ch_buf[yy_n_chars]; - - yy_current_state = yy_get_previous_state(); - - yy_cp = yy_c_buf_p; - yy_bp = yytext_ptr + YY_MORE_ADJ; - goto yy_find_action; - } - break; - } - - default: - YY_FATAL_ERROR( - "fatal flex scanner internal error--no action found" ); - } /* end of action switch */ - } /* end of scanning one token */ - } /* end of yylex */ - -%+ -yyFlexLexer::yyFlexLexer( istream* arg_yyin, ostream* arg_yyout ) - { - yyin = arg_yyin; - yyout = arg_yyout; - yy_c_buf_p = 0; - yy_init = 1; - yy_start = 0; - yy_flex_debug = 0; - yylineno = 1; // this will only get updated if %option yylineno - - yy_did_buffer_switch_on_eof = 0; - - yy_looking_for_trail_begin = 0; - yy_more_flag = 0; - yy_more_len = 0; - yy_more_offset = yy_prev_more_offset = 0; - - yy_start_stack_ptr = yy_start_stack_depth = 0; - yy_start_stack = 0; - - yy_current_buffer = 0; - -#ifdef YY_USES_REJECT - yy_state_buf = new yy_state_type[YY_BUF_SIZE + 2]; -#else - yy_state_buf = 0; -#endif - } - -yyFlexLexer::~yyFlexLexer() - { - delete yy_state_buf; - yy_delete_buffer( yy_current_buffer ); - } - -void yyFlexLexer::switch_streams( istream* new_in, ostream* new_out ) - { - if ( new_in ) - { - yy_delete_buffer( yy_current_buffer ); - yy_switch_to_buffer( yy_create_buffer( new_in, YY_BUF_SIZE ) ); - } - - if ( new_out ) - yyout = new_out; - } - -#ifdef YY_INTERACTIVE -int yyFlexLexer::LexerInput( char* buf, int /* max_size */ ) -#else -int yyFlexLexer::LexerInput( char* buf, int max_size ) -#endif - { - if ( yyin->eof() || yyin->fail() ) - return 0; - -#ifdef YY_INTERACTIVE - yyin->get( buf[0] ); - - if ( yyin->eof() ) - return 0; - - if ( yyin->bad() ) - return -1; - - return 1; - -#else - (void) yyin->read( buf, max_size ); - - if ( yyin->bad() ) - return -1; - else - return yyin->gcount(); -#endif - } - -void yyFlexLexer::LexerOutput( const char* buf, int size ) - { - (void) yyout->write( buf, size ); - } -%* - -/* yy_get_next_buffer - try to read in a new buffer - * - * Returns a code representing an action: - * EOB_ACT_LAST_MATCH - - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position - * EOB_ACT_END_OF_FILE - end of file - */ - -%- -static int yy_get_next_buffer() -%+ -int yyFlexLexer::yy_get_next_buffer() -%* - { - register char *dest = yy_current_buffer->yy_ch_buf; - register char *source = yytext_ptr; - register int number_to_move, i; - int ret_val; - - if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] ) - YY_FATAL_ERROR( - "fatal flex scanner internal error--end of buffer missed" ); - - if ( yy_current_buffer->yy_fill_buffer == 0 ) - { /* Don't try to fill the buffer, so this is an EOF. */ - if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 ) - { - /* We matched a single character, the EOB, so - * treat this as a final EOF. - */ - return EOB_ACT_END_OF_FILE; - } - - else - { - /* We matched some text prior to the EOB, first - * process it. - */ - return EOB_ACT_LAST_MATCH; - } - } - - /* Try to read more data. */ - - /* First move last chars to start of buffer. */ - number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1; - - for ( i = 0; i < number_to_move; ++i ) - *(dest++) = *(source++); - - if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING ) - /* don't do the read, it's not guaranteed to return an EOF, - * just force an EOF - */ - yy_current_buffer->yy_n_chars = yy_n_chars = 0; - - else - { - int num_to_read = - yy_current_buffer->yy_buf_size - number_to_move - 1; - - while ( num_to_read <= 0 ) - { /* Not enough room in the buffer - grow it. */ -#ifdef YY_USES_REJECT - YY_FATAL_ERROR( -"input buffer overflow, can't enlarge buffer because scanner uses REJECT" ); -#else - - /* just a shorter name for the current buffer */ - YY_BUFFER_STATE b = yy_current_buffer; - - int yy_c_buf_p_offset = - (int) (yy_c_buf_p - b->yy_ch_buf); - - if ( b->yy_is_our_buffer ) - { - int new_size = b->yy_buf_size * 2; - - if ( new_size <= 0 ) - b->yy_buf_size += b->yy_buf_size / 8; - else - b->yy_buf_size *= 2; - - b->yy_ch_buf = (char *) - /* Include room in for 2 EOB chars. */ - yy_flex_realloc( (void *) b->yy_ch_buf, - b->yy_buf_size + 2 ); - } - else - /* Can't grow it, we don't own it. */ - b->yy_ch_buf = 0; - - if ( ! b->yy_ch_buf ) - YY_FATAL_ERROR( - "fatal error - scanner input buffer overflow" ); - - yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset]; - - num_to_read = yy_current_buffer->yy_buf_size - - number_to_move - 1; -#endif - } - - if ( num_to_read > YY_READ_BUF_SIZE ) - num_to_read = YY_READ_BUF_SIZE; - - /* Read in more data. */ - YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]), - yy_n_chars, num_to_read ); - - yy_current_buffer->yy_n_chars = yy_n_chars; - } - - if ( yy_n_chars == 0 ) - { - if ( number_to_move == YY_MORE_ADJ ) - { - ret_val = EOB_ACT_END_OF_FILE; - yyrestart( yyin ); - } - - else - { - ret_val = EOB_ACT_LAST_MATCH; - yy_current_buffer->yy_buffer_status = - YY_BUFFER_EOF_PENDING; - } - } - - else - ret_val = EOB_ACT_CONTINUE_SCAN; - - yy_n_chars += number_to_move; - yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR; - yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; - - yytext_ptr = &yy_current_buffer->yy_ch_buf[0]; - - return ret_val; - } - - -/* yy_get_previous_state - get the state just before the EOB char was reached */ - -%- -static yy_state_type yy_get_previous_state() -%+ -yy_state_type yyFlexLexer::yy_get_previous_state() -%* - { - register yy_state_type yy_current_state; - register char *yy_cp; - -%% code to get the start state into yy_current_state goes here - - for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp ) - { -%% code to find the next state goes here - } - - return yy_current_state; - } - - -/* yy_try_NUL_trans - try to make a transition on the NUL character - * - * synopsis - * next_state = yy_try_NUL_trans( current_state ); - */ - -%- -#ifdef YY_USE_PROTOS -static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state ) -#else -static yy_state_type yy_try_NUL_trans( yy_current_state ) -yy_state_type yy_current_state; -#endif -%+ -yy_state_type yyFlexLexer::yy_try_NUL_trans( yy_state_type yy_current_state ) -%* - { - register int yy_is_jam; -%% code to find the next state, and perhaps do backing up, goes here - - return yy_is_jam ? 0 : yy_current_state; - } - - -%- -#ifndef YY_NO_UNPUT -#ifdef YY_USE_PROTOS -static void yyunput( int c, register char *yy_bp ) -#else -static void yyunput( c, yy_bp ) -int c; -register char *yy_bp; -#endif -%+ -void yyFlexLexer::yyunput( int c, register char* yy_bp ) -%* - { - register char *yy_cp = yy_c_buf_p; - - /* undo effects of setting up yytext */ - *yy_cp = yy_hold_char; - - if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) - { /* need to shift things up to make room */ - /* +2 for EOB chars. */ - register int number_to_move = yy_n_chars + 2; - register char *dest = &yy_current_buffer->yy_ch_buf[ - yy_current_buffer->yy_buf_size + 2]; - register char *source = - &yy_current_buffer->yy_ch_buf[number_to_move]; - - while ( source > yy_current_buffer->yy_ch_buf ) - *--dest = *--source; - - yy_cp += (int) (dest - source); - yy_bp += (int) (dest - source); - yy_current_buffer->yy_n_chars = - yy_n_chars = yy_current_buffer->yy_buf_size; - - if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) - YY_FATAL_ERROR( "flex scanner push-back overflow" ); - } - - *--yy_cp = (char) c; - -%% update yylineno here - - yytext_ptr = yy_bp; - yy_hold_char = *yy_cp; - yy_c_buf_p = yy_cp; - } -%- -#endif /* ifndef YY_NO_UNPUT */ -%* - - -%- -#ifdef __cplusplus -static int yyinput() -#else -static int input() -#endif -%+ -int yyFlexLexer::yyinput() -%* - { - int c; - - *yy_c_buf_p = yy_hold_char; - - if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) - { - /* yy_c_buf_p now points to the character we want to return. - * If this occurs *before* the EOB characters, then it's a - * valid NUL; if not, then we've hit the end of the buffer. - */ - if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] ) - /* This was really a NUL. */ - *yy_c_buf_p = '\0'; - - else - { /* need more input */ - int offset = yy_c_buf_p - yytext_ptr; - ++yy_c_buf_p; - - switch ( yy_get_next_buffer() ) - { - case EOB_ACT_LAST_MATCH: - /* This happens because yy_g_n_b() - * sees that we've accumulated a - * token and flags that we need to - * try matching the token before - * proceeding. But for input(), - * there's no matching to consider. - * So convert the EOB_ACT_LAST_MATCH - * to EOB_ACT_END_OF_FILE. - */ - - /* Reset buffer status. */ - yyrestart( yyin ); - - /* fall through */ - - case EOB_ACT_END_OF_FILE: - { - if ( yywrap() ) - return EOF; - - if ( ! yy_did_buffer_switch_on_eof ) - YY_NEW_FILE; -#ifdef __cplusplus - return yyinput(); -#else - return input(); -#endif - } - - case EOB_ACT_CONTINUE_SCAN: - yy_c_buf_p = yytext_ptr + offset; - break; - } - } - } - - c = *(unsigned char *) yy_c_buf_p; /* cast for 8-bit char's */ - *yy_c_buf_p = '\0'; /* preserve yytext */ - yy_hold_char = *++yy_c_buf_p; - -%% update BOL and yylineno - - return c; - } - - -%- -#ifdef YY_USE_PROTOS -void yyrestart( FILE *input_file ) -#else -void yyrestart( input_file ) -FILE *input_file; -#endif -%+ -void yyFlexLexer::yyrestart( istream* input_file ) -%* - { - if ( ! yy_current_buffer ) - yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); - - yy_init_buffer( yy_current_buffer, input_file ); - yy_load_buffer_state(); - } - - -%- -#ifdef YY_USE_PROTOS -void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) -#else -void yy_switch_to_buffer( new_buffer ) -YY_BUFFER_STATE new_buffer; -#endif -%+ -void yyFlexLexer::yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) -%* - { - if ( yy_current_buffer == new_buffer ) - return; - - if ( yy_current_buffer ) - { - /* Flush out information for old buffer. */ - *yy_c_buf_p = yy_hold_char; - yy_current_buffer->yy_buf_pos = yy_c_buf_p; - yy_current_buffer->yy_n_chars = yy_n_chars; - } - - yy_current_buffer = new_buffer; - yy_load_buffer_state(); - - /* We don't actually know whether we did this switch during - * EOF (yywrap()) processing, but the only time this flag - * is looked at is after yywrap() is called, so it's safe - * to go ahead and always set it. - */ - yy_did_buffer_switch_on_eof = 1; - } - - -%- -#ifdef YY_USE_PROTOS -void yy_load_buffer_state( void ) -#else -void yy_load_buffer_state() -#endif -%+ -void yyFlexLexer::yy_load_buffer_state() -%* - { - yy_n_chars = yy_current_buffer->yy_n_chars; - yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos; - yyin = yy_current_buffer->yy_input_file; - yy_hold_char = *yy_c_buf_p; - } - - -%- -#ifdef YY_USE_PROTOS -YY_BUFFER_STATE yy_create_buffer( FILE *file, int size ) -#else -YY_BUFFER_STATE yy_create_buffer( file, size ) -FILE *file; -int size; -#endif -%+ -YY_BUFFER_STATE yyFlexLexer::yy_create_buffer( istream* file, int size ) -%* - { - YY_BUFFER_STATE b; - - b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); - if ( ! b ) - YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); - - b->yy_buf_size = size; - - /* yy_ch_buf has to be 2 characters longer than the size given because - * we need to put in 2 end-of-buffer characters. - */ - b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 ); - if ( ! b->yy_ch_buf ) - YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); - - b->yy_is_our_buffer = 1; - - yy_init_buffer( b, file ); - - return b; - } - - -%- -#ifdef YY_USE_PROTOS -void yy_delete_buffer( YY_BUFFER_STATE b ) -#else -void yy_delete_buffer( b ) -YY_BUFFER_STATE b; -#endif -%+ -void yyFlexLexer::yy_delete_buffer( YY_BUFFER_STATE b ) -%* - { - if ( ! b ) - return; - - if ( b == yy_current_buffer ) - yy_current_buffer = (YY_BUFFER_STATE) 0; - - if ( b->yy_is_our_buffer ) - yy_flex_free( (void *) b->yy_ch_buf ); - - yy_flex_free( (void *) b ); - } - - -%- -#ifndef YY_ALWAYS_INTERACTIVE -#ifndef YY_NEVER_INTERACTIVE -extern int isatty YY_PROTO(( int )); -#endif -#endif - -#ifdef YY_USE_PROTOS -void yy_init_buffer( YY_BUFFER_STATE b, FILE *file ) -#else -void yy_init_buffer( b, file ) -YY_BUFFER_STATE b; -FILE *file; -#endif - -%+ -extern "C" int isatty YY_PROTO(( int )); -void yyFlexLexer::yy_init_buffer( YY_BUFFER_STATE b, istream* file ) -%* - - { - yy_flush_buffer( b ); - - b->yy_input_file = file; - b->yy_fill_buffer = 1; - -%- -#if YY_ALWAYS_INTERACTIVE - b->yy_is_interactive = 1; -#else -#if YY_NEVER_INTERACTIVE - b->yy_is_interactive = 0; -#else - b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; -#endif -#endif -%+ - b->yy_is_interactive = 0; -%* - } - - -%- -#ifdef YY_USE_PROTOS -void yy_flush_buffer( YY_BUFFER_STATE b ) -#else -void yy_flush_buffer( b ) -YY_BUFFER_STATE b; -#endif - -%+ -void yyFlexLexer::yy_flush_buffer( YY_BUFFER_STATE b ) -%* - { - if ( ! b ) - return; - - b->yy_n_chars = 0; - - /* We always need two end-of-buffer characters. The first causes - * a transition to the end-of-buffer state. The second causes - * a jam in that state. - */ - b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; - b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; - - b->yy_buf_pos = &b->yy_ch_buf[0]; - - b->yy_at_bol = 1; - b->yy_buffer_status = YY_BUFFER_NEW; - - if ( b == yy_current_buffer ) - yy_load_buffer_state(); - } -%* - - -#ifndef YY_NO_SCAN_BUFFER -%- -#ifdef YY_USE_PROTOS -YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size ) -#else -YY_BUFFER_STATE yy_scan_buffer( base, size ) -char *base; -yy_size_t size; -#endif - { - YY_BUFFER_STATE b; - - if ( size < 2 || - base[size-2] != YY_END_OF_BUFFER_CHAR || - base[size-1] != YY_END_OF_BUFFER_CHAR ) - /* They forgot to leave room for the EOB's. */ - return 0; - - b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); - if ( ! b ) - YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); - - b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ - b->yy_buf_pos = b->yy_ch_buf = base; - b->yy_is_our_buffer = 0; - b->yy_input_file = 0; - b->yy_n_chars = b->yy_buf_size; - b->yy_is_interactive = 0; - b->yy_at_bol = 1; - b->yy_fill_buffer = 0; - b->yy_buffer_status = YY_BUFFER_NEW; - - yy_switch_to_buffer( b ); - - return b; - } -%* -#endif - - -#ifndef YY_NO_SCAN_STRING -%- -#ifdef YY_USE_PROTOS -YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str ) -#else -YY_BUFFER_STATE yy_scan_string( yy_str ) -yyconst char *yy_str; -#endif - { - int len; - for ( len = 0; yy_str[len]; ++len ) - ; - - return yy_scan_bytes( yy_str, len ); - } -%* -#endif - - -#ifndef YY_NO_SCAN_BYTES -%- -#ifdef YY_USE_PROTOS -YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len ) -#else -YY_BUFFER_STATE yy_scan_bytes( bytes, len ) -yyconst char *bytes; -int len; -#endif - { - YY_BUFFER_STATE b; - char *buf; - yy_size_t n; - int i; - - /* Get memory for full buffer, including space for trailing EOB's. */ - n = len + 2; - buf = (char *) yy_flex_alloc( n ); - if ( ! buf ) - YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); - - for ( i = 0; i < len; ++i ) - buf[i] = bytes[i]; - - buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR; - - b = yy_scan_buffer( buf, n ); - if ( ! b ) - YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); - - /* It's okay to grow etc. this buffer, and we should throw it - * away when we're done. - */ - b->yy_is_our_buffer = 1; - - return b; - } -%* -#endif - - -#ifndef YY_NO_PUSH_STATE -%- -#ifdef YY_USE_PROTOS -static void yy_push_state( int new_state ) -#else -static void yy_push_state( new_state ) -int new_state; -#endif -%+ -void yyFlexLexer::yy_push_state( int new_state ) -%* - { - if ( yy_start_stack_ptr >= yy_start_stack_depth ) - { - yy_size_t new_size; - - yy_start_stack_depth += YY_START_STACK_INCR; - new_size = yy_start_stack_depth * sizeof( int ); - - if ( ! yy_start_stack ) - yy_start_stack = (int *) yy_flex_alloc( new_size ); - - else - yy_start_stack = (int *) yy_flex_realloc( - (void *) yy_start_stack, new_size ); - - if ( ! yy_start_stack ) - YY_FATAL_ERROR( - "out of memory expanding start-condition stack" ); - } - - yy_start_stack[yy_start_stack_ptr++] = YY_START; - - BEGIN(new_state); - } -#endif - - -#ifndef YY_NO_POP_STATE -%- -static void yy_pop_state() -%+ -void yyFlexLexer::yy_pop_state() -%* - { - if ( --yy_start_stack_ptr < 0 ) - YY_FATAL_ERROR( "start-condition stack underflow" ); - - BEGIN(yy_start_stack[yy_start_stack_ptr]); - } -#endif - - -#ifndef YY_NO_TOP_STATE -%- -static int yy_top_state() -%+ -int yyFlexLexer::yy_top_state() -%* - { - return yy_start_stack[yy_start_stack_ptr - 1]; - } -#endif - -#ifndef YY_EXIT_FAILURE -#define YY_EXIT_FAILURE 2 -#endif - -%- -#ifdef YY_USE_PROTOS -static void yy_fatal_error( yyconst char msg[] ) -#else -static void yy_fatal_error( msg ) -char msg[]; -#endif - { - (void) fprintf( stderr, "%s\n", msg ); - exit( YY_EXIT_FAILURE ); - } - -%+ - -void yyFlexLexer::LexerError( yyconst char msg[] ) - { - cerr << msg << '\n'; - exit( YY_EXIT_FAILURE ); - } -%* - - -/* Redefine yyless() so it works in section 3 code. */ - -#undef yyless -#define yyless(n) \ - do \ - { \ - /* Undo effects of setting up yytext. */ \ - yytext[yyleng] = yy_hold_char; \ - yy_c_buf_p = yytext + n; \ - yy_hold_char = *yy_c_buf_p; \ - *yy_c_buf_p = '\0'; \ - yyleng = n; \ - } \ - while ( 0 ) - - -/* Internal utility routines. */ - -#ifndef yytext_ptr -#ifdef YY_USE_PROTOS -static void yy_flex_strncpy( char *s1, yyconst char *s2, int n ) -#else -static void yy_flex_strncpy( s1, s2, n ) -char *s1; -yyconst char *s2; -int n; -#endif - { - register int i; - for ( i = 0; i < n; ++i ) - s1[i] = s2[i]; - } -#endif - -#ifdef YY_NEED_STRLEN -#ifdef YY_USE_PROTOS -static int yy_flex_strlen( yyconst char *s ) -#else -static int yy_flex_strlen( s ) -yyconst char *s; -#endif - { - register int n; - for ( n = 0; s[n]; ++n ) - ; - - return n; - } -#endif - - -#ifdef YY_USE_PROTOS -static void *yy_flex_alloc( yy_size_t size ) -#else -static void *yy_flex_alloc( size ) -yy_size_t size; -#endif - { - return (void *) malloc( size ); - } - -#ifdef YY_USE_PROTOS -static void *yy_flex_realloc( void *ptr, yy_size_t size ) -#else -static void *yy_flex_realloc( ptr, size ) -void *ptr; -yy_size_t size; -#endif - { - /* The cast to (char *) in the following accommodates both - * implementations that use char* generic pointers, and those - * that use void* generic pointers. It works with the latter - * because both ANSI C and C++ allow castless assignment from - * any pointer type to void*, and deal with argument conversions - * as though doing an assignment. - */ - return (void *) realloc( (char *) ptr, size ); - } - -#ifdef YY_USE_PROTOS -static void yy_flex_free( void *ptr ) -#else -static void yy_flex_free( ptr ) -void *ptr; -#endif - { - free( ptr ); - } - -#if YY_MAIN -int main() - { - yylex(); - return 0; - } -#endif diff --git a/Zend/libzend.dsp b/Zend/libzend.dsp deleted file mode 100644 index 89ee8f85a3..0000000000 --- a/Zend/libzend.dsp +++ /dev/null @@ -1,371 +0,0 @@ -# Microsoft Developer Studio Project File - Name="libzend" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Static Library" 0x0104 - -CFG=libzend - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "libzend.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "libzend.mak" CFG="libzend - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "libzend - Win32 Release" (based on "Win32 (x86) Static Library") -!MESSAGE "libzend - Win32 Debug" (based on "Win32 (x86) Static Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "libzend - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Output_Dir "Release" -# PROP Intermediate_Dir "Release" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDebug" /D "_MBCS" /D "_LIB" /YX /FD /c -# ADD CPP /nologo /MD /W3 /GX /O2 /I "." /D "NDebug" /D "_LIB" /D "TSRM_EXPORTS" /D "LIBZEND_EXPORTS" /D "WIN32" /D "_MBCS" /D ZEND_DEBUG=0 /FR /FD /c -# SUBTRACT CPP /YX -# ADD BASE RSC /l 0x40d /d "NDebug" -# ADD RSC /l 0x40d /d "NDebug" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo - -!ELSEIF "$(CFG)" == "libzend - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Output_Dir "Debug" -# PROP Intermediate_Dir "Debug" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_Debug" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c -# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "." /D "_Debug" /D "_LIB" /D "LIBZEND_EXPORTS" /D "TSRM_EXPORTS" /D "WIN32" /D "_MBCS" /D ZEND_DEBUG=1 /FR /YX /FD /GZ /c -# ADD BASE RSC /l 0x40d /d "_Debug" -# ADD RSC /l 0x40d /d "_Debug" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo - -!ENDIF - -# Begin Target - -# Name "libzend - Win32 Release" -# Name "libzend - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=".\zend-parser.c" -# End Source File -# Begin Source File - -SOURCE=".\zend-scanner.c" -# End Source File -# Begin Source File - -SOURCE=.\zend.c -# End Source File -# Begin Source File - -SOURCE=.\zend_alloc.c -# End Source File -# Begin Source File - -SOURCE=.\zend_API.c -# End Source File -# Begin Source File - -SOURCE=.\zend_builtin_functions.c -# End Source File -# Begin Source File - -SOURCE=.\zend_compile.c -# End Source File -# Begin Source File - -SOURCE=.\zend_constants.c -# End Source File -# Begin Source File - -SOURCE=.\zend_execute.c -# End Source File -# Begin Source File - -SOURCE=.\zend_execute_API.c -# End Source File -# Begin Source File - -SOURCE=.\zend_extensions.c -# End Source File -# Begin Source File - -SOURCE=.\zend_hash.c -# End Source File -# Begin Source File - -SOURCE=.\zend_highlight.c -# End Source File -# Begin Source File - -SOURCE=.\zend_indent.c -# End Source File -# Begin Source File - -SOURCE=.\zend_list.c -# End Source File -# Begin Source File - -SOURCE=.\zend_llist.c -# End Source File -# Begin Source File - -SOURCE=.\zend_opcode.c -# End Source File -# Begin Source File - -SOURCE=.\zend_operators.c -# End Source File -# Begin Source File - -SOURCE=.\zend_ptr_stack.c -# End Source File -# Begin Source File - -SOURCE=.\zend_sprintf.c -# End Source File -# Begin Source File - -SOURCE=.\zend_stack.c -# End Source File -# Begin Source File - -SOURCE=.\zend_variables.c -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# Begin Source File - -SOURCE=.\FlexLexer.h -# End Source File -# Begin Source File - -SOURCE=.\modules.h -# End Source File -# Begin Source File - -SOURCE=".\zend-parser.h" -# End Source File -# Begin Source File - -SOURCE=".\zend-scanner.h" -# End Source File -# Begin Source File - -SOURCE=.\zend.h -# End Source File -# Begin Source File - -SOURCE=.\zend_alloc.h -# End Source File -# Begin Source File - -SOURCE=.\zend_API.h -# End Source File -# Begin Source File - -SOURCE=.\zend_builtin_functions.h -# End Source File -# Begin Source File - -SOURCE=.\zend_compile.h -# End Source File -# Begin Source File - -SOURCE=.\zend_config.w32.h -# End Source File -# Begin Source File - -SOURCE=.\zend_constants.h -# End Source File -# Begin Source File - -SOURCE=.\zend_errors.h -# End Source File -# Begin Source File - -SOURCE=.\zend_execute.h -# End Source File -# Begin Source File - -SOURCE=.\zend_extensions.h -# End Source File -# Begin Source File - -SOURCE=.\zend_globals.h -# End Source File -# Begin Source File - -SOURCE=.\zend_hash.h -# End Source File -# Begin Source File - -SOURCE=.\zend_highlight.h -# End Source File -# Begin Source File - -SOURCE=.\zend_indent.h -# End Source File -# Begin Source File - -SOURCE=.\zend_list.h -# End Source File -# Begin Source File - -SOURCE=.\zend_llist.h -# End Source File -# Begin Source File - -SOURCE=.\zend_operators.h -# End Source File -# Begin Source File - -SOURCE=.\zend_ptr_stack.h -# End Source File -# Begin Source File - -SOURCE=.\zend_stack.h -# End Source File -# Begin Source File - -SOURCE=.\zend_variables.h -# End Source File -# End Group -# Begin Group "Parsers" - -# PROP Default_Filter "y" -# Begin Source File - -SOURCE=".\zend-parser.y" - -!IF "$(CFG)" == "libzend - Win32 Release" - -# Begin Custom Build -InputDir=. -InputPath=".\zend-parser.y" - -BuildCmds= \ - bison --output=zend-parser.c -v -d -S "C:\Program Files\Cygnus\share\bison.simple" -p zend zend-parser.y - -"$(InputDir)\zend-parser.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - $(BuildCmds) - -"$(InputDir)\zend-parser.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - $(BuildCmds) -# End Custom Build - -!ELSEIF "$(CFG)" == "libzend - Win32 Debug" - -# Begin Custom Build -InputDir=. -InputPath=".\zend-parser.y" - -BuildCmds= \ - bison --output=zend-parser.c -v -d -S "C:\Program Files\Cygnus\share\bison.simple" -p zend zend-parser.y - -"$(InputDir)\zend-parser.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - $(BuildCmds) - -"$(InputDir)\zend-parser.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - $(BuildCmds) -# End Custom Build - -!ENDIF - -# End Source File -# End Group -# Begin Group "Scanners" - -# PROP Default_Filter "l" -# Begin Source File - -SOURCE=".\zend-scanner.l" - -!IF "$(CFG)" == "libzend - Win32 Release" - -# Begin Custom Build -InputPath=".\zend-scanner.l" - -"zend-scanner.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - flex -i -Pzend -ozend-scanner.c zend-scanner.l - -# End Custom Build - -!ELSEIF "$(CFG)" == "libzend - Win32 Debug" - -# Begin Custom Build -InputPath=".\zend-scanner.l" - -"zend-scanner.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - flex -i -Pzend -ozend-scanner.c zend-scanner.l - -# End Custom Build - -!ENDIF - -# End Source File -# End Group -# Begin Group "Text Files" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=.\ZEND_BUGS -# End Source File -# Begin Source File - -SOURCE=.\ZEND_CHANGES -# End Source File -# Begin Source File - -SOURCE=.\ZEND_TODO -# End Source File -# End Group -# Begin Group "Resources" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=.\zend.ico -# End Source File -# End Group -# End Target -# End Project diff --git a/Zend/libzendts.dsp b/Zend/libzendts.dsp deleted file mode 100644 index 7c6e8054bc..0000000000 --- a/Zend/libzendts.dsp +++ /dev/null @@ -1,375 +0,0 @@ -# Microsoft Developer Studio Project File - Name="libzendts" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Static Library" 0x0104 - -CFG=libzendts - Win32 Debug_TS -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "libzendts.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "libzendts.mak" CFG="libzendts - Win32 Debug_TS" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "libzendts - Win32 Release_TS" (based on "Win32 (x86) Static Library") -!MESSAGE "libzendts - Win32 Debug_TS" (based on "Win32 (x86) Static Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "libzendts - Win32 Release_TS" - -# PROP BASE Use_MFC 0 -# PROP BASE Output_Dir "Release_TS" -# PROP BASE Intermediate_Dir "Release_TS" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Output_Dir "Release_TS" -# PROP Intermediate_Dir "Release_TS" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDebug_TS" /D "_MBCS" /D "_LIB" /YX /FD /c -# ADD CPP /nologo /MD /W3 /GX /O2 /I "." /D "NDebug_TS" /D "_LIB" /D "TSRM_EXPORTS" /D "LIBZEND_EXPORTS" /D "ZTS" /D "WIN32" /D "_MBCS" /D ZEND_DEBUG=0 /FR /FD /c -# SUBTRACT CPP /YX -# ADD BASE RSC /l 0x40d /d "NDebug_TS" -# ADD RSC /l 0x40d /d "NDebug_TS" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo - -!ELSEIF "$(CFG)" == "libzendts - Win32 Debug_TS" - -# PROP BASE Use_MFC 0 -# PROP BASE Output_Dir "Debug_TS" -# PROP BASE Intermediate_Dir "Debug_TS" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Output_Dir "Debug_TS" -# PROP Intermediate_Dir "Debug_TS" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_Debug_TS" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c -# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "." /D "_Debug_TS" /D "_LIB" /D "LIBZEND_EXPORTS" /D "TSRM_EXPORTS" /D "WIN32" /D "_MBCS" /D "ZTS" /D ZEND_DEBUG=1 /FR /YX /FD /GZ /c -# ADD BASE RSC /l 0x40d /d "_Debug_TS" -# ADD RSC /l 0x40d /d "_Debug_TS" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo - -!ENDIF - -# Begin Target - -# Name "libzendts - Win32 Release_TS" -# Name "libzendts - Win32 Debug_TS" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=".\zend-parser.c" -# End Source File -# Begin Source File - -SOURCE=".\zend-scanner.cpp" -# End Source File -# Begin Source File - -SOURCE=.\zend.c -# End Source File -# Begin Source File - -SOURCE=.\zend_alloc.c -# End Source File -# Begin Source File - -SOURCE=.\zend_API.c -# End Source File -# Begin Source File - -SOURCE=.\zend_builtin_functions.c -# End Source File -# Begin Source File - -SOURCE=.\zend_compile.c -# End Source File -# Begin Source File - -SOURCE=.\zend_constants.c -# End Source File -# Begin Source File - -SOURCE=.\zend_execute.c -# End Source File -# Begin Source File - -SOURCE=.\zend_execute_API.c -# End Source File -# Begin Source File - -SOURCE=.\zend_extensions.c -# End Source File -# Begin Source File - -SOURCE=.\zend_hash.c -# End Source File -# Begin Source File - -SOURCE=.\zend_highlight.c -# End Source File -# Begin Source File - -SOURCE=.\zend_indent.c -# End Source File -# Begin Source File - -SOURCE=.\zend_list.c -# End Source File -# Begin Source File - -SOURCE=.\zend_llist.c -# End Source File -# Begin Source File - -SOURCE=.\zend_opcode.c -# End Source File -# Begin Source File - -SOURCE=.\zend_operators.c -# End Source File -# Begin Source File - -SOURCE=.\zend_ptr_stack.c -# End Source File -# Begin Source File - -SOURCE=.\zend_sprintf.c -# End Source File -# Begin Source File - -SOURCE=.\zend_stack.c -# End Source File -# Begin Source File - -SOURCE=.\zend_variables.c -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# Begin Source File - -SOURCE=.\FlexLexer.h -# End Source File -# Begin Source File - -SOURCE=.\modules.h -# End Source File -# Begin Source File - -SOURCE=".\zend-parser.h" -# End Source File -# Begin Source File - -SOURCE=".\zend-scanner.h" -# End Source File -# Begin Source File - -SOURCE=.\zend.h -# End Source File -# Begin Source File - -SOURCE=.\zend_alloc.h -# End Source File -# Begin Source File - -SOURCE=.\zend_API.h -# End Source File -# Begin Source File - -SOURCE=.\zend_builtin_functions.h -# End Source File -# Begin Source File - -SOURCE=.\zend_compile.h -# End Source File -# Begin Source File - -SOURCE=.\zend_config.w32.h -# End Source File -# Begin Source File - -SOURCE=.\zend_constants.h -# End Source File -# Begin Source File - -SOURCE=.\zend_errors.h -# End Source File -# Begin Source File - -SOURCE=.\zend_execute.h -# End Source File -# Begin Source File - -SOURCE=.\zend_extensions.h -# End Source File -# Begin Source File - -SOURCE=.\zend_globals.h -# End Source File -# Begin Source File - -SOURCE=.\zend_globals_macros.h -# End Source File -# Begin Source File - -SOURCE=.\zend_hash.h -# End Source File -# Begin Source File - -SOURCE=.\zend_highlight.h -# End Source File -# Begin Source File - -SOURCE=.\zend_indent.h -# End Source File -# Begin Source File - -SOURCE=.\zend_list.h -# End Source File -# Begin Source File - -SOURCE=.\zend_llist.h -# End Source File -# Begin Source File - -SOURCE=.\zend_operators.h -# End Source File -# Begin Source File - -SOURCE=.\zend_ptr_stack.h -# End Source File -# Begin Source File - -SOURCE=.\zend_stack.h -# End Source File -# Begin Source File - -SOURCE=.\zend_variables.h -# End Source File -# End Group -# Begin Group "Parsers" - -# PROP Default_Filter "y" -# Begin Source File - -SOURCE=".\zend-parser.y" - -!IF "$(CFG)" == "libzendts - Win32 Release_TS" - -# Begin Custom Build -InputDir=. -InputPath=".\zend-parser.y" - -BuildCmds= \ - bison --output=zend-parser.c -v -d -S "C:\Program Files\Cygnus\share\bison.simple" -p zend zend-parser.y - -"$(InputDir)\zend-parser.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - $(BuildCmds) - -"$(InputDir)\zend-parser.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - $(BuildCmds) -# End Custom Build - -!ELSEIF "$(CFG)" == "libzendts - Win32 Debug_TS" - -# Begin Custom Build -InputDir=. -InputPath=".\zend-parser.y" - -BuildCmds= \ - bison --output=zend-parser.c -v -d -S "C:\Program Files\Cygnus\share\bison.simple" -p zend zend-parser.y - -"$(InputDir)\zend-parser.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - $(BuildCmds) - -"$(InputDir)\zend-parser.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - $(BuildCmds) -# End Custom Build - -!ENDIF - -# End Source File -# End Group -# Begin Group "Scanners" - -# PROP Default_Filter "l" -# Begin Source File - -SOURCE=".\zend-scanner.l" - -!IF "$(CFG)" == "libzendts - Win32 Release_TS" - -# Begin Custom Build -InputPath=".\zend-scanner.l" - -"zend-scanner.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - flex -+ -i -Sflex.skl -Pzend -ozend-scanner.cpp zend-scanner.l - -# End Custom Build - -!ELSEIF "$(CFG)" == "libzendts - Win32 Debug_TS" - -# Begin Custom Build -InputPath=".\zend-scanner.l" - -"zend-scanner.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - flex -+ -B -i -Sflex.skl -Pzend -ozend-scanner.cpp zend-scanner.l - -# End Custom Build - -!ENDIF - -# End Source File -# End Group -# Begin Group "Text Files" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=.\LICENSE -# End Source File -# Begin Source File - -SOURCE=.\ZEND_BUGS -# End Source File -# Begin Source File - -SOURCE=.\ZEND_CHANGES -# End Source File -# End Group -# Begin Group "Resources" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=.\zend.ico -# End Source File -# End Group -# End Target -# End Project diff --git a/Zend/zend-parser.y b/Zend/zend-parser.y deleted file mode 100644 index 5c9f60591c..0000000000 --- a/Zend/zend-parser.y +++ /dev/null @@ -1,661 +0,0 @@ -%{ -/* - +----------------------------------------------------------------------+ - | Zend Engine | - +----------------------------------------------------------------------+ - | Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski | - +----------------------------------------------------------------------+ - | This source file is subject to version 0.91 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at | - | http://www.zend.com/license/0_91.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Andi Gutmans <andi@zend.com> | - | Zeev Suraski <zeev@zend.com> | - +----------------------------------------------------------------------+ -*/ - -/* - * LALR shift/reduce conflicts and how they are resolved: - * - * - 2 shift/reduce conflicts due to the dangeling elseif/else ambiguity. Solved by shift. - * - 1 shift/reduce conflict due to arrays within encapsulated strings. Solved by shift. - * - 1 shift/reduce conflict due to objects within encapsulated strings. Solved by shift. - * - */ - -#include "zend_compile.h" -#include "zend.h" -#include "zend_list.h" -#include "zend_globals.h" -#include "zend_API.h" -#include "zend_variables.h" -#include "zend_operators.h" - - -#define YYERROR_VERBOSE - -%} - -%pure_parser -%expect 4 - -%left T_INCLUDE T_EVAL -%left ',' -%left T_LOGICAL_OR -%left T_LOGICAL_XOR -%left T_LOGICAL_AND -%right T_PRINT -%left '=' T_PLUS_EQUAL T_MINUS_EQUAL T_MUL_EQUAL T_DIV_EQUAL T_CONCAT_EQUAL T_MOD_EQUAL T_AND_EQUAL T_OR_EQUAL XT_OR_EQUAL T_SL_EQUAL T_SR_EQUAL -%left '?' ':' -%left T_BOOLEAN_OR -%left T_BOOLEAN_AND -%left '|' -%left '^' -%left '&' -%nonassoc T_IS_EQUAL T_IS_NOT_EQUAL -%nonassoc '<' T_IS_SMALLER_OR_EQUAL '>' T_IS_GREATER_OR_EQUAL -%left T_SL T_SR -%left '+' '-' '.' -%left '*' '/' '%' -%right '!' '~' T_INC T_DEC T_INT_CAST T_DOUBLE_CAST T_STRING_CAST T_ARRAY_CAST T_OBJECT_CAST T_BOOL_CAST '@' -%right '[' -%nonassoc T_NEW -%token T_EXIT -%token T_IF -%left T_ELSEIF -%left T_ELSE -%left T_ENDIF -%token T_LNUMBER -%token T_DNUMBER -%token T_STRING -%token T_STRING_VARNAME -%token T_VARIABLE -%token T_NUM_STRING -%token T_INLINE_HTML -%token T_CHARACTER -%token T_BAD_CHARACTER -%token T_ENCAPSED_AND_WHITESPACE -%token T_CONSTANT_ENCAPSED_STRING -%token T_ECHO -%token T_DO -%token T_WHILE -%token T_ENDWHILE -%token T_FOR -%token T_ENDFOR -%token T_FOREACH -%token T_ENDFOREACH -%token T_AS -%token T_SWITCH -%token T_ENDSWITCH -%token T_CASE -%token T_DEFAULT -%token T_BREAK -%token T_CONTINUE -%token T_OLD_FUNCTION -%token T_FUNCTION -%token T_CONST -%token T_RETURN -%token T_REQUIRE -%token T_GLOBAL -%token T_STATIC -%token T_VAR -%token T_UNSET -%token T_ISSET -%token T_EMPTY -%token T_CLASS -%token T_EXTENDS -%token T_OBJECT_OPERATOR -%token T_DOUBLE_ARROW -%token T_LIST -%token T_ARRAY -%token T_LINE -%token T_FILE -%token T_COMMENT -%token T_ML_COMMENT -%token T_OPEN_TAG -%token T_OPEN_TAG_WITH_ECHO -%token T_CLOSE_TAG -%token T_WHITESPACE -%token T_HEREDOC -%token T_DOLLAR_OPEN_CURLY_BRACES -%token T_CURLY_OPEN -%token T_PAAMAYIM_NEKUDOTAYIM -%token T_PHP_TRACK_VARS - -%% /* Rules */ - -top_statement_list: - top_statement_list { do_extended_info(CLS_C); } top_statement { ELS_FETCH(); HANDLE_INTERACTIVE(); } - | /* empty */ -; - - -top_statement: - statement - | declaration_statement { do_early_binding(CLS_C); } -; - - -inner_statement_list: - inner_statement_list { do_extended_info(CLS_C); } inner_statement { ELS_FETCH(); HANDLE_INTERACTIVE(); } - | /* empty */ -; - - -inner_statement: - statement - | declaration_statement -; - - -statement: - '{' inner_statement_list '}' - | T_IF '(' expr ')' { do_if_cond(&$3, &$4 CLS_CC); } statement { do_if_after_statement(&$4, 1 CLS_CC); } elseif_list else_single { do_if_end(CLS_C); } - | T_IF '(' expr ')' ':' { do_if_cond(&$3, &$4 CLS_CC); } inner_statement_list { do_if_after_statement(&$4, 1 CLS_CC); } new_elseif_list new_else_single T_ENDIF ';' { do_if_end(CLS_C); } - | T_WHILE '(' { $1.u.opline_num = get_next_op_number(CG(active_op_array)); } expr ')' { do_while_cond(&$4, &$5 CLS_CC); } while_statement { do_while_end(&$1, &$5 CLS_CC); } - | T_DO { $1.u.opline_num = get_next_op_number(CG(active_op_array)); do_do_while_begin(CLS_C); } statement T_WHILE '(' expr ')' ';' { do_do_while_end(&$1, &$6 CLS_CC); } - | T_FOR - '(' - for_expr - ';' { do_free(&$3 CLS_CC); $4.u.opline_num = get_next_op_number(CG(active_op_array)); } - for_expr - ';' { do_for_cond(&$6, &$7 CLS_CC); } - for_expr - ')' { do_free(&$9 CLS_CC); do_for_before_statement(&$4, &$7 CLS_CC); } - for_statement { do_for_end(&$7 CLS_CC); } - | T_SWITCH '(' expr ')' { do_switch_cond(&$3 CLS_CC); } switch_case_list { do_switch_end(&$6 CLS_CC); } - | T_BREAK ';' { do_brk_cont(ZEND_BRK, NULL CLS_CC); } - | T_BREAK expr ';' { do_brk_cont(ZEND_BRK, &$2 CLS_CC); } - | T_CONTINUE ';' { do_brk_cont(ZEND_CONT, NULL CLS_CC); } - | T_CONTINUE expr ';' { do_brk_cont(ZEND_CONT, &$2 CLS_CC); } - | T_RETURN ';' { do_return(NULL CLS_CC); } - | T_RETURN expr ';' { do_return(&$2 CLS_CC); } - | T_GLOBAL global_var_list - | T_STATIC static_var_list - | T_ECHO echo_expr_list ';' - | T_INLINE_HTML { do_echo(&$1 CLS_CC); } - | expr ';' { do_free(&$1 CLS_CC); } - | T_REQUIRE expr ';' { if ($2.op_type==IS_CONST && $2.u.constant.type==IS_STRING) { require_filename($2.u.constant.value.str.val CLS_CC); zval_dtor(&$2.u.constant); } else { do_include_or_eval(ZEND_INCLUDE, &$$, &$2 CLS_CC); } } - | T_UNSET '(' r_cvar ')' ';' { do_unset(&$3 CLS_CC); } - | T_FOREACH '(' expr T_AS { do_foreach_begin(&$1, &$3, &$2, &$4 CLS_CC); } w_cvar foreach_optional_arg ')' { do_foreach_cont(&$6, &$7, &$4 CLS_CC); } foreach_statement { do_foreach_end(&$1, &$2 CLS_CC); } - | ';' /* empty statement */ -; - - -declaration_statement: - T_FUNCTION { $1.u.opline_num = CG(zend_lineno); } T_STRING { do_begin_function_declaration(&$1, &$3, 0 CLS_CC); } - '(' parameter_list ')' '{' inner_statement_list '}' { do_end_function_declaration(&$1 CLS_CC); } - | T_OLD_FUNCTION { $1.u.opline_num = CG(zend_lineno); } T_STRING { do_begin_function_declaration(&$1, &$3, 0 CLS_CC); } - parameter_list '(' inner_statement_list ')' ';' { do_end_function_declaration(&$1 CLS_CC); } - | T_CLASS T_STRING { do_begin_class_declaration(&$2, NULL CLS_CC); } '{' class_statement_list '}' { do_end_class_declaration(CLS_C); } - | T_CLASS T_STRING T_EXTENDS T_STRING { do_begin_class_declaration(&$2, &$4 CLS_CC); } '{' class_statement_list '}' { do_end_class_declaration(CLS_C); } -; - - -foreach_optional_arg: - /* empty */ { $$.op_type = IS_UNUSED; } - | T_DOUBLE_ARROW w_cvar { $$ = $2; } -; - - -for_statement: - statement - | ':' inner_statement_list T_ENDFOR ';' -; - - -foreach_statement: - statement - | ':' inner_statement_list T_ENDFOREACH ';' -; - - -switch_case_list: - '{' case_list '}' { $$ = $2; } - | '{' ';' case_list '}' { $$ = $3; } - | ':' case_list T_ENDSWITCH ';' { $$ = $2; } - | ':' ';' case_list T_ENDSWITCH ';' { $$ = $3; } -; - - -case_list: - /* empty */ { $$.u.opline_num = -1; } - | case_list T_CASE expr case_separator { do_case_before_statement(&$1, &$2, &$3 CLS_CC); } inner_statement_list { do_case_after_statement(&$$, &$2 CLS_CC); } - | case_list T_DEFAULT case_separator { do_default_before_statement(&$1, &$2 CLS_CC); } inner_statement_list { do_case_after_statement(&$$, &$2 CLS_CC); } -; - - -case_separator: - ':' - | ';' -; - - -while_statement: - statement - | ':' inner_statement_list T_ENDWHILE ';' -; - - - -elseif_list: - /* empty */ - | elseif_list T_ELSEIF '(' expr ')' { do_if_cond(&$4, &$5 CLS_CC); } statement { do_if_after_statement(&$5, 0 CLS_CC); } -; - - -new_elseif_list: - /* empty */ - | new_elseif_list T_ELSEIF '(' expr ')' ':' { do_if_cond(&$4, &$5 CLS_CC); } inner_statement_list { do_if_after_statement(&$5, 0 CLS_CC); } -; - - -else_single: - /* empty */ - | T_ELSE statement -; - - -new_else_single: - /* empty */ - | T_ELSE ':' inner_statement_list -; - - - - -parameter_list: - non_empty_parameter_list - | /* empty */ -; - - -non_empty_parameter_list: - T_VARIABLE { znode tmp; fetch_simple_variable(&tmp, &$1, 0 CLS_CC); $$.op_type = IS_CONST; $$.u.constant.value.lval=1; $$.u.constant.type=IS_LONG; INIT_PZVAL(&$$.u.constant); do_receive_arg(ZEND_RECV, &tmp, &$$, NULL, BYREF_NONE CLS_CC); } - | '&' T_VARIABLE { znode tmp; fetch_simple_variable(&tmp, &$2, 0 CLS_CC); $$.op_type = IS_CONST; $$.u.constant.value.lval=1; $$.u.constant.type=IS_LONG; INIT_PZVAL(&$$.u.constant); do_receive_arg(ZEND_RECV, &tmp, &$$, NULL, BYREF_FORCE CLS_CC); } - | T_CONST T_VARIABLE { znode tmp; fetch_simple_variable(&tmp, &$2, 0 CLS_CC); $$.op_type = IS_CONST; $$.u.constant.value.lval=1; $$.u.constant.type=IS_LONG; INIT_PZVAL(&$$.u.constant); do_receive_arg(ZEND_RECV, &tmp, &$$, NULL, BYREF_NONE CLS_CC); } - | T_VARIABLE '=' static_scalar { znode tmp; fetch_simple_variable(&tmp, &$1, 0 CLS_CC); $$.op_type = IS_CONST; $$.u.constant.value.lval=1; $$.u.constant.type=IS_LONG; INIT_PZVAL(&$$.u.constant); do_receive_arg(ZEND_RECV_INIT, &tmp, &$$, &$3, BYREF_NONE CLS_CC); } - | T_VARIABLE '=' T_UNSET { znode tmp; fetch_simple_variable(&tmp, &$1, 0 CLS_CC); $$.op_type = IS_CONST; $$.u.constant.value.lval=1; $$.u.constant.type=IS_LONG; INIT_PZVAL(&$$.u.constant); do_receive_arg(ZEND_RECV_INIT, &tmp, &$$, NULL, BYREF_NONE CLS_CC); } - | non_empty_parameter_list ',' T_VARIABLE { znode tmp; fetch_simple_variable(&tmp, &$3, 0 CLS_CC); $$=$1; $$.u.constant.value.lval++; do_receive_arg(ZEND_RECV, &tmp, &$$, NULL, BYREF_NONE CLS_CC); } - | non_empty_parameter_list ',' '&' T_VARIABLE { znode tmp; fetch_simple_variable(&tmp, &$4, 0 CLS_CC); $$=$1; $$.u.constant.value.lval++; do_receive_arg(ZEND_RECV, &tmp, &$$, NULL, BYREF_FORCE CLS_CC); } - | non_empty_parameter_list ',' T_CONST T_VARIABLE { znode tmp; fetch_simple_variable(&tmp, &$4, 0 CLS_CC); $$=$1; $$.u.constant.value.lval++; do_receive_arg(ZEND_RECV, &tmp, &$$, NULL, BYREF_NONE CLS_CC); } - | non_empty_parameter_list ',' T_VARIABLE '=' static_scalar { znode tmp; fetch_simple_variable(&tmp, &$3, 0 CLS_CC); $$=$1; $$.u.constant.value.lval++; do_receive_arg(ZEND_RECV_INIT, &tmp, &$$, &$5, BYREF_NONE CLS_CC); } - | non_empty_parameter_list ',' T_VARIABLE '=' T_UNSET { znode tmp; fetch_simple_variable(&tmp, &$3, 0 CLS_CC); $$=$1; $$.u.constant.value.lval++; do_receive_arg(ZEND_RECV_INIT, &tmp, &$$, NULL, BYREF_NONE CLS_CC); } -; - - -function_call_parameter_list: - non_empty_function_call_parameter_list { $$ = $1; } - | /* empty */ { $$.u.constant.value.lval = 0; } -; - - -non_empty_function_call_parameter_list: - expr_without_variable { $$.u.constant.value.lval = 1; do_pass_param(&$1, ZEND_SEND_VAL, $$.u.constant.value.lval CLS_CC); } - | cvar { $$.u.constant.value.lval = 1; do_pass_param(&$1, ZEND_SEND_VAR, $$.u.constant.value.lval CLS_CC); } - | '&' w_cvar { $$.u.constant.value.lval = 1; do_pass_param(&$2, ZEND_SEND_REF, $$.u.constant.value.lval CLS_CC); } - | non_empty_function_call_parameter_list ',' expr_without_variable { $$.u.constant.value.lval=$1.u.constant.value.lval+1; do_pass_param(&$3, ZEND_SEND_VAL, $$.u.constant.value.lval CLS_CC); } - | non_empty_function_call_parameter_list ',' cvar { $$.u.constant.value.lval=$1.u.constant.value.lval+1; do_pass_param(&$3, ZEND_SEND_VAR, $$.u.constant.value.lval CLS_CC); } - | non_empty_function_call_parameter_list ',' '&' w_cvar { $$.u.constant.value.lval=$1.u.constant.value.lval+1; do_pass_param(&$4, ZEND_SEND_REF, $$.u.constant.value.lval CLS_CC); } -; - -global_var_list: - global_var_list ',' global_var { do_fetch_global_or_static_variable(&$3, NULL, ZEND_FETCH_GLOBAL CLS_CC); } - | global_var { do_fetch_global_or_static_variable(&$1, NULL, ZEND_FETCH_GLOBAL CLS_CC); } -; - - -global_var: - T_VARIABLE { $$ = $1; } - | '$' r_cvar { $$ = $2; } - | '$' '{' expr '}' { $$ = $3; } -; - - -static_var_list: - static_var_list ',' T_VARIABLE { do_fetch_global_or_static_variable(&$3, NULL, ZEND_FETCH_STATIC CLS_CC); } - | static_var_list ',' T_VARIABLE '=' static_scalar { do_fetch_global_or_static_variable(&$3, &$5, ZEND_FETCH_STATIC CLS_CC); } - | T_VARIABLE { do_fetch_global_or_static_variable(&$1, NULL, ZEND_FETCH_STATIC CLS_CC); } - | T_VARIABLE '=' static_scalar { do_fetch_global_or_static_variable(&$1, &$3, ZEND_FETCH_STATIC CLS_CC); } - -; - - -class_statement_list: - class_statement_list class_statement - | /* empty */ -; - - -class_statement: - T_VAR class_variable_decleration ';' - | T_FUNCTION { $1.u.opline_num = CG(zend_lineno); } T_STRING { do_begin_function_declaration(&$1, &$3, 1 CLS_CC); } '(' - parameter_list ')' '{' inner_statement_list '}' { do_end_function_declaration(&$1 CLS_CC); } - | T_OLD_FUNCTION { $1.u.opline_num = CG(zend_lineno); } T_STRING { do_begin_function_declaration(&$1, &$3, 1 CLS_CC); } - parameter_list '(' inner_statement_list ')' ';' { do_end_function_declaration(&$1 CLS_CC); } - -; - - -class_variable_decleration: - class_variable_decleration ',' T_VARIABLE { do_declare_property(&$3, NULL CLS_CC); } - | class_variable_decleration ',' T_VARIABLE '=' static_scalar { do_declare_property(&$3, &$5 CLS_CC); } - | T_VARIABLE { do_declare_property(&$1, NULL CLS_CC); } - | T_VARIABLE '=' static_scalar { do_declare_property(&$1, &$3 CLS_CC); } -; - - -echo_expr_list: - | echo_expr_list ',' expr { do_echo(&$3 CLS_CC); } - | expr { do_echo(&$1 CLS_CC); } -; - - -for_expr: - /* empty */ { $$.op_type = IS_CONST; $$.u.constant.type = IS_BOOL; $$.u.constant.value.lval = 1; } - | non_empty_for_expr { $$ = $1; } -; - -non_empty_for_expr: - non_empty_for_expr ',' { do_free(&$1 CLS_CC); } expr { $$ = $4; } - | expr { $$ = $1; } -; - - -expr_without_variable: - T_LIST '(' { do_list_init(CLS_C); } assignment_list ')' '=' expr { do_list_end(&$$, &$7 CLS_CC); } - | cvar '=' expr { do_end_variable_parse(BP_VAR_W CLS_CC); do_assign(&$$, &$1, &$3 CLS_CC); } - | cvar '=' '&' w_cvar { do_end_variable_parse(BP_VAR_W CLS_CC); do_assign_ref(&$$, &$1, &$4 CLS_CC); } - | T_NEW class_name { do_extended_fcall_begin(CLS_C); do_begin_new_object(&$1, &$2 CLS_CC); } ctor_arguments { do_end_new_object(&$$, &$2, &$1, &$4 CLS_CC); do_extended_fcall_end(CLS_C);} - | cvar T_PLUS_EQUAL expr { do_end_variable_parse(BP_VAR_RW CLS_CC); do_binary_assign_op(ZEND_ASSIGN_ADD, &$$, &$1, &$3 CLS_CC); } - | cvar T_MINUS_EQUAL expr { do_end_variable_parse(BP_VAR_RW CLS_CC); do_binary_assign_op(ZEND_ASSIGN_SUB, &$$, &$1, &$3 CLS_CC); } - | cvar T_MUL_EQUAL expr { do_end_variable_parse(BP_VAR_RW CLS_CC); do_binary_assign_op(ZEND_ASSIGN_MUL, &$$, &$1, &$3 CLS_CC); } - | cvar T_DIV_EQUAL expr { do_end_variable_parse(BP_VAR_RW CLS_CC); do_binary_assign_op(ZEND_ASSIGN_DIV, &$$, &$1, &$3 CLS_CC); } - | cvar T_CONCAT_EQUAL expr { do_end_variable_parse(BP_VAR_RW CLS_CC); do_binary_assign_op(ZEND_ASSIGN_CONCAT, &$$, &$1, &$3 CLS_CC); } - | cvar T_MOD_EQUAL expr { do_end_variable_parse(BP_VAR_RW CLS_CC); do_binary_assign_op(ZEND_ASSIGN_MOD, &$$, &$1, &$3 CLS_CC); } - | cvar T_AND_EQUAL expr { do_end_variable_parse(BP_VAR_RW CLS_CC); do_binary_assign_op(ZEND_ASSIGN_BW_AND, &$$, &$1, &$3 CLS_CC); } - | cvar T_OR_EQUAL expr { do_end_variable_parse(BP_VAR_RW CLS_CC); do_binary_assign_op(ZEND_ASSIGN_BW_OR, &$$, &$1, &$3 CLS_CC); } - | cvar XT_OR_EQUAL expr { do_end_variable_parse(BP_VAR_RW CLS_CC); do_binary_assign_op(ZEND_ASSIGN_BW_XOR, &$$, &$1, &$3 CLS_CC); } - | cvar T_SL_EQUAL expr { do_end_variable_parse(BP_VAR_RW CLS_CC); do_binary_assign_op(ZEND_ASSIGN_SL, &$$, &$1, &$3 CLS_CC); } - | cvar T_SR_EQUAL expr { do_end_variable_parse(BP_VAR_RW CLS_CC); do_binary_assign_op(ZEND_ASSIGN_SR, &$$, &$1, &$3 CLS_CC); } - | rw_cvar T_INC { do_post_incdec(&$$, &$1, ZEND_POST_INC CLS_CC); } - | T_INC rw_cvar { do_pre_incdec(&$$, &$2, ZEND_PRE_INC CLS_CC); } - | rw_cvar T_DEC { do_post_incdec(&$$, &$1, ZEND_POST_DEC CLS_CC); } - | T_DEC rw_cvar { do_pre_incdec(&$$, &$2, ZEND_PRE_DEC CLS_CC); } - | expr T_BOOLEAN_OR { do_boolean_or_begin(&$1, &$2 CLS_CC); } expr { do_boolean_or_end(&$$, &$1, &$4, &$2 CLS_CC); } - | expr T_BOOLEAN_AND { do_boolean_and_begin(&$1, &$2 CLS_CC); } expr { do_boolean_and_end(&$$, &$1, &$4, &$2 CLS_CC); } - | expr T_LOGICAL_OR { do_boolean_or_begin(&$1, &$2 CLS_CC); } expr { do_boolean_or_end(&$$, &$1, &$4, &$2 CLS_CC); } - | expr T_LOGICAL_AND { do_boolean_and_begin(&$1, &$2 CLS_CC); } expr { do_boolean_and_end(&$$, &$1, &$4, &$2 CLS_CC); } - | expr T_LOGICAL_XOR expr { do_binary_op(ZEND_BOOL_XOR, &$$, &$1, &$3 CLS_CC); } - | expr '|' expr { do_binary_op(ZEND_BW_OR, &$$, &$1, &$3 CLS_CC); } - | expr '&' expr { do_binary_op(ZEND_BW_AND, &$$, &$1, &$3 CLS_CC); } - | expr '^' expr { do_binary_op(ZEND_BW_XOR, &$$, &$1, &$3 CLS_CC); } - | expr '.' expr { do_binary_op(ZEND_CONCAT,&$$,&$1,&$3 CLS_CC); } - | expr '+' expr { do_binary_op(ZEND_ADD,&$$,&$1,&$3 CLS_CC); } - | expr '-' expr { do_binary_op(ZEND_SUB,&$$,&$1,&$3 CLS_CC); } - | expr '*' expr { do_binary_op(ZEND_MUL,&$$,&$1,&$3 CLS_CC); } - | expr '/' expr { do_binary_op(ZEND_DIV,&$$,&$1,&$3 CLS_CC); } - | expr '%' expr { do_binary_op(ZEND_MOD,&$$,&$1,&$3 CLS_CC); } - | expr T_SL expr { do_binary_op(ZEND_SL, &$$, &$1, &$3 CLS_CC); } - | expr T_SR expr { do_binary_op(ZEND_SR, &$$, &$1, &$3 CLS_CC); } - | '+' expr { $1.u.constant.value.lval=0; $1.u.constant.type=IS_LONG; $1.op_type = IS_CONST; INIT_PZVAL(&$1.u.constant); do_binary_op(ZEND_ADD, &$$, &$1, &$2 CLS_CC); } - | '-' expr { $1.u.constant.value.lval=0; $1.u.constant.type=IS_LONG; $1.op_type = IS_CONST; INIT_PZVAL(&$1.u.constant); do_binary_op(ZEND_SUB, &$$, &$1, &$2 CLS_CC); } - | '!' expr { do_unary_op(ZEND_BOOL_NOT, &$$, &$2 CLS_CC); } - | '~' expr { do_unary_op(ZEND_BW_NOT, &$$, &$2 CLS_CC); } - | expr T_IS_EQUAL expr { do_binary_op(ZEND_IS_EQUAL, &$$, &$1, &$3 CLS_CC); } - | expr T_IS_NOT_EQUAL expr { do_binary_op(ZEND_IS_NOT_EQUAL, &$$, &$1, &$3 CLS_CC); } - | expr '<' expr { do_binary_op(ZEND_IS_SMALLER, &$$, &$1, &$3 CLS_CC); } - | expr T_IS_SMALLER_OR_EQUAL expr { do_binary_op(ZEND_IS_SMALLER_OR_EQUAL, &$$, &$1, &$3 CLS_CC); } - | expr '>' expr { do_binary_op(ZEND_IS_SMALLER, &$$, &$3, &$1 CLS_CC); } - | expr T_IS_GREATER_OR_EQUAL expr { do_binary_op(ZEND_IS_SMALLER_OR_EQUAL, &$$, &$3, &$1 CLS_CC); } - | '(' expr ')' { $$ = $2; } - | expr '?' { do_begin_qm_op(&$1, &$2 CLS_CC); } - expr ':' { do_qm_true(&$4, &$2, &$5 CLS_CC); } - expr { do_qm_false(&$$, &$7, &$2, &$5 CLS_CC); } - | T_STRING '(' { do_extended_fcall_begin(CLS_C); $2.u.opline_num = do_begin_function_call(&$1 CLS_CC); } - function_call_parameter_list - ')' { do_end_function_call(&$1, &$$, &$4, 0, $2.u.opline_num CLS_CC); do_extended_fcall_end(CLS_C); } - | r_cvar '(' { do_extended_fcall_begin(CLS_C); do_begin_dynamic_function_call(&$1 CLS_CC); } - function_call_parameter_list - ')' { do_end_function_call(&$1, &$$, &$4, 0, 1 CLS_CC); do_extended_fcall_end(CLS_C);} - | T_STRING T_PAAMAYIM_NEKUDOTAYIM T_STRING '(' { do_extended_fcall_begin(CLS_C); do_begin_class_member_function_call(&$1, &$3 CLS_CC); } - function_call_parameter_list - ')' { do_end_function_call(&$3, &$$, &$6, 1, 1 CLS_CC); do_extended_fcall_end(CLS_C);} - | internal_functions_in_yacc { $$ = $1; } - | T_INT_CAST expr { do_cast(&$$, &$2, IS_LONG CLS_CC); } - | T_DOUBLE_CAST expr { do_cast(&$$, &$2, IS_DOUBLE CLS_CC); } - | T_STRING_CAST expr { do_cast(&$$, &$2, IS_STRING CLS_CC); } - | T_ARRAY_CAST expr { do_cast(&$$, &$2, IS_ARRAY CLS_CC); } - | T_OBJECT_CAST expr { do_cast(&$$, &$2, IS_OBJECT CLS_CC); } - | T_BOOL_CAST expr { do_cast(&$$, &$2, IS_BOOL CLS_CC); } - | T_EXIT exit_expr { do_exit(&$$, &$2 CLS_CC); } - | '@' { do_begin_silence(&$1 CLS_CC); } expr { do_end_silence(&$1 CLS_CC); $$ = $3; } - | scalar { $$ = $1; } - | T_ARRAY '(' array_pair_list ')' { $$ = $3; } - | '`' encaps_list '`' { do_shell_exec(&$$, &$2 CLS_CC); } - | T_PRINT expr { do_print(&$$, &$2 CLS_CC); } -; - - -exit_expr: - /* empty */ { $$.op_type = IS_UNUSED; } - | '(' ')' { $$.op_type = IS_UNUSED; } - | '(' expr ')' { $$ = $2; } -; - - -ctor_arguments: - /* empty */ { $$.u.constant.value.lval=0; } - | '(' function_call_parameter_list ')' { $$ = $2; } -; - - -class_name: - T_STRING { $$ = $1; } - | r_cvar { $$ = $1; } -; - - - -common_scalar: - T_LNUMBER { $$=$1; } - | T_DNUMBER { $$=$1; } - | T_CONSTANT_ENCAPSED_STRING { $$ = $1; } - | T_LINE { $$ = $1; } - | T_FILE { $$ = $1; } -; - - -static_scalar: /* compile-time evaluated scalars */ - common_scalar { $$ = $1; } - | T_STRING { do_fetch_constant(&$$, &$1, ZEND_CT CLS_CC); } - | '+' static_scalar { $$ = $1; } - | '-' static_scalar { zval minus_one; minus_one.type = IS_LONG; minus_one.value.lval = -1; mul_function(&$2.u.constant, &$2.u.constant, &minus_one); $$ = $2; } - | T_ARRAY '(' static_array_pair_list ')' { $$ = $3; } -; - - -scalar: - T_STRING { do_fetch_constant(&$$, &$1, ZEND_RT CLS_CC); } - | T_STRING_VARNAME { $$ = $1; } - | common_scalar { $$ = $1; } - | '"' encaps_list '"' { $$ = $2; } - | '\'' encaps_list '\'' { $$ = $2; } - | T_HEREDOC encaps_list T_HEREDOC { $$ = $2; do_end_heredoc(CLS_C); } -; - - -static_array_pair_list: - /* empty */ { $$.op_type = IS_CONST; INIT_PZVAL(&$$.u.constant); array_init(&$$.u.constant); } - | non_empty_static_array_pair_list { $$ = $1; } -; - - -non_empty_static_array_pair_list: - non_empty_static_array_pair_list ',' static_scalar T_DOUBLE_ARROW static_scalar { do_add_static_array_element(&$$, &$3, &$5); } - | non_empty_static_array_pair_list ',' static_scalar { do_add_static_array_element(&$$, NULL, &$3); } - | static_scalar T_DOUBLE_ARROW static_scalar { $$.op_type = IS_CONST; INIT_PZVAL(&$$.u.constant); array_init(&$$.u.constant); do_add_static_array_element(&$$, &$1, &$3); } - | static_scalar { $$.op_type = IS_CONST; INIT_PZVAL(&$$.u.constant); array_init(&$$.u.constant); do_add_static_array_element(&$$, NULL, &$1); } -; - -expr: - r_cvar { $$ = $1; } - | expr_without_variable { $$ = $1; } -; - - - -r_cvar: - cvar { do_end_variable_parse(BP_VAR_R CLS_CC); $$ = $1; } -; - - -w_cvar: - cvar { do_end_variable_parse(BP_VAR_W CLS_CC); $$ = $1; } -; - - -rw_cvar: - cvar { do_end_variable_parse(BP_VAR_RW CLS_CC); $$ = $1; } -; - - -cvar: - cvar_without_objects { $$ = $1; } - | cvar_without_objects T_OBJECT_OPERATOR { do_push_object(&$1 CLS_CC); } ref_list { $$ = $4; } -; - - -cvar_without_objects: - reference_variable { $$ = $1; } - | simple_indirect_reference reference_variable { do_indirect_references(&$$, &$1, &$2 CLS_CC); } -; - - -reference_variable: - dim_list ']' { $$ = $1; } - | compound_variable { do_fetch_globals(&$1 CLS_CC); do_begin_variable_parse(CLS_C); fetch_simple_variable(&$$, &$1, 1 CLS_CC); } -; - - -compound_variable: - T_VARIABLE { $$ = $1; } - | '$' '{' expr '}' { $$ = $3; } -; - - -dim_list: - dim_list ']' '[' dim_offset { fetch_array_dim(&$$, &$1, &$4 CLS_CC); } - | compound_variable { do_fetch_globals(&$1 CLS_CC); do_begin_variable_parse(CLS_C); } '[' dim_offset { fetch_array_begin(&$$, &$1, &$4 CLS_CC); } -; - - -dim_offset: - /* empty */ { $$.op_type = IS_UNUSED; } - | expr { $$ = $1; } -; - - -ref_list: - object_property { $$ = $1; } - | ref_list T_OBJECT_OPERATOR { do_push_object(&$1 CLS_CC); } object_property { $$ = $4; } -; - -object_property: - scalar_object_property { znode tmp_znode; do_pop_object(&tmp_znode CLS_CC); do_fetch_property(&$$, &tmp_znode, &$1 CLS_CC); } - | object_dim_list ']' { $$ = $1; } -; - -scalar_object_property: - T_STRING { $$ = $1; } - | '{' expr '}' { $$ = $2; } - | cvar_without_objects { do_end_variable_parse(BP_VAR_R CLS_CC); $$ = $1; } -; - - -object_dim_list: - object_dim_list ']' '[' dim_offset { fetch_array_dim(&$$, &$1, &$4 CLS_CC); } - | T_STRING { znode tmp_znode, res; do_pop_object(&tmp_znode CLS_CC); do_fetch_property(&res, &tmp_znode, &$1 CLS_CC); $1 = res; } '[' dim_offset { fetch_array_dim(&$$, &$1, &$4 CLS_CC); } -; - - -simple_indirect_reference: - '$' { $$.u.constant.value.lval = 1; } - | simple_indirect_reference '$' { $$.u.constant.value.lval++; } -; - -assignment_list: - assignment_list ',' assignment_list_element - | assignment_list_element -; - - -assignment_list_element: - w_cvar { do_add_list_element(&$1 CLS_CC); } - | T_LIST '(' { do_new_list_begin(CLS_C); } assignment_list ')' { do_new_list_end(CLS_C); } - | /* empty */ { do_add_list_element(NULL CLS_CC); } -; - - -array_pair_list: - /* empty */ { do_init_array(&$$, NULL, NULL CLS_CC); } - | non_empty_array_pair_list { $$ = $1; } -; - -non_empty_array_pair_list: - non_empty_array_pair_list ',' expr T_DOUBLE_ARROW expr { do_add_array_element(&$$, &$5, &$3 CLS_CC); } - | non_empty_array_pair_list ',' expr { do_add_array_element(&$$, &$3, NULL CLS_CC); } - | expr T_DOUBLE_ARROW expr { do_init_array(&$$, &$3, &$1 CLS_CC); } - | expr { do_init_array(&$$, &$1, NULL CLS_CC); } -; - - -encaps_list: - encaps_list encaps_var { do_end_variable_parse(BP_VAR_R CLS_CC); do_add_variable(&$$, &$1, &$2 CLS_CC); } - | encaps_list T_STRING { do_add_string(&$$, &$1, &$2 CLS_CC); } - | encaps_list T_NUM_STRING { do_add_string(&$$, &$1, &$2 CLS_CC); } - | encaps_list T_ENCAPSED_AND_WHITESPACE { do_add_string(&$$, &$1, &$2 CLS_CC); } - | encaps_list T_CHARACTER { do_add_char(&$$, &$1, &$2 CLS_CC); } - | encaps_list T_BAD_CHARACTER { do_add_string(&$$, &$1, &$2 CLS_CC); } - | encaps_list '[' { $2.u.constant.value.chval = '['; do_add_char(&$$, &$1, &$2 CLS_CC); } - | encaps_list ']' { $2.u.constant.value.chval = ']'; do_add_char(&$$, &$1, &$2 CLS_CC); } - | encaps_list '{' { $2.u.constant.value.chval = '{'; do_add_char(&$$, &$1, &$2 CLS_CC); } - | encaps_list '}' { $2.u.constant.value.chval = '}'; do_add_char(&$$, &$1, &$2 CLS_CC); } - | encaps_list T_OBJECT_OPERATOR { znode tmp; $2.u.constant.value.chval = '-'; do_add_char(&tmp, &$1, &$2 CLS_CC); $2.u.constant.value.chval = '>'; do_add_char(&$$, &tmp, &$2 CLS_CC); } - | /* empty */ { do_init_string(&$$ CLS_CC); } - -; - - - -encaps_var: - T_VARIABLE { do_fetch_globals(&$1 CLS_CC); do_begin_variable_parse(CLS_C); fetch_simple_variable(&$$, &$1, 1 CLS_CC); } - | T_VARIABLE '[' { do_begin_variable_parse(CLS_C); } encaps_var_offset ']' { do_fetch_globals(&$1 CLS_CC); fetch_array_begin(&$$, &$1, &$4 CLS_CC); } - | T_VARIABLE T_OBJECT_OPERATOR T_STRING { do_begin_variable_parse(CLS_C); fetch_simple_variable(&$2, &$1, 1 CLS_CC); do_fetch_property(&$$, &$2, &$3 CLS_CC); } - | T_DOLLAR_OPEN_CURLY_BRACES expr '}' { do_begin_variable_parse(CLS_C); fetch_simple_variable(&$$, &$2, 1 CLS_CC); } - | T_DOLLAR_OPEN_CURLY_BRACES T_STRING_VARNAME '[' expr ']' '}' { do_begin_variable_parse(CLS_C); fetch_array_begin(&$$, &$2, &$4 CLS_CC); } - | T_CURLY_OPEN cvar '}' { $$ = $2; } -; - - -encaps_var_offset: - T_STRING { $$ = $1; } - | T_NUM_STRING { $$ = $1; } - | T_VARIABLE { fetch_simple_variable(&$$, &$1, 1 CLS_CC); } -; - - -internal_functions_in_yacc: - T_ISSET '(' cvar ')' { do_isset_or_isempty(ZEND_ISSET, &$$, &$3 CLS_CC); } - | T_EMPTY '(' cvar ')' { do_isset_or_isempty(ZEND_ISEMPTY, &$$, &$3 CLS_CC); } - | T_INCLUDE expr { do_include_or_eval(ZEND_INCLUDE, &$$, &$2 CLS_CC); } - | T_EVAL '(' expr ')' { do_include_or_eval(ZEND_EVAL, &$$, &$3 CLS_CC); } -; - - -%% - diff --git a/Zend/zend-scanner.h b/Zend/zend-scanner.h deleted file mode 100644 index 8b51d5d6ba..0000000000 --- a/Zend/zend-scanner.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | Zend Engine | - +----------------------------------------------------------------------+ - | Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski | - +----------------------------------------------------------------------+ - | This source file is subject to version 0.91 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at | - | http://www.zend.com/license/0_91.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Andi Gutmans <andi@zend.com> | - | Zeev Suraski <zeev@zend.com> | - +----------------------------------------------------------------------+ -*/ - - -#ifndef _LANGUAGE_SCANNER_H -#define _LANGUAGE_SCANNER_H - -#ifdef ZTS -class ZendFlexLexer : public yyFlexLexer -{ -public: - virtual ~ZendFlexLexer(); - int lex_scan(zval *zendlval CLS_DC); - void BeginState(int state); -}; - -#endif /* ZTS */ - - -#ifndef ZTS -typedef struct _zend_lex_state { - YY_BUFFER_STATE buffer_state; - int state; - uint return_offset; - uint lineno; - FILE *in; - char *filename; -} zend_lex_state; -#else -typedef struct _zend_lex_state { - ZendFlexLexer *ZFL; - istream *input_file; -} zend_lex_state; -#endif - -#endif diff --git a/Zend/zend-scanner.l b/Zend/zend-scanner.l deleted file mode 100644 index d113c3d520..0000000000 --- a/Zend/zend-scanner.l +++ /dev/null @@ -1,1499 +0,0 @@ -%{ - -/* - +----------------------------------------------------------------------+ - | Zend Engine | - +----------------------------------------------------------------------+ - | Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski | - +----------------------------------------------------------------------+ - | This source file is subject to version 0.91 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at | - | http://www.zend.com/license/0_91.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Andi Gutmans <andi@zend.com> | - | Zeev Suraski <zeev@zend.com> | - +----------------------------------------------------------------------+ -*/ - -%} - -%x ST_IN_SCRIPTING -%x ST_DOUBLE_QUOTES -%x ST_SINGLE_QUOTE -%x ST_BACKQUOTE -%x ST_HEREDOC -%x ST_LOOKING_FOR_PROPERTY -%x ST_LOOKING_FOR_VARNAME -%x ST_COMMENT -%option stack - -%{ - -#if WIN32|WINNT -#include <winsock.h> -#include <io.h> -#endif - -#include <errno.h> - -#include "zend.h" -#include "zend_alloc.h" -#include "zend_compile.h" -#include "zend-scanner.h" -#include "zend_highlight.h" -#include "zend_constants.h" -#include "zend_variables.h" -#include "zend_operators.h" - -#ifdef ZTS -# include <fstream.h> -# ifdef HAVE_STDIOSTR_H -# include <stdiostr.h> -# endif -# ifdef HAVE_STDIOSTREAM_H -# include <stdiostream.h> -# endif -# if WIN32||WINNT -# include <strstrea.h> -# else -# include <strstream.h> -# endif -#endif - -#ifdef HAVE_STDARG_H -# include <stdarg.h> -#endif - -#ifdef HAVE_UNISTD_H -# include <unistd.h> -#endif - -#ifdef ZTS -#define YY_DECL int ZendFlexLexer::lex_scan(zval *zendlval CLS_DC) -#else -#define YY_DECL int lex_scan(zval *zendlval CLS_DC) -#endif -#define ECHO { ZEND_WRITE( yytext, yyleng ); } - -#ifdef ZTS -# define MY_INPUT yyinput -#else -# define MY_INPUT input -#endif - -#define YY_FATAL_ERROR zend_fatal_scanner_error - -#define HANDLE_NEWLINES(s,l) \ -do { \ - char *p = (s),*boundary = p+(l); \ -\ - while(p<boundary) { \ - if (*p++=='\n') { \ - CG(zend_lineno)++; \ - } \ - } \ -} while(0) - -#define HANDLE_NEWLINE(c) \ -{ \ - if (c=='\n') { \ - CG(zend_lineno)++; \ - } \ -} - - -#define ZEND_IS_OCT(c) ((c)>='0' && (c)<'8') -#define ZEND_IS_HEX(c) (((c)>='0' && (c)<='9') || ((c)>='a' && (c)<='f') || ((c)>='A' && (c)<='F')) - - -void zend_fatal_scanner_error(char *message) -{ - zend_error(E_COMPILE_ERROR, message); -} - -BEGIN_EXTERN_C() -void startup_scanner(CLS_D) -{ - CG(heredoc) = NULL; - CG(heredoc_len)=0; -} - - -void shutdown_scanner(CLS_D) -{ - if (CG(heredoc)) { - efree(CG(heredoc)); - CG(heredoc_len)=0; - } -} -END_EXTERN_C() - - -static inline void save_lexical_state(zend_lex_state *lex_state CLS_DC) -{ -#ifndef ZTS - memcpy(&lex_state->buffer_state,&YY_CURRENT_BUFFER,sizeof(YY_BUFFER_STATE)); - lex_state->in = yyin; - lex_state->lineno = CG(zend_lineno); - lex_state->state = YYSTATE; - lex_state->filename = zend_get_compiled_filename(); -#else - lex_state->ZFL = CG(ZFL); -#endif -} - - -inline void restore_lexical_state(zend_lex_state *lex_state CLS_DC) -{ -#ifndef ZTS - YY_BUFFER_STATE original_buffer_state = YY_CURRENT_BUFFER; - - if (lex_state->buffer_state) { - yy_switch_to_buffer(lex_state->buffer_state); - } else { - YY_CURRENT_BUFFER = NULL; - } - - yy_delete_buffer(original_buffer_state); - yyin = lex_state->in; - CG(zend_lineno) = lex_state->lineno; - BEGIN(lex_state->state); - zend_restore_compiled_filename(lex_state->filename); -#else - delete((ZendFlexLexer *) CG(ZFL)); - CG(ZFL) = lex_state->ZFL; -#endif -} - - -BEGIN_EXTERN_C() - - -ZEND_API void zend_open_file_dtor(void *f) -{ -#ifdef ZTS - delete *((istream **) f); -#else - fclose(*((FILE **) f)); -#endif -} - - -ZEND_API void zend_close_file_handle(zend_file_handle *file_handle CLS_DC) -{ -#ifdef ZTS - zend_llist_del_element(&CG(open_files), &file_handle->handle.is); -#else - zend_llist_del_element(&CG(open_files), &file_handle->handle.fp); -#endif -} - - -ZEND_API inline int open_file_for_scanning(zend_file_handle *file_handle CLS_DC) -{ -#ifndef ZTS - switch (file_handle->type) { - case ZEND_HANDLE_FILENAME: - file_handle->handle.fp = zend_fopen(file_handle->filename); - break; - case ZEND_HANDLE_FD: - file_handle->handle.fp = fdopen(file_handle->handle.fd, "r"); - break; - case ZEND_HANDLE_FP: - file_handle->handle.fp = file_handle->handle.fp; - break; - } - if (!file_handle->handle.fp) { - return FAILURE; - } - if (file_handle->handle.fp != stdin) { - zend_llist_add_element(&CG(open_files), &file_handle->handle.fp); - } - file_handle->type = ZEND_HANDLE_FP; - /* Reset the scanner for scanning the new file */ - yyin = file_handle->handle.fp; - yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE)); - BEGIN(INITIAL); -#else - switch (file_handle->type) { - case ZEND_HANDLE_FD: - file_handle->handle.is = new ifstream(file_handle->handle.fd); - break; - case ZEND_HANDLE_FILENAME: - { - file_handle->handle.fp = zend_fopen(file_handle->filename); - if (!file_handle->handle.fp) { - return FAILURE; - } - file_handle->handle.is = new istdiostream(file_handle->handle.fp); - break; - } - case ZEND_HANDLE_FP: - if (file_handle->handle.fp==stdin) { - file_handle->handle.is = (ifstream *) &cin; - } else { - if (!file_handle->handle.fp) { - return FAILURE; - } - file_handle->handle.is = new istdiostream(file_handle->handle.fp); - } - break; - } - if (file_handle->handle.is->fail()) { - delete file_handle->handle.is; - return FAILURE; - } - if (file_handle->handle.is != &cin) { - zend_llist_add_element(&CG(open_files), &file_handle->handle.is); - } - file_handle->type = ZEND_HANDLE_ISTREAM; - - CG(ZFL) = new ZendFlexLexer; - CG(ZFL)->switch_streams(file_handle->handle.is, &cout); -#endif - zend_set_compiled_filename(file_handle->filename); - CG(zend_lineno) = 1; - return SUCCESS; -} -END_EXTERN_C() - - -ZEND_API zend_op_array *compile_files(int mark_as_ref CLS_DC, int file_count, ...) -{ - va_list files; - zend_op_array *op_array; - - va_start(files, file_count); - op_array = v_compile_files(mark_as_ref CLS_CC, file_count, files); - va_end(files); - return op_array; -} - - -ZEND_API zend_op_array *v_compile_files(int mark_as_ref CLS_DC, int file_count, va_list files) -{ - zend_lex_state original_lex_state; - zend_op_array *op_array = (zend_op_array *) emalloc(sizeof(zend_op_array)); - zend_op_array *original_active_op_array = CG(active_op_array); - zend_op_array *retval=NULL; - zend_file_handle *file_handle; - int i; - int compiler_result; - int compiled_files=0; - - init_op_array(op_array, INITIAL_OP_ARRAY_SIZE); - save_lexical_state(&original_lex_state CLS_CC); - - retval = op_array; /* success oriented */ - for (i=0; i<file_count; i++) { - file_handle = va_arg(files, zend_file_handle *); - if (!file_handle) { - continue; - } - if (open_file_for_scanning(file_handle CLS_CC)==FAILURE) { - zend_message_dispatcher(ZMSG_FAILED_INCLUDE_FOPEN, file_handle->filename); - } else { - CG(active_op_array) = op_array; - compiler_result = zendparse(CLS_C); - zend_close_file_handle(file_handle CLS_CC); - restore_lexical_state(&original_lex_state CLS_CC); - CG(active_op_array) = original_active_op_array; - if (compiler_result==1) { /* parser error */ - CG(unclean_shutdown) = 1; - retval = NULL; - break; - } - compiled_files++; - } - } - - if (retval) { - if (compiled_files>0) { - pass_two(op_array); - if (mark_as_ref) { - pass_include_eval(op_array); - } - } else { - destroy_op_array(op_array); - efree(op_array); - retval = NULL; - } - } - return retval; -} - - -zend_op_array *compile_filename(zval *filename CLS_DC) -{ - zend_file_handle file_handle; - zval tmp; - zend_op_array *retval; - - if (filename->type != IS_STRING) { - tmp = *filename; - zval_copy_ctor(&tmp); - convert_to_string(&tmp); - filename = &tmp; - } - file_handle.filename = filename->value.str.val; - file_handle.type = ZEND_HANDLE_FILENAME; - retval = zend_compile_files(1 CLS_CC, 1, &file_handle); - if (filename==&tmp) { - zval_dtor(&tmp); - } - return retval; -} - - -static inline int prepare_string_for_scanning(zval *str CLS_DC) -{ -#ifndef ZTS - /* enforce two trailing NULLs for flex... */ - str->value.str.val = (char *) erealloc(str->value.str.val,str->value.str.len+2); - - str->value.str.val[str->value.str.len+1]=0; - - yyin=NULL; - yy_scan_buffer(str->value.str.val, str->value.str.len+2); -#else - istrstream *input_stream = new istrstream(str->value.str.val, str->value.str.len); - CG(ZFL) = new ZendFlexLexer; - - CG(ZFL)->switch_streams(input_stream, &cout); -#endif - return SUCCESS; -} - - -zend_op_array *compile_string(zval *source_string CLS_DC) -{ - zend_lex_state original_lex_state; - zend_op_array *op_array = (zend_op_array *) emalloc(sizeof(zend_op_array)); - zend_op_array *original_active_op_array = CG(active_op_array); - zend_op_array *retval; - zval tmp; - int compiler_result; - - if (source_string->value.str.len==0) { - efree(op_array); - return NULL; - } - tmp = *source_string; - zval_copy_ctor(&tmp); - convert_to_string(&tmp); - source_string = &tmp; - - init_op_array(op_array, INITIAL_OP_ARRAY_SIZE); - op_array->type = ZEND_EVAL_CODE; - save_lexical_state(&original_lex_state CLS_CC); - if (prepare_string_for_scanning(source_string CLS_CC)==FAILURE) { - destroy_op_array(op_array); - efree(op_array); - retval = NULL; - } else { - CG(active_op_array) = op_array; -#ifndef ZTS - BEGIN(ST_IN_SCRIPTING); -#else - CG(ZFL)->BeginState(ST_IN_SCRIPTING); -#endif - compiler_result = zendparse(CLS_C); - restore_lexical_state(&original_lex_state CLS_CC); - CG(active_op_array) = original_active_op_array; - - if (compiler_result==1) { - CG(unclean_shutdown)=1; - retval = NULL; - } else { - pass_two(op_array); - pass_include_eval(op_array); - retval = op_array; - } - } - zval_dtor(&tmp); - return retval; -} - - -BEGIN_EXTERN_C() -int require_filename(char *filename CLS_DC) -{ - zend_file_handle file_handle; - - file_handle.type = ZEND_HANDLE_FILENAME; - file_handle.filename = filename; - if (require_file(&file_handle CLS_CC)==FAILURE) { - zend_bailout(); - return FAILURE; /* will never get here */ - } - return SUCCESS; -} - - -int require_file(zend_file_handle *file_handle CLS_DC) -{ - zend_lex_state original_lex_state; - int compiler_result; - - save_lexical_state(&original_lex_state CLS_CC); - if (open_file_for_scanning(file_handle CLS_CC)==FAILURE) { - zend_message_dispatcher(ZMSG_FAILED_REQUIRE_FOPEN, file_handle->filename); - return FAILURE; - } - compiler_result = zendparse(CLS_C); - zend_close_file_handle(file_handle CLS_CC); - restore_lexical_state(&original_lex_state CLS_CC); - if (compiler_result==1) { - zend_bailout(); - } - return SUCCESS; -} - - -int highlight_file(char *filename, zend_syntax_highlighter_ini *syntax_highlighter_ini) -{ - zend_lex_state original_lex_state; - zend_file_handle file_handle; - CLS_FETCH(); - - file_handle.type = ZEND_HANDLE_FILENAME; - file_handle.filename = filename; - save_lexical_state(&original_lex_state CLS_CC); - if (open_file_for_scanning(&file_handle CLS_CC)==FAILURE) { - zend_message_dispatcher(ZMSG_FAILED_HIGHLIGHT_FOPEN, filename); - return FAILURE; - } - zend_highlight(syntax_highlighter_ini); - zend_close_file_handle(&file_handle CLS_CC); - restore_lexical_state(&original_lex_state CLS_CC); - return SUCCESS; -} - - -int highlight_string(zval *str, zend_syntax_highlighter_ini *syntax_highlighter_ini) -{ - zend_lex_state original_lex_state; - zval tmp = *str; - CLS_FETCH(); - - str = &tmp; - zval_copy_ctor(str); - save_lexical_state(&original_lex_state CLS_CC); - if (prepare_string_for_scanning(str CLS_CC)==FAILURE) { - return FAILURE; - } - zend_highlight(syntax_highlighter_ini); - restore_lexical_state(&original_lex_state CLS_CC); - zval_dtor(str); - return SUCCESS; -} -END_EXTERN_C() - -#ifdef ZTS -BEGIN_EXTERN_C() -int lex_scan(zval *zendlval CLS_DC) -{ - return CG(ZFL)->lex_scan(zendlval CLS_CC); -} - - -const char *zend_get_zendtext(CLS_D) -{ - return CG(ZFL)->YYText(); -} - - -int zend_get_zendleng(CLS_D) -{ - return CG(ZFL)->YYLeng(); -} -END_EXTERN_C() - - -void ZendFlexLexer::BeginState(int state) -{ - BEGIN(state); -} - - -ZendFlexLexer::~ZendFlexLexer() -{ - if (yy_start_stack) { - yy_flex_free(yy_start_stack); - } -} - - -int yyFlexLexer::yylex() -{ - fprintf(stderr, "Error: yyFlexLexer::yylex() called\n"); - return -1; -} - -#endif - - -/* redefine YY_INPUT to handle urls for win32*/ -#if 0 /*WIN32|WINNT*/ -#define YY_INPUT(buf,result,max_size) \ - if ( yyin->_tmpfname != "url" ){ \ - if ( yy_current_buffer->yy_is_interactive ) \ - { \ - int c = '*', n; \ - for ( n = 0; n < max_size && \ - (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ - buf[n] = (char) c; \ - if ( c == '\n' ) \ - buf[n++] = (char) c; \ - if ( c == EOF && ferror( yyin ) ) \ - YY_FATAL_ERROR( "input in flex scanner failed" ); \ - result = n; \ - } \ - else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \ - && ferror( yyin ) ) \ - YY_FATAL_ERROR( "input in flex scanner failed" ); \ - }else{ /* this is a url */ \ - int recv_char=0,socketd=0; \ - /*memset(buf,0,max_size);*/ \ - socketd=yyin->_file; \ - if ( yy_current_buffer->yy_is_interactive ) \ - { \ - int c = '*', n; \ - for ( n = 0; n < max_size && \ - ( (recv_char=recv( socketd,(char *)&c,1,0 ))) >0 && c != '\n'; ++n ) \ - buf[n] = (char) c; \ - if ( c == '\n' ) \ - buf[n++] = (char) c; \ - if ( recv_char == SOCKET_ERROR ) \ - YY_FATAL_ERROR( "input from url in flex scanner failed" ); \ - result = n; \ - } \ - else if ((result = recv( socketd, (char *)buf, max_size, 0)) == SOCKET_ERROR) \ - YY_FATAL_ERROR( "input from url read in flex scanner failed" ); \ - } -#endif - -%} - -LNUM [0-9]+ -DNUM ([0-9]*[\.][0-9]+)|([0-9]+[\.][0-9]*) -EXPONENT_DNUM (({LNUM}|{DNUM})[eE][+-]?{LNUM}) -HNUM "0x"[0-9a-fA-F]+ -LABEL [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]* -WHITESPACE [ \n\r\t]+ -TABS_AND_SPACES [ \t]* -TOKENS [;:,.\[\]()|^&+-/*=%!~$<>?@] -ENCAPSED_TOKENS [\[\]{}$] -ESCAPED_AND_WHITESPACE [\n\t\r #'.:;,()|^&+-/*=%!~<>?@]+ - -%option noyylineno -%option noyywrap -%% - -<ST_IN_SCRIPTING>"exit" { - return T_EXIT; -} - -<ST_IN_SCRIPTING>"die" { - return T_EXIT; -} - -<ST_IN_SCRIPTING>"old_function" { - return T_OLD_FUNCTION; -} - -<ST_IN_SCRIPTING>"function"|"cfunction" { - return T_FUNCTION; -} - -<ST_IN_SCRIPTING>"const" { - return T_CONST; -} - -<ST_IN_SCRIPTING>"return" { - return T_RETURN; -} - -<ST_IN_SCRIPTING>"if" { - return T_IF; -} - -<ST_IN_SCRIPTING>"elseif" { - return T_ELSEIF; -} - -<ST_IN_SCRIPTING>"endif" { - return T_ENDIF; -} - -<ST_IN_SCRIPTING>"else" { - return T_ELSE; -} - -<ST_IN_SCRIPTING>"while" { - return T_WHILE; -} - -<ST_IN_SCRIPTING>"endwhile" { - return T_ENDWHILE; -} - -<ST_IN_SCRIPTING>"do" { - return T_DO; -} - -<ST_IN_SCRIPTING>"for" { - return T_FOR; -} - -<ST_IN_SCRIPTING>"endfor" { - return T_ENDFOR; -} - -<ST_IN_SCRIPTING>"foreach" { - return T_FOREACH; -} - -<ST_IN_SCRIPTING>"endforeach" { - return T_ENDFOREACH; -} - -<ST_IN_SCRIPTING>"as" { - return T_AS; -} - -<ST_IN_SCRIPTING>"switch" { - return T_SWITCH; -} - -<ST_IN_SCRIPTING>"endswitch" { - return T_ENDSWITCH; -} - -<ST_IN_SCRIPTING>"case" { - return T_CASE; -} - -<ST_IN_SCRIPTING>"default" { - return T_DEFAULT; -} - -<ST_IN_SCRIPTING>"break" { - return T_BREAK; -} - -<ST_IN_SCRIPTING>"continue" { - return T_CONTINUE; -} - -<ST_IN_SCRIPTING>"echo" { - return T_ECHO; -} - -<ST_IN_SCRIPTING>"print" { - return T_PRINT; -} - -<ST_IN_SCRIPTING>"class" { - return T_CLASS; -} - -<ST_IN_SCRIPTING>"extends" { - return T_EXTENDS; -} - -<ST_IN_SCRIPTING,ST_DOUBLE_QUOTES,ST_BACKQUOTE,ST_HEREDOC>"->" { - yy_push_state(ST_LOOKING_FOR_PROPERTY); - return T_OBJECT_OPERATOR; -} - -<ST_LOOKING_FOR_PROPERTY>{LABEL} { - yy_pop_state(); - zendlval->value.str.val = (char *)estrndup(yytext, yyleng); - zendlval->value.str.len = yyleng; - zendlval->type = IS_STRING; - return T_STRING; -} - -<ST_LOOKING_FOR_PROPERTY>. { - /*unput(yytext[0]);*/ - yyless(0); - yy_pop_state(); -} - -<ST_IN_SCRIPTING>"::" { - return T_PAAMAYIM_NEKUDOTAYIM; -} - -<ST_IN_SCRIPTING>"new" { - return T_NEW; -} - -<ST_IN_SCRIPTING>"var" { - return T_VAR; -} - -<ST_IN_SCRIPTING>"("{TABS_AND_SPACES}("int"|"integer"){TABS_AND_SPACES}")" { - return T_INT_CAST; -} - -<ST_IN_SCRIPTING>"("{TABS_AND_SPACES}("real"|"double"|"float"){TABS_AND_SPACES}")" { - return T_DOUBLE_CAST; -} - -<ST_IN_SCRIPTING>"("{TABS_AND_SPACES}"string"{TABS_AND_SPACES}")" { - return T_STRING_CAST; -} - -<ST_IN_SCRIPTING>"("{TABS_AND_SPACES}"array"{TABS_AND_SPACES}")" { - return T_ARRAY_CAST; -} - -<ST_IN_SCRIPTING>"("{TABS_AND_SPACES}"object"{TABS_AND_SPACES}")" { - return T_OBJECT_CAST; -} - -<ST_IN_SCRIPTING>"("{TABS_AND_SPACES}("bool"|"boolean"){TABS_AND_SPACES}")" { - return T_BOOL_CAST; -} - -<ST_IN_SCRIPTING>"eval" { - return T_EVAL; -} - -<ST_IN_SCRIPTING>"include" { - return T_INCLUDE; -} - -<ST_IN_SCRIPTING>"require" { - return T_REQUIRE; -} - -<ST_IN_SCRIPTING>"global" { - return T_GLOBAL; -} - -<ST_IN_SCRIPTING>"isset" { - return T_ISSET; -} - -<ST_IN_SCRIPTING>"empty" { - return T_EMPTY; -} - -<ST_IN_SCRIPTING>"static" { - return T_STATIC; -} - -<ST_IN_SCRIPTING>"unset" { - return T_UNSET; -} - -<ST_IN_SCRIPTING>"=>" { - return T_DOUBLE_ARROW; -} - -<ST_IN_SCRIPTING>"list" { - return T_LIST; -} - -<ST_IN_SCRIPTING>"array" { - return T_ARRAY; -} - -<ST_IN_SCRIPTING>"++" { - return T_INC; -} - -<ST_IN_SCRIPTING>"--" { - return T_DEC; -} - -<ST_IN_SCRIPTING>"==" { - return T_IS_EQUAL; -} - -<ST_IN_SCRIPTING>"!="|"<>" { - return T_IS_NOT_EQUAL; -} - -<ST_IN_SCRIPTING>"<=" { - return T_IS_SMALLER_OR_EQUAL; -} - -<ST_IN_SCRIPTING>">=" { - return T_IS_GREATER_OR_EQUAL; -} - -<ST_IN_SCRIPTING>"+=" { - return T_PLUS_EQUAL; -} - -<ST_IN_SCRIPTING>"-=" { - return T_MINUS_EQUAL; -} - -<ST_IN_SCRIPTING>"*=" { - return T_MUL_EQUAL; -} - -<ST_IN_SCRIPTING>"/=" { - return T_DIV_EQUAL; -} - -<ST_IN_SCRIPTING>".=" { - return T_CONCAT_EQUAL; -} - - -<ST_IN_SCRIPTING>"%=" { - return T_MOD_EQUAL; -} - -<ST_IN_SCRIPTING>"<<=" { - return T_SL_EQUAL; -} - -<ST_IN_SCRIPTING>">>=" { - return T_SR_EQUAL; -} - -<ST_IN_SCRIPTING>"&=" { - return T_AND_EQUAL; -} - -<ST_IN_SCRIPTING>"|=" { - return T_OR_EQUAL; -} - -<ST_IN_SCRIPTING>"^=" { - return XT_OR_EQUAL; -} - -<ST_IN_SCRIPTING>"||" { - return T_BOOLEAN_OR; -} - -<ST_IN_SCRIPTING>"&&" { - return T_BOOLEAN_AND; -} - -<ST_IN_SCRIPTING>"OR" { - return T_LOGICAL_OR; -} - -<ST_IN_SCRIPTING>"AND" { - return T_LOGICAL_AND; -} - -<ST_IN_SCRIPTING>"XOR" { - return T_LOGICAL_XOR; -} - -<ST_IN_SCRIPTING>"<<" { - return T_SL; -} - -<ST_IN_SCRIPTING>">>" { - return T_SR; -} - -<ST_IN_SCRIPTING>{TOKENS} { - return yytext[0]; -} - - -<ST_IN_SCRIPTING>"{" { - yy_push_state(ST_IN_SCRIPTING); - return '{'; -} - - -<ST_DOUBLE_QUOTES,ST_BACKQUOTE,ST_HEREDOC>"${" { - yy_push_state(ST_LOOKING_FOR_VARNAME); - return T_DOLLAR_OPEN_CURLY_BRACES; -} - - -<ST_IN_SCRIPTING>"}" { - /* This is a temporary fix which is dependant on flex and it's implementation */ - if (yy_start_stack_ptr) { - yy_pop_state(); - } - return '}'; -} - - -<ST_LOOKING_FOR_VARNAME>{LABEL} { - zendlval->value.str.val = (char *) estrndup(yytext, yyleng); - zendlval->value.str.len = yyleng; - zendlval->type = IS_STRING; - yy_pop_state(); - yy_push_state(ST_IN_SCRIPTING); - return T_STRING_VARNAME; -} - - -<ST_LOOKING_FOR_VARNAME>. { - /*unput(yytext[0]);*/ - yyless(0); - yy_pop_state(); - yy_push_state(ST_IN_SCRIPTING); -} - - -<ST_IN_SCRIPTING>{LNUM}|{HNUM} { - errno = 0; - zendlval->value.lval = strtol(yytext, NULL, 0); - if (errno == ERANGE) { /* overflow */ - zendlval->value.dval = strtod(yytext,NULL); - zendlval->type = IS_DOUBLE; - return T_DNUMBER; - } else { - zendlval->type = IS_LONG; - return T_LNUMBER; - } -} - -<ST_DOUBLE_QUOTES,ST_BACKQUOTE,ST_HEREDOC>{LNUM}|{HNUM} { /* treat numbers (almost) as strings inside encapsulated strings */ - zendlval->value.str.val = (char *)estrndup(yytext, yyleng); - zendlval->value.str.len = yyleng; - zendlval->type = IS_STRING; - return T_NUM_STRING; -} - -<ST_IN_SCRIPTING>{DNUM}|{EXPONENT_DNUM} { - zendlval->value.dval = strtod(yytext,NULL); - zendlval->type = IS_DOUBLE; - return T_DNUMBER; -} - -<ST_IN_SCRIPTING>"__LINE__" { - zendlval->value.lval = CG(zend_lineno); - zendlval->type = IS_LONG; - return T_LINE; -} - -<ST_IN_SCRIPTING>"__FILE__" { - char *filename = zend_get_compiled_filename(); - - if (!filename) { - filename = ""; - } - zendlval->value.str.len = strlen(filename); - zendlval->value.str.val = estrndup(filename,zendlval->value.str.len); - zendlval->type = IS_STRING; - return T_FILE; -} - - -<INITIAL>(([^<]|"<"[^?%s<]){1,400})|"<s"|"<" { - zendlval->value.str.val = (char *) estrndup(yytext, yyleng); - zendlval->value.str.len = yyleng; - zendlval->type = IS_STRING; - HANDLE_NEWLINES(yytext,yyleng); - return T_INLINE_HTML; -} - -<INITIAL>"<?"|"<script"{WHITESPACE}+"language"{WHITESPACE}*"="{WHITESPACE}*("php"|"\"php\""|"\'php\'"){WHITESPACE}*">" { - HANDLE_NEWLINES(yytext,yyleng); - if (CG(short_tags) || yyleng>2) { /* yyleng>2 means it's not <? but <script> */ - zendlval->value.str.val = yytext; /* no copying - intentional */ - zendlval->value.str.len = yyleng; - zendlval->type = IS_STRING; - BEGIN(ST_IN_SCRIPTING); - return T_OPEN_TAG; - } else { - zendlval->value.str.val = (char *) estrndup(yytext, yyleng); - zendlval->value.str.len = yyleng; - zendlval->type = IS_STRING; - return T_INLINE_HTML; - } -} - - -<INITIAL>"<%="|"<?=" { - if ((yytext[1]=='%' && CG(asp_tags)) - || (yytext[1]=='?' && CG(short_tags))) { - zendlval->value.str.val = yytext; /* no copying - intentional */ - zendlval->value.str.len = yyleng; - zendlval->type = IS_STRING; - BEGIN(ST_IN_SCRIPTING); - return T_OPEN_TAG_WITH_ECHO; - } else { - zendlval->value.str.val = (char *) estrndup(yytext, yyleng); - zendlval->value.str.len = yyleng; - zendlval->type = IS_STRING; - return T_INLINE_HTML; - } -} - - -<INITIAL>"<%" { - if (CG(asp_tags)) { - zendlval->value.str.val = yytext; /* no copying - intentional */ - zendlval->value.str.len = yyleng; - zendlval->type = IS_STRING; - BEGIN(ST_IN_SCRIPTING); - } else { - zendlval->value.str.val = (char *) estrndup(yytext, yyleng); - zendlval->value.str.len = yyleng; - zendlval->type = IS_STRING; - return T_INLINE_HTML; - } -} - - -<INITIAL>"<?php"[ \n\r\t] { - zendlval->value.str.val = yytext; /* no copying - intentional */ - zendlval->value.str.len = yyleng; - zendlval->type = IS_STRING; - HANDLE_NEWLINE(yytext[yyleng-1]); - BEGIN(ST_IN_SCRIPTING); - return T_OPEN_TAG; -} - - -<INITIAL>"<?php_track_vars?>"([\n]|"\r\n")? { - zend_message_dispatcher(ZMSG_ENABLE_TRACK_VARS, NULL); - HANDLE_NEWLINE(yytext[yyleng-1]); - return T_PHP_TRACK_VARS; -} - -<ST_IN_SCRIPTING,ST_DOUBLE_QUOTES,ST_HEREDOC,ST_BACKQUOTE>"$"{LABEL} { - zendlval->value.str.val = (char *)estrndup(yytext+1, yyleng-1); - zendlval->value.str.len = yyleng-1; - zendlval->type = IS_STRING; - return T_VARIABLE; -} - - -<ST_IN_SCRIPTING>{LABEL} { - zendlval->value.str.val = (char *)estrndup(yytext, yyleng); - zendlval->value.str.len = yyleng; - zendlval->type = IS_STRING; - return T_STRING; -} - - -<ST_DOUBLE_QUOTES,ST_BACKQUOTE,ST_HEREDOC>{LABEL} { - zendlval->value.str.val = (char *)estrndup(yytext, yyleng); - zendlval->value.str.len = yyleng; - zendlval->type = IS_STRING; - return T_STRING; -} - - -<ST_IN_SCRIPTING>{WHITESPACE} { - zendlval->value.str.val = yytext; /* no copying - intentional */ - zendlval->value.str.len = yyleng; - zendlval->type = IS_STRING; - HANDLE_NEWLINES(yytext,yyleng); - return T_WHITESPACE; -} - - -<ST_IN_SCRIPTING>([#]|"//")([^\n\r?]|"?"[^>\n\r])*("?\n"|"?\r\n")? { /* eat one line comments */ - HANDLE_NEWLINE(yytext[yyleng-1]); - return T_COMMENT; -} - -<ST_IN_SCRIPTING>"/*" { - BEGIN(ST_COMMENT); - yymore(); -} - - -<ST_COMMENT>[^*]+ { - yymore(); -} - -<ST_COMMENT>"*/" { - HANDLE_NEWLINES(yytext, yyleng); - BEGIN(ST_IN_SCRIPTING); - return T_COMMENT; -} - -<ST_COMMENT>"*" { - yymore(); -} - -<ST_IN_SCRIPTING>("?>"|"</script"{WHITESPACE}*">")([\n]|"\r\n")? { - zendlval->value.str.val = yytext; /* no copying - intentional */ - zendlval->value.str.len = yyleng; - zendlval->type = IS_STRING; - HANDLE_NEWLINES(yytext, yyleng); - BEGIN(INITIAL); - return T_CLOSE_TAG; /* implicit ';' at php-end tag */ -} - - -<ST_IN_SCRIPTING>"%>"([\n]|"\r\n")? { - zendlval->value.str.val = yytext; /* no copying - intentional */ - zendlval->value.str.len = yyleng; - zendlval->type = IS_STRING; - HANDLE_NEWLINES(yytext,yyleng); - if (CG(asp_tags)) { - BEGIN(INITIAL); - return T_CLOSE_TAG; /* implicit ';' at php-end tag */ - } else { - return T_INLINE_HTML; - } -} - - -<ST_IN_SCRIPTING>(["]([^$"\\]|("\\".))*["]) { - register char *s, *t; - char *end; - - zendlval->value.str.val = estrndup(yytext+1, yyleng-2); - zendlval->value.str.len = yyleng-2; - zendlval->type = IS_STRING; - HANDLE_NEWLINES(yytext,yyleng); - - /* convert escape sequences */ - s = t = zendlval->value.str.val; - end = s+zendlval->value.str.len; - while (s<end) { - if (*s=='\\') { - s++; - if (s>=end) { - continue; - } - switch(*s) { - case 'n': - *t++ = '\n'; - zendlval->value.str.len--; - break; - case 'r': - *t++ = '\r'; - zendlval->value.str.len--; - break; - case 't': - *t++ = '\t'; - zendlval->value.str.len--; - break; - case '\\': - case '$': - case '"': - *t++ = *s; - zendlval->value.str.len--; - break; - default: - /* check for an octal */ - if (ZEND_IS_OCT(*s)) { - char octal_buf[4] = { 0, 0, 0, 0 }; - - octal_buf[0] = *s; - zendlval->value.str.len--; - if ((s+1)<end && ZEND_IS_OCT(*(s+1))) { - octal_buf[1] = *(++s); - zendlval->value.str.len--; - if ((s+1)<end && ZEND_IS_OCT(*(s+1))) { - octal_buf[2] = *(++s); - zendlval->value.str.len--; - } - } - *t++ = (char) strtol(octal_buf, NULL, 8); - } else if (*s=='x' && (s+1)<end && ZEND_IS_HEX(*(s+1))) { - char hex_buf[3] = { 0, 0, 0}; - - zendlval->value.str.len--; /* for the 'x' */ - - hex_buf[0] = *(++s); - zendlval->value.str.len--; - if ((s+1)<end && ZEND_IS_HEX(*(s+1))) { - hex_buf[1] = *(++s); - zendlval->value.str.len--; - } - *t++ = (char) strtol(hex_buf, NULL, 16); - } else { - *t++ = '\\'; - *t++ = *s; - } - break; - } - s++; - } else { - *t++ = *s++; - } - } - *t = 0; - - return T_CONSTANT_ENCAPSED_STRING; -} - - -<ST_IN_SCRIPTING>([']([^'\\]|("\\".))*[']) { - register char *s, *t; - char *end; - - zendlval->value.str.val = estrndup(yytext+1, yyleng-2); - zendlval->value.str.len = yyleng-2; - zendlval->type = IS_STRING; - HANDLE_NEWLINES(yytext,yyleng); - - /* convert escape sequences */ - s = t = zendlval->value.str.val; - end = s+zendlval->value.str.len; - while (s<end) { - if (*s=='\\') { - s++; - if (s>=end) { - continue; - } - switch(*s) { - case '\\': - case '\'': - *t++ = *s; - zendlval->value.str.len--; - break; - default: - *t++ = '\\'; - *t++ = *s; - break; - } - s++; - } else { - *t++ = *s++; - } - } - *t = 0; - - return T_CONSTANT_ENCAPSED_STRING; -} - - -<ST_IN_SCRIPTING>["] { - BEGIN(ST_DOUBLE_QUOTES); - return '\"'; -} - - -<ST_IN_SCRIPTING>"<<<"{TABS_AND_SPACES}{LABEL}("\r")?"\n" { - char *s; - CG(zend_lineno)++; - CG(heredoc_len) = yyleng-3-1-(yytext[yyleng-2]=='\r'?1:0); - s = yytext+3; - while ((*s == ' ') || (*s == '\t')) { - s++; - CG(heredoc_len)--; - } - CG(heredoc) = estrndup(s, CG(heredoc_len)); - BEGIN(ST_HEREDOC); - return T_HEREDOC; -} - - -<ST_IN_SCRIPTING>[`] { - BEGIN(ST_BACKQUOTE); - return '`'; -} - - -<ST_IN_SCRIPTING>['] { - BEGIN(ST_SINGLE_QUOTE); - return '\''; -} - - -<ST_HEREDOC>^{LABEL}(";")?("\r")?"\n" { - int label_len; - unsigned char unput_semicolon; - - CG(zend_lineno)++; - if (yytext[yyleng-2]=='\r') { - label_len = yyleng-2; - } else { - label_len = yyleng-1; - } - - if (yytext[label_len-1]==';') { - label_len--; - unput_semicolon=1; - } else{ - unput_semicolon=0; - } - - if (label_len==CG(heredoc_len) && !memcmp(yytext, CG(heredoc), label_len)) { - if (unput_semicolon) { - unput(';'); - } - efree(CG(heredoc)); - CG(heredoc)=NULL; - CG(heredoc_len)=0; - BEGIN(ST_IN_SCRIPTING); - return T_HEREDOC; - } else { - zendlval->value.str.val = (char *)estrndup(yytext, yyleng); - zendlval->value.str.len = yyleng; - zendlval->type = IS_STRING; - return T_STRING; - } -} - - -<ST_DOUBLE_QUOTES,ST_BACKQUOTE,ST_HEREDOC>{ESCAPED_AND_WHITESPACE} { - HANDLE_NEWLINES(yytext,yyleng); - zendlval->value.str.val = (char *) estrndup(yytext, yyleng); - zendlval->value.str.len = yyleng; - zendlval->type = IS_STRING; - return T_ENCAPSED_AND_WHITESPACE; -} - -<ST_SINGLE_QUOTE>([^'\\]|\\[^'\\])+ { - HANDLE_NEWLINES(yytext,yyleng); - zendlval->value.str.val = (char *) estrndup(yytext, yyleng); - zendlval->value.str.len = yyleng; - zendlval->type = IS_STRING; - return T_ENCAPSED_AND_WHITESPACE; -} - - -<ST_DOUBLE_QUOTES>[`]+ { - zendlval->value.str.val = (char *) estrndup(yytext, yyleng); - zendlval->value.str.len = yyleng; - zendlval->type = IS_STRING; - return T_ENCAPSED_AND_WHITESPACE; -} - - -<ST_BACKQUOTE>["]+ { - zendlval->value.str.val = (char *) estrndup(yytext, yyleng); - zendlval->value.str.len = yyleng; - zendlval->type = IS_STRING; - return T_ENCAPSED_AND_WHITESPACE; -} - - -<ST_DOUBLE_QUOTES,ST_BACKQUOTE,ST_HEREDOC>"$"[^a-zA-Z_\x7f-\xff{] { - zendlval->value.chval = yytext[0]; - if (yyleng == 2) { - yyless(1); - /*unput(yytext[1]); - yytext[1] = 0; - yyleng--;*/ - } - return T_CHARACTER; -} - - -<ST_DOUBLE_QUOTES,ST_BACKQUOTE,ST_HEREDOC>{ENCAPSED_TOKENS} { - zendlval->value.chval = yytext[0]; - return yytext[0]; -} - -<ST_DOUBLE_QUOTES,ST_BACKQUOTE,ST_HEREDOC>"{$" { - zendlval->value.chval = yytext[0]; - yy_push_state(ST_IN_SCRIPTING); - /*unput('$');*/ - yyless(1); - return T_CURLY_OPEN; -} - - -<ST_SINGLE_QUOTE>"\\'" { - zendlval->value.chval='\''; - return T_CHARACTER; -} - -<ST_SINGLE_QUOTE>"\\\\" { - zendlval->value.chval='\\'; - return T_CHARACTER; -} - -<ST_DOUBLE_QUOTES>"\\\"" { - zendlval->value.chval='"'; - return T_CHARACTER; -} - -<ST_BACKQUOTE>"\\`" { - zendlval->value.chval='`'; - return T_CHARACTER; -} - -<ST_DOUBLE_QUOTES,ST_BACKQUOTE,ST_HEREDOC>"\\"[0-7]{1,3} { - zendlval->value.chval = (char) strtol (yytext+1, NULL, 8); - return T_CHARACTER; -} - -<ST_DOUBLE_QUOTES,ST_BACKQUOTE,ST_HEREDOC>"\\x"[0-9A-Fa-f]{1,2} { - zendlval->value.chval = (char) strtol (yytext+2, NULL, 16); - return T_CHARACTER; -} - -<ST_DOUBLE_QUOTES,ST_BACKQUOTE>"\\". { - switch (yytext[1]) { - case 'n': - zendlval->value.chval='\n'; - break; - case 't': - zendlval->value.chval='\t'; - break; - case 'r': - zendlval->value.chval='\r'; - break; - case '\\': - zendlval->value.chval='\\'; - break; - case '$': - zendlval->value.chval=yytext[1]; - break; - case '{': - zendlval->value.chval=yytext[1]; - break; - default: - zendlval->value.str.val = estrndup(yytext,yyleng); - zendlval->value.str.len = yyleng; - zendlval->type = IS_STRING; - return T_BAD_CHARACTER; - break; - } - return T_CHARACTER; -} - - -<ST_HEREDOC>"\\$"|"\\{" { - zendlval->value.chval = yytext[1]; - return T_CHARACTER; -} - - -<ST_HEREDOC>["'`]+ { - zendlval->value.str.val = (char *) estrndup(yytext, yyleng); - zendlval->value.str.len = yyleng; - zendlval->type = IS_STRING; - return T_ENCAPSED_AND_WHITESPACE; -} - - -<ST_DOUBLE_QUOTES>["] { - BEGIN(ST_IN_SCRIPTING); - return '\"'; -} - - -<ST_BACKQUOTE>[`] { - BEGIN(ST_IN_SCRIPTING); - return '`'; -} - - -<ST_SINGLE_QUOTE>['] { - BEGIN(ST_IN_SCRIPTING); - return '\''; -} - - -<ST_DOUBLE_QUOTES,ST_BACKQUOTE,INITIAL,ST_IN_SCRIPTING,ST_LOOKING_FOR_PROPERTY><<EOF>> { - return 0; -} - - -<ST_IN_SCRIPTING,INITIAL,ST_DOUBLE_QUOTES,ST_BACKQUOTE,ST_SINGLE_QUOTE>. { - zend_error(E_COMPILE_WARNING,"Unexpected character in input: '%c' (ASCII=%d) state=%d",yytext[0],yytext[0],YYSTATE); -} diff --git a/Zend/zend.c b/Zend/zend.c deleted file mode 100644 index 7a89470916..0000000000 --- a/Zend/zend.c +++ /dev/null @@ -1,440 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | Zend Engine | - +----------------------------------------------------------------------+ - | Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski | - +----------------------------------------------------------------------+ - | This source file is subject to version 0.91 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at | - | http://www.zend.com/license/0_91.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Andi Gutmans <andi@zend.com> | - | Zeev Suraski <zeev@zend.com> | - +----------------------------------------------------------------------+ -*/ - - -#include "zend.h" -#include "zend_operators.h" -#include "zend_variables.h" -#include "zend_extensions.h" -#include "modules.h" -#include "zend_constants.h" -#include "zend_list.h" -#include "zend_API.h" -#include "zend_builtin_functions.h" - -#ifdef ZTS -# define GLOBAL_FUNCTION_TABLE global_function_table -# define GLOBAL_CLASS_TABLE global_class_table -# define GLOBAL_CONSTANTS_TABLE global_constants_table -#else -# define GLOBAL_FUNCTION_TABLE CG(function_table) -# define GLOBAL_CLASS_TABLE CG(class_table) -# define GLOBAL_CONSTANTS_TABLE CG(zend_constants) -#endif - -/* true multithread-shared globals */ -ZEND_API zend_class_entry zend_standard_class_def; -ZEND_API int (*zend_printf)(const char *format, ...); -ZEND_API int (*zend_write)(const char *str, uint str_length); -ZEND_API void (*zend_error)(int type, const char *format, ...); -ZEND_API void (*zend_message_dispatcher)(long message, void *data); -ZEND_API FILE *(*zend_fopen)(const char *filename); -ZEND_API void (*zend_block_interruptions)(); -ZEND_API void (*zend_unblock_interruptions)(); -ZEND_API int (*zend_get_ini_entry)(char *name, uint name_length, zval *contents); - -#ifdef ZTS -ZEND_API int compiler_globals_id; -ZEND_API int executor_globals_id; -int alloc_globals_id; -HashTable *global_function_table; -HashTable *global_class_table; -HashTable *global_constants_table; -#endif - -zend_utility_values zend_uv; - -/* version information */ -static char *zend_version_info; -static uint zend_version_info_length; -#define ZEND_CORE_VERSION_INFO "Zend Engine v" ZEND_VERSION ", Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski\n" - - -#define PRINT_PVAL_INDENT 4 - -static void print_hash(HashTable *ht, int indent) -{ - zval **tmp; - char *string_key; - unsigned long num_key; - int i; - - for (i=0; i<indent; i++) { - ZEND_PUTS(" "); - } - ZEND_PUTS("(\n"); - indent += PRINT_PVAL_INDENT; - zend_hash_internal_pointer_reset(ht); - while (zend_hash_get_current_data(ht, (void **) &tmp) == SUCCESS) { - for (i=0; i<indent; i++) { - ZEND_PUTS(" "); - } - ZEND_PUTS("["); - switch (zend_hash_get_current_key(ht, &string_key, &num_key)) { - case HASH_KEY_IS_STRING: - ZEND_PUTS(string_key); - efree(string_key); - break; - case HASH_KEY_IS_LONG: - zend_printf("%ld",num_key); - break; - } - ZEND_PUTS("] => "); - zend_print_zval_r(*tmp, indent+PRINT_PVAL_INDENT); - ZEND_PUTS("\n"); - zend_hash_move_forward(ht); - } - indent -= PRINT_PVAL_INDENT; - for (i=0; i<indent; i++) { - ZEND_PUTS(" "); - } - ZEND_PUTS(")\n"); -} - - -ZEND_API void zend_make_printable_zval(zval *expr, zval *expr_copy, int *use_copy) -{ - if (expr->type==IS_STRING) { - *use_copy = 0; - return; - } - switch (expr->type) { - case IS_BOOL: -#if 1 - if (expr->value.lval) { - expr_copy->value.str.len = 1; - expr_copy->value.str.val = estrndup("1", 1); - } else { - expr_copy->value.str.len = 0; - expr_copy->value.str.val = empty_string; - } -#else - if (expr->value.lval) { - expr_copy->value.str.len = sizeof("true")-1; - expr_copy->value.str.val = estrndup("true", expr_copy->value.str.len); - } else { - expr_copy->value.str.len = sizeof("false")-1; - expr_copy->value.str.val = estrndup("false", expr_copy->value.str.len); - } -#endif - break; - case IS_RESOURCE: - expr_copy->value.str.val = (char *) emalloc(sizeof("Resource id #")-1 + MAX_LENGTH_OF_LONG); - expr_copy->value.str.len = sprintf(expr_copy->value.str.val, "Resource id #%ld", expr->value.lval); - break; - case IS_ARRAY: - expr_copy->value.str.len = sizeof("Array")-1; - expr_copy->value.str.val = estrndup("Array", expr_copy->value.str.len); - break; - case IS_OBJECT: { - zval function_name; - - function_name.value.str.len = sizeof("to_string")-1; - function_name.value.str.val = estrndup("to_string", function_name.value.str.len); - function_name.type = IS_STRING; - - if (call_user_function(NULL, expr, &function_name, expr_copy, 0, NULL)==FAILURE) { - expr_copy->value.str.len = sizeof("Object")-1; - expr_copy->value.str.val = estrndup("Object", expr_copy->value.str.len); - } - efree(function_name.value.str.val); - } - break; - default: - *expr_copy = *expr; - zval_copy_ctor(expr_copy); - convert_to_string(expr_copy); - break; - } - expr_copy->type = IS_STRING; - *use_copy = 1; -} - - -ZEND_API int zend_print_zval(zval *expr, int indent) -{ - zval expr_copy; - int use_copy; - - zend_make_printable_zval(expr, &expr_copy, &use_copy); - if (use_copy) { - expr = &expr_copy; - } - if (expr->value.str.len==0) { /* optimize away empty strings */ - if (use_copy) { - zval_dtor(expr); - } - return 0; - } - ZEND_WRITE(expr->value.str.val,expr->value.str.len); - if (use_copy) { - zval_dtor(expr); - } - return expr->value.str.len; -} - - -ZEND_API void zend_print_zval_r(zval *expr, int indent) -{ - switch(expr->type) { - case IS_ARRAY: - ZEND_PUTS("Array\n"); - print_hash(expr->value.ht,indent); - break; - case IS_OBJECT: - zend_printf("%s Object\n", expr->value.obj.ce->name); - print_hash(expr->value.obj.properties, indent); - break; - default: - zend_print_variable(expr); - break; - } -} - - -static FILE *zend_fopen_wrapper(const char *filename) -{ - return fopen(filename, "r"); -} - - -static void register_standard_class() -{ - zend_standard_class_def.type = ZEND_INTERNAL_CLASS; - zend_standard_class_def.name_length = sizeof("stdClass") - 1; - zend_standard_class_def.name = zend_strndup("stdClass", zend_standard_class_def.name_length); - zend_standard_class_def.parent = NULL; - zend_hash_init(&zend_standard_class_def.default_properties, 0, NULL, PVAL_PTR_DTOR, 1); - zend_hash_init(&zend_standard_class_def.function_table, 0, NULL, ZEND_FUNCTION_DTOR, 1); - zend_standard_class_def.handle_function_call = NULL; - zend_standard_class_def.handle_property_get = NULL; - zend_standard_class_def.handle_property_set = NULL; - zend_standard_class_def.refcount = (int *) malloc(sizeof(int)); - *zend_standard_class_def.refcount = 1; - zend_hash_add(GLOBAL_CLASS_TABLE, "stdclass", sizeof("stdclass"), &zend_standard_class_def, sizeof(zend_class_entry), NULL); -} - - -#ifdef ZTS -static void compiler_globals_ctor(zend_compiler_globals *compiler_globals) -{ - zend_function tmp_func; - zend_class_entry tmp_class; - - compiler_globals->function_table = (HashTable *) malloc(sizeof(HashTable)); - zend_hash_init(compiler_globals->function_table, 100, NULL, ZEND_FUNCTION_DTOR, 1); - zend_hash_copy(compiler_globals->function_table, global_function_table, NULL, &tmp_func, sizeof(zend_function)); - - compiler_globals->class_table = (HashTable *) malloc(sizeof(HashTable)); - zend_hash_init(compiler_globals->class_table, 10, NULL, ZEND_CLASS_DTOR, 1); - zend_hash_copy(compiler_globals->class_table, global_class_table, zend_class_add_ref, &tmp_class, sizeof(zend_class_entry)); -} - - -static void compiler_globals_dtor(zend_compiler_globals *compiler_globals) -{ - if (compiler_globals->function_table != global_function_table) { - zend_hash_destroy(compiler_globals->function_table); - free(compiler_globals->function_table); - } - if (compiler_globals->class_table != global_class_table) { - zend_hash_destroy(compiler_globals->class_table); - free(compiler_globals->class_table); - } -} - - -static void executor_globals_ctor(zend_executor_globals *executor_globals) -{ - if (global_constants_table) { - zend_startup_constants(ELS_C); - zend_copy_constants(executor_globals->zend_constants, global_constants_table); - } - init_resource_plist(ELS_C); -} - - -static void executor_globals_dtor(zend_executor_globals *executor_globals) -{ - zend_shutdown_constants(ELS_C); - destroy_resource_plist(); -} - - -static void alloc_globals_ctor(zend_alloc_globals *alloc_globals) -{ - start_memory_manager(ALS_C); -} - -#endif - - -int zend_startup(zend_utility_functions *utility_functions, char **extensions) -{ -#ifdef ZTS - zend_compiler_globals *compiler_globals; - zend_executor_globals *executor_globals; - - alloc_globals_id = ts_allocate_id(sizeof(zend_alloc_globals), alloc_globals_ctor, NULL); -#else - start_memory_manager(ALS_C); -#endif - - /* Set up utility functions and values */ - zend_error = utility_functions->error_function; - zend_printf = utility_functions->printf_function; - zend_write = utility_functions->write_function; - zend_fopen = utility_functions->fopen_function; - if (!zend_fopen) { - zend_fopen = zend_fopen_wrapper; - } - zend_message_dispatcher = utility_functions->message_handler; - zend_block_interruptions = utility_functions->block_interruptions; - zend_unblock_interruptions = utility_functions->unblock_interruptions; - zend_get_ini_entry = utility_functions->get_ini_entry; - - zend_compile_files = compile_files; - zend_execute = execute; - - zend_llist_init(&zend_extensions, sizeof(zend_extension), (void (*)(void *)) zend_extension_dtor, 1); - - /* set up version */ - zend_version_info = strdup(ZEND_CORE_VERSION_INFO); - zend_version_info_length = sizeof(ZEND_CORE_VERSION_INFO)-1; - - GLOBAL_FUNCTION_TABLE = (HashTable *) malloc(sizeof(HashTable)); - GLOBAL_CLASS_TABLE = (HashTable *) malloc(sizeof(HashTable)); - zend_hash_init(GLOBAL_FUNCTION_TABLE, 100, NULL, ZEND_FUNCTION_DTOR, 1); - zend_hash_init(GLOBAL_CLASS_TABLE, 10, NULL, ZEND_CLASS_DTOR, 1); - register_standard_class(); - zend_hash_init(&module_registry, 50, NULL, ZEND_MODULE_DTOR, 1); - zend_hash_init(&list_destructors, 50, NULL, NULL, 1); - -#ifdef ZTS - global_constants_table = NULL; - compiler_globals_id = ts_allocate_id(sizeof(zend_compiler_globals), (void (*)(void *)) compiler_globals_ctor, (void (*)(void *)) compiler_globals_dtor); - executor_globals_id = ts_allocate_id(sizeof(zend_executor_globals), (void (*)(void *)) executor_globals_ctor, (void (*)(void *)) executor_globals_dtor); - compiler_globals = ts_resource(compiler_globals_id); - executor_globals = ts_resource(executor_globals_id); - compiler_globals_dtor(compiler_globals); - compiler_globals->function_table = GLOBAL_FUNCTION_TABLE; - compiler_globals->class_table = GLOBAL_CLASS_TABLE; - zend_startup_constants(executor_globals); - GLOBAL_CONSTANTS_TABLE = EG(zend_constants); -#else - zend_startup_constants(); -#endif - zend_register_standard_constants(ELS_C); - -#ifndef ZTS - init_resource_plist(ELS_C); -#endif - - zend_startup_builtin_functions(); - - return SUCCESS; -} - - -void zend_shutdown() -{ -#ifndef ZTS - destroy_resource_plist(); -#endif - zend_hash_destroy(&list_destructors); - zend_hash_destroy(&module_registry); - zend_hash_destroy(GLOBAL_FUNCTION_TABLE); - free(GLOBAL_FUNCTION_TABLE); - zend_hash_destroy(GLOBAL_CLASS_TABLE); - free(GLOBAL_CLASS_TABLE); - zend_shutdown_extensions(); - free(zend_version_info); -#ifndef ZTS - zend_shutdown_constants(ELS_C); -#endif -} - - -void zend_set_utility_values(zend_utility_values *utility_values) -{ - zend_uv = *utility_values; -} - - -/* this should be compatible with the standard zenderror */ -void zenderror(char *error) -{ - zend_error(E_PARSE, error); -} - - -BEGIN_EXTERN_C() -ZEND_API void zend_bailout() -{ - CLS_FETCH(); - ELS_FETCH(); - - CG(unclean_shutdown) = 1; - longjmp(EG(bailout), FAILURE); -} -END_EXTERN_C() - - -void zend_append_version_info(zend_extension *extension) -{ - char *new_info; - uint new_info_length; - - new_info_length = sizeof(" with v, by \n") - + strlen(extension->name) - + strlen(extension->version) - + strlen(extension->copyright) - + strlen(extension->author); - - new_info = (char *) malloc(new_info_length+1); - - sprintf(new_info, " with %s v%s, %s, by %s\n", extension->name, extension->version, extension->copyright, extension->author); - - zend_version_info = (char *) realloc(zend_version_info, zend_version_info_length+new_info_length+1); - strcat(zend_version_info, new_info); - zend_version_info_length += new_info_length; - free(new_info); -} - - -ZEND_API char *get_zend_version() -{ - return zend_version_info; -} - - -void zend_activate(CLS_D ELS_DC) -{ - init_compiler(CLS_C ELS_CC); - init_executor(CLS_C ELS_CC); - startup_scanner(CLS_C); -} - -void zend_deactivate(CLS_D ELS_DC) -{ - zend_hash_apply(&module_registry, (int (*)(void *)) module_registry_cleanup); - shutdown_scanner(CLS_C); - shutdown_executor(ELS_C); - shutdown_compiler(CLS_C); -} diff --git a/Zend/zend.h b/Zend/zend.h deleted file mode 100644 index 5e29d56977..0000000000 --- a/Zend/zend.h +++ /dev/null @@ -1,302 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | Zend Engine | - +----------------------------------------------------------------------+ - | Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski | - +----------------------------------------------------------------------+ - | This source file is subject to version 0.91 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at | - | http://www.zend.com/license/0_91.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Andi Gutmans <andi@zend.com> | - | Zeev Suraski <zeev@zend.com> | - +----------------------------------------------------------------------+ -*/ - - -#ifndef _ZEND_H -#define _ZEND_H - -#define ZEND_VERSION "0.90" - -#ifdef __cplusplus -#define BEGIN_EXTERN_C() extern "C" { -#define END_EXTERN_C() } -#else -#define BEGIN_EXTERN_C() -#define END_EXTERN_C() -#endif - -#include <stdio.h> - -/* - * general definitions - */ - -#if (defined(WINNT) && WINNT) || (defined(WIN32) && WIN32) -# include "zend_config.w32.h" -#else -# include "zend_config.h" -#endif - -/* all HAVE_XXX test have to be after the include of zend_config above */ - -#ifdef HAVE_UNIX_H -# include <unix.h> -#endif - -#ifdef HAVE_STDARG_H -# include <stdarg.h> -#endif - -#if ZEND_DEBUG -#define ZEND_FILE_LINE_D char *__zend_filename, uint __zend_lineno -#define ZEND_FILE_LINE_DC , ZEND_FILE_LINE_D -#define ZEND_FILE_LINE_ORIG_D char *__zend_orig_filename, uint __zend_orig_lineno -#define ZEND_FILE_LINE_ORIG_DC , ZEND_FILE_LINE_ORIG_D -#define ZEND_FILE_LINE_RELAY_C __zend_filename, __zend_lineno -#define ZEND_FILE_LINE_RELAY_CC , ZEND_FILE_LINE_RELAY_C -#define ZEND_FILE_LINE_C __FILE__, __LINE__ -#define ZEND_FILE_LINE_CC , ZEND_FILE_LINE_C -#define ZEND_FILE_LINE_EMPTY_C NULL, 0 -#define ZEND_FILE_LINE_EMPTY_CC , ZEND_FILE_LINE_EMPTY_C -#define ZEND_FILE_LINE_ORIG_RELAY_C __zend_orig_filename, __zend_orig_lineno -#define ZEND_FILE_LINE_ORIG_RELAY_CC , ZEND_FILE_LINE_ORIG_RELAY_C -#else -#define ZEND_FILE_LINE_D -#define ZEND_FILE_LINE_DC -#define ZEND_FILE_LINE_ORIG_D -#define ZEND_FILE_LINE_ORIG_DC -#define ZEND_FILE_LINE_RELAY_C -#define ZEND_FILE_LINE_RELAY_CC -#define ZEND_FILE_LINE_C -#define ZEND_FILE_LINE_CC -#define ZEND_FILE_LINE_EMPTY_C -#define ZEND_FILE_LINE_EMPTY_CC -#define ZEND_FILE_LINE_ORIG_RELAY_C -#define ZEND_FILE_LINE_ORIG_RELAY_CC -#endif /* ZEND_DEBUG */ - - -#include "zend_errors.h" -#include "zend_alloc.h" - -typedef unsigned char zend_bool; - -#undef SUCCESS -#undef FAILURE -#define SUCCESS 0 -#define FAILURE -1 /* this MUST stay a negative number, or it may affect functions! */ - - -#include "zend_hash.h" -#include "zend_llist.h" - -#define INTERNAL_FUNCTION_PARAMETERS int ht, zval *return_value, HashTable *list, HashTable *plist, zval *this_ptr -#define INTERNAL_FUNCTION_PARAM_PASSTHRU ht, return_value, list, plist, this_ptr - -/* - * zval - */ -typedef struct _zval_struct zval; -typedef struct _zend_class_entry zend_class_entry; - -typedef union _zvalue_value { - long lval; /* long value */ - double dval; /* double value */ - struct { - char *val; - int len; - } str; - char chval; /* char value */ - HashTable *ht; /* hash table value */ - struct { - zend_class_entry *ce; - HashTable *properties; - } obj; -} zvalue_value; - - -struct _zval_struct { - /* Variable information */ - zvalue_value value; /* value */ - unsigned char type; /* active type */ - struct { - unsigned int locks:7; - unsigned int is_ref:1; - } EA; - short refcount; -}; - - - -typedef struct _zend_function_entry { - char *fname; - void (*handler)(INTERNAL_FUNCTION_PARAMETERS); - unsigned char *func_arg_types; -} zend_function_entry; - - -typedef struct _zend_property_reference { - int type; /* read, write or r/w */ - zval *object; - zend_llist elements_list; -} zend_property_reference; - - - -typedef struct _zend_overloaded_element { - int type; /* array offset or object proprety */ - zval element; -} zend_overloaded_element; - - -struct _zend_class_entry { - char type; - char *name; - uint name_length; - struct _zend_class_entry *parent; - int *refcount; - - HashTable function_table; - HashTable default_properties; - zend_function_entry *builtin_functions; - - /* handlers */ - void (*handle_function_call)(INTERNAL_FUNCTION_PARAMETERS, zend_property_reference *property_reference); - zval (*handle_property_get)(zend_property_reference *property_reference); - int (*handle_property_set)(zend_property_reference *property_reference, zval *value); -}; - - - -typedef struct _zend_utility_functions { - void (*error_function)(int type, const char *format, ...); - int (*printf_function)(const char *format, ...); - int (*write_function)(const char *str, uint str_length); - FILE *(*fopen_function)(const char *filename); - void (*message_handler)(long message, void *data); - void (*block_interruptions)(); - void (*unblock_interruptions)(); - int (*get_ini_entry)(char *name, uint name_length, zval *contents); -} zend_utility_functions; - - -typedef struct _zend_utility_values { - unsigned char short_tags; - unsigned char asp_tags; -} zend_utility_values; - - -#undef MIN -#undef MAX -#define MAX(a,b) (((a)>(b))?(a):(b)) -#define MIN(a,b) (((a)<(b))?(a):(b)) - -/* data types */ -#define IS_LONG 1 -#define IS_DOUBLE 2 -#define IS_STRING 3 -#define IS_ARRAY 4 -#define IS_OBJECT 5 -#define IS_BC 6 /* for parser internal use only */ -#define IS_BOOL 7 -#define IS_RESOURCE 8 -#define IS_CONSTANT 9 -#define IS_METHOD 10 /* for overloaded function calls */ - -int zend_startup(zend_utility_functions *utility_functions, char **extensions); -void zend_shutdown(); - -void zend_set_utility_values(zend_utility_values *utility_values); -BEGIN_EXTERN_C() -ZEND_API void zend_bailout(); -END_EXTERN_C() -ZEND_API char *get_zend_version(); - -ZEND_API void zend_make_printable_zval(zval *expr, zval *expr_copy, int *use_copy); -ZEND_API int zend_print_zval(zval *expr, int indent); -ZEND_API void zend_print_zval_r(zval *expr, int indent); - -ZEND_API extern char *empty_string; -ZEND_API extern char *undefined_variable_string; - -#define STR_FREE(ptr) if (ptr && ptr!=empty_string && ptr!=undefined_variable_string) { efree(ptr); } -#define STR_FREE_REL(ptr) if (ptr && ptr!=empty_string && ptr!=undefined_variable_string) { efree_rel(ptr); } - -/* output support */ -#define ZEND_WRITE(str, str_len) zend_write((str), (str_len)) -#define ZEND_PUTS(str) zend_write((str), strlen((str))) -#define ZEND_PUTC(c) zend_write(&(c), 1), (c) - -BEGIN_EXTERN_C() -extern ZEND_API int (*zend_printf)(const char *format, ...); -extern ZEND_API int (*zend_write)(const char *str, uint str_length); -extern ZEND_API void (*zend_error)(int type, const char *format, ...); -extern ZEND_API FILE *(*zend_fopen)(const char *filename); -extern ZEND_API void (*zend_block_interruptions)(); -extern ZEND_API void (*zend_unblock_interruptions)(); -extern ZEND_API void (*zend_message_dispatcher)(long message, void *data); -extern ZEND_API int (*zend_get_ini_entry)(char *name, uint name_length, zval *contents); -END_EXTERN_C() - - -void zenderror(char *error); - -extern ZEND_API zend_class_entry zend_standard_class_def; -extern zend_utility_values zend_uv; - -#define ZEND_UV(name) (zend_uv.name) - - -#define HANDLE_BLOCK_INTERRUPTIONS() if (zend_block_interruptions) { zend_block_interruptions(); } -#define HANDLE_UNBLOCK_INTERRUPTIONS() if (zend_unblock_interruptions) { zend_unblock_interruptions(); } - - -/* Messages for applications of Zend */ -#define ZMSG_ENABLE_TRACK_VARS 1L -#define ZMSG_FAILED_INCLUDE_FOPEN 2L -#define ZMSG_FAILED_REQUIRE_FOPEN 3L -#define ZMSG_FAILED_HIGHLIGHT_FOPEN 4L -#define ZMSG_MEMORY_LEAK_DETECTED 5L -#define ZMSG_MEMORY_LEAK_REPEATED 6L -#define ZMSG_LOG_SCRIPT_NAME 7L - -#define INIT_PZVAL(z) \ - (z)->refcount = 1; \ - (z)->EA.is_ref = 0; \ - (z)->EA.locks = 0; - -#define MAKE_STD_ZVAL(zv) \ - zv = (zval *) emalloc(sizeof(zval)); \ - INIT_PZVAL(zv); - -#define SEPARATE_ZVAL(ppzv) \ - { \ - zval *orig_ptr = *(ppzv); \ - \ - if (orig_ptr->refcount>1) { \ - orig_ptr->refcount--; \ - *(ppzv) = (zval *) emalloc(sizeof(zval)); \ - **(ppzv) = *orig_ptr; \ - zval_copy_ctor(*(ppzv)); \ - (*(ppzv))->refcount=1; \ - (*(ppzv))->EA.is_ref = 0; \ - (*(ppzv))->EA.locks = 0; \ - } \ - } - -#define ZEND_MAX_RESERVED_RESOURCES 1 - -#endif /* _ZEND_H */ - -/* - * Local variables: - * tab-width: 4 - * c-basic-offset: 4 - * End: - */ diff --git a/Zend/zend.ico b/Zend/zend.ico Binary files differdeleted file mode 100644 index 80978a6c7e..0000000000 --- a/Zend/zend.ico +++ /dev/null diff --git a/Zend/zend_API.c b/Zend/zend_API.c deleted file mode 100644 index 23db2b88f1..0000000000 --- a/Zend/zend_API.c +++ /dev/null @@ -1,771 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | Zend Engine | - +----------------------------------------------------------------------+ - | Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski | - +----------------------------------------------------------------------+ - | This source file is subject to version 0.91 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at | - | http://www.zend.com/license/0_91.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Andi Gutmans <andi@zend.com> | - | Zeev Suraski <zeev@zend.com> | - +----------------------------------------------------------------------+ -*/ - - -#include "zend.h" -#include "zend_variables.h" -#include "zend_execute.h" -#include "zend_API.h" -#include "modules.h" -#include "zend_constants.h" -#include "zend_operators.h" - -#ifdef HAVE_STDARG_H -# include <stdarg.h> -#endif - -/* these variables are true statics/globals, and have to be mutex'ed on every access */ -static int module_count=0; -HashTable list_destructors, module_registry; - -/* this function doesn't check for too many parameters */ -ZEND_API int getParameters(int ht, int param_count,...) -{ - void **p; - int arg_count; - va_list ptr; - zval **param, *param_ptr; - ELS_FETCH(); - ALS_FETCH(); - - p = EG(argument_stack).top_element-1; - arg_count = (ulong) *p; - - if (param_count>arg_count) { - return FAILURE; - } - - va_start(ptr, param_count); - - while (param_count>0) { - param = va_arg(ptr, zval **); - param_ptr = *(p-param_count); - if (!PZVAL_IS_REF(param_ptr) && param_ptr->refcount>1) { - zval *new_tmp; - - new_tmp = (zval *) emalloc(sizeof(zval)); - *new_tmp = *param_ptr; - zval_copy_ctor(new_tmp); - INIT_PZVAL(new_tmp); - param_ptr = new_tmp; - ((zval *) *(p-param_count))->refcount--; - *(p-param_count) = param_ptr; - } - *param = param_ptr; - param_count--; - } - va_end(ptr); - - return SUCCESS; -} - - -ZEND_API int getParametersArray(int ht, int param_count, zval **argument_array) -{ - void **p; - int arg_count; - zval *param_ptr; - ELS_FETCH(); - - p = EG(argument_stack).top_element-1; - arg_count = (ulong) *p; - - if (param_count>arg_count) { - return FAILURE; - } - - - while (param_count>0) { - param_ptr = *(p-param_count); - if (!PZVAL_IS_REF(param_ptr) && param_ptr->refcount>1) { - zval *new_tmp; - - new_tmp = (zval *) emalloc(sizeof(zval)); - *new_tmp = *param_ptr; - zval_copy_ctor(new_tmp); - INIT_PZVAL(new_tmp); - param_ptr = new_tmp; - ((zval *) *(p-param_count))->refcount--; - *(p-param_count) = param_ptr; - } - *(argument_array++) = param_ptr; - param_count--; - } - - return SUCCESS; -} - - - - -/* Zend-optimized Extended functions */ -/* this function doesn't check for too many parameters */ -ZEND_API int getParametersEx(int param_count,...) -{ - void **p; - int arg_count; - va_list ptr; - zval ***param; - ELS_FETCH(); - - p = EG(argument_stack).top_element-1; - arg_count = (ulong) *p; - - if (param_count>arg_count) { - return FAILURE; - } - - va_start(ptr, param_count); - while (param_count>0) { - param = va_arg(ptr, zval ***); - *param = (zval **) p-(param_count--); - } - va_end(ptr); - - return SUCCESS; -} - - -ZEND_API int getParametersArrayEx(int param_count, zval ***argument_array) -{ - void **p; - int arg_count; - ELS_FETCH(); - - p = EG(argument_stack).top_element-1; - arg_count = (ulong) *p; - - if (param_count>arg_count) { - return FAILURE; - } - - while (param_count>0) { - *(argument_array++) = (zval **) p-(param_count--); - } - - return SUCCESS; -} - - -ZEND_API int ParameterPassedByReference(int ht, uint n) -{ - void **p; - ulong arg_count; - zval *arg; - ELS_FETCH(); - - p = EG(argument_stack).elements+EG(argument_stack).top-1; - arg_count = (ulong) *p; - - if (n>arg_count) { - return FAILURE; - } - arg = (zval *) *(p-arg_count+n-1); - return PZVAL_IS_REF(arg); -} - - -ZEND_API void wrong_param_count() -{ - zend_error(E_WARNING,"Wrong parameter count for %s()",get_active_function_name()); -} - - -ZEND_API inline int array_init(zval *arg) -{ - arg->value.ht = (HashTable *) emalloc(sizeof(HashTable)); - if (!arg->value.ht || zend_hash_init(arg->value.ht, 0, NULL, PVAL_PTR_DTOR, 0)) { - zend_error(E_CORE_ERROR, "Cannot allocate memory for array"); - return FAILURE; - } - arg->type = IS_ARRAY; - return SUCCESS; -} - - -static void zval_update_const_and_ref(zval **p) -{ - zval_update_constant(*p); - zval_add_ref(p); -} - - - -ZEND_API inline int object_init_ex(zval *arg, zend_class_entry *class_type) -{ - zval *tmp; - - arg->value.obj.properties = (HashTable *) emalloc(sizeof(HashTable)); - zend_hash_init(arg->value.obj.properties, 0, NULL, PVAL_PTR_DTOR, 0); - zend_hash_copy(arg->value.obj.properties, &class_type->default_properties, (void (*)(void *)) zval_update_const_and_ref, (void *) &tmp, sizeof(zval *)); - arg->type = IS_OBJECT; - arg->value.obj.ce = class_type; - return SUCCESS; -} - - -ZEND_API inline int object_init(zval *arg) -{ - return object_init_ex(arg, &zend_standard_class_def); -} - - -ZEND_API inline int add_assoc_long(zval *arg, char *key, long n) -{ - zval *tmp = (zval *) emalloc(sizeof(zval)); - - tmp->type = IS_LONG; - tmp->value.lval = n; - INIT_PZVAL(tmp); - return zend_hash_update(arg->value.ht, key, strlen(key)+1, (void *) &tmp, sizeof(zval *), NULL); -} - - -ZEND_API inline int add_assoc_double(zval *arg, char *key, double d) -{ - zval *tmp = (zval *) emalloc(sizeof(zval)); - - tmp->type = IS_DOUBLE; - tmp->value.dval = d; - INIT_PZVAL(tmp); - return zend_hash_update(arg->value.ht, key, strlen(key)+1, (void *) &tmp, sizeof(zval *), NULL); -} - - -ZEND_API inline int add_assoc_string(zval *arg, char *key, char *str, int duplicate) -{ - zval *tmp = (zval *) emalloc(sizeof(zval)); - - tmp->type = IS_STRING; - tmp->value.str.len = strlen(str); - if (duplicate) { - tmp->value.str.val = estrndup(str,tmp->value.str.len); - } else { - tmp->value.str.val = str; - } - INIT_PZVAL(tmp); - return zend_hash_update(arg->value.ht, key, strlen(key)+1, (void *) &tmp, sizeof(zval *), NULL); -} - - -ZEND_API inline int add_assoc_stringl(zval *arg, char *key, char *str, uint length, int duplicate) -{ - zval *tmp = (zval *) emalloc(sizeof(zval)); - - tmp->type = IS_STRING; - tmp->value.str.len = length; - if (duplicate) { - tmp->value.str.val = estrndup(str,tmp->value.str.len); - } else { - tmp->value.str.val = str; - } - INIT_PZVAL(tmp); - return zend_hash_update(arg->value.ht, key, strlen(key)+1, (void *) &tmp, sizeof(zval *), NULL); -} - - -ZEND_API inline int add_assoc_function(zval *arg, char *key,void (*function_ptr)(INTERNAL_FUNCTION_PARAMETERS)) -{ - zend_error(E_WARNING, "add_assoc_function() is no longer supported"); - return FAILURE; -} - - -ZEND_API inline int add_index_long(zval *arg, uint index, long n) -{ - zval *tmp = (zval *) emalloc(sizeof(zval)); - - tmp->type = IS_LONG; - tmp->value.lval = n; - INIT_PZVAL(tmp); - return zend_hash_index_update(arg->value.ht, index, (void *) &tmp, sizeof(zval *),NULL); -} - - -ZEND_API inline int add_index_double(zval *arg, uint index, double d) -{ - zval *tmp = (zval *) emalloc(sizeof(zval)); - - tmp->type = IS_DOUBLE; - tmp->value.dval = d; - INIT_PZVAL(tmp); - return zend_hash_index_update(arg->value.ht, index, (void *) &tmp, sizeof(zval *),NULL); -} - - -ZEND_API inline int add_index_string(zval *arg, uint index, char *str, int duplicate) -{ - zval *tmp = (zval *) emalloc(sizeof(zval)); - - tmp->type = IS_STRING; - tmp->value.str.len = strlen(str); - if (duplicate) { - tmp->value.str.val = estrndup(str,tmp->value.str.len); - } else { - tmp->value.str.val = str; - } - INIT_PZVAL(tmp); - return zend_hash_index_update(arg->value.ht, index, (void *) &tmp, sizeof(zval *), NULL); -} - - -ZEND_API inline int add_index_stringl(zval *arg, uint index, char *str, uint length, int duplicate) -{ - zval *tmp = (zval *) emalloc(sizeof(zval)); - - tmp->type = IS_STRING; - tmp->value.str.len = length; - if (duplicate) { - tmp->value.str.val = estrndup(str,tmp->value.str.len); - } else { - tmp->value.str.val = str; - } - INIT_PZVAL(tmp); - return zend_hash_index_update(arg->value.ht, index, (void *) &tmp, sizeof(zval *),NULL); -} - - -ZEND_API inline int add_next_index_long(zval *arg, long n) -{ - zval *tmp = (zval *) emalloc(sizeof(zval)); - - tmp->type = IS_LONG; - tmp->value.lval = n; - INIT_PZVAL(tmp); - return zend_hash_next_index_insert(arg->value.ht, &tmp, sizeof(zval *), NULL); -} - - -ZEND_API inline int add_next_index_double(zval *arg, double d) -{ - zval *tmp = (zval *) emalloc(sizeof(zval)); - - tmp->type = IS_DOUBLE; - tmp->value.dval = d; - INIT_PZVAL(tmp); - return zend_hash_next_index_insert(arg->value.ht, &tmp, sizeof(zval *), NULL); -} - - -ZEND_API inline int add_next_index_string(zval *arg, char *str, int duplicate) -{ - zval *tmp = (zval *) emalloc(sizeof(zval)); - - tmp->type = IS_STRING; - tmp->value.str.len = strlen(str); - if (duplicate) { - tmp->value.str.val = estrndup(str,tmp->value.str.len); - } else { - tmp->value.str.val = str; - } - INIT_PZVAL(tmp); - return zend_hash_next_index_insert(arg->value.ht, &tmp, sizeof(zval *),NULL); -} - - -ZEND_API inline int add_next_index_stringl(zval *arg, char *str, uint length, int duplicate) -{ - zval *tmp = (zval *) emalloc(sizeof(zval)); - - tmp->type = IS_STRING; - tmp->value.str.len = length; - if (duplicate) { - tmp->value.str.val = estrndup(str,tmp->value.str.len); - } else { - tmp->value.str.val = str; - } - INIT_PZVAL(tmp); - return zend_hash_next_index_insert(arg->value.ht, &tmp, sizeof(zval *),NULL); -} - - -ZEND_API inline int add_get_assoc_string(zval *arg, char *key, char *str, void **dest, int duplicate) -{ - zval *tmp = (zval *) emalloc(sizeof(zval)); - - tmp->type = IS_STRING; - tmp->value.str.len = strlen(str); - if (duplicate) { - tmp->value.str.val = estrndup(str,tmp->value.str.len); - } else { - tmp->value.str.val = str; - } - INIT_PZVAL(tmp); - return zend_hash_update(arg->value.ht, key, strlen(key)+1, (void *) &tmp, sizeof(zval *), dest); -} - - -ZEND_API inline int add_get_assoc_stringl(zval *arg, char *key, char *str, uint length, void **dest, int duplicate) -{ - zval *tmp = (zval *) emalloc(sizeof(zval)); - - tmp->type = IS_STRING; - tmp->value.str.len = length; - if (duplicate) { - tmp->value.str.val = estrndup(str,tmp->value.str.len); - } else { - tmp->value.str.val = str; - } - INIT_PZVAL(tmp); - return zend_hash_update(arg->value.ht, key, strlen(key)+1, (void *) &tmp, sizeof(zval *), dest); -} - - -ZEND_API inline int add_get_index_long(zval *arg, uint index, long l, void **dest) -{ - zval *tmp = (zval *) emalloc(sizeof(zval)); - - tmp->type = IS_LONG; - tmp->value.lval = l; - INIT_PZVAL(tmp); - return zend_hash_index_update(arg->value.ht, index, (void *) &tmp, sizeof(zval *),dest); -} - - -ZEND_API inline int add_get_index_double(zval *arg, uint index, double d, void **dest) -{ - zval *tmp = (zval *) emalloc(sizeof(zval)); - - tmp->type = IS_DOUBLE; - tmp->value.dval= d; - INIT_PZVAL(tmp); - return zend_hash_index_update(arg->value.ht, index, (void *) &tmp, sizeof(zval *),dest); -} - - -ZEND_API inline int add_get_index_string(zval *arg, uint index, char *str, void **dest, int duplicate) -{ - zval *tmp = (zval *) emalloc(sizeof(zval)); - - tmp->type = IS_STRING; - tmp->value.str.len = strlen(str); - if (duplicate) { - tmp->value.str.val = estrndup(str,tmp->value.str.len); - } else { - tmp->value.str.val = str; - } - INIT_PZVAL(tmp); - return zend_hash_index_update(arg->value.ht, index, (void *) &tmp, sizeof(zval *),dest); -} - - -ZEND_API inline int add_get_index_stringl(zval *arg, uint index, char *str, uint length, void **dest, int duplicate) -{ - zval *tmp = (zval *) emalloc(sizeof(zval)); - - tmp->type = IS_STRING; - tmp->value.str.len = length; - if (duplicate) { - tmp->value.str.val = estrndup(str,tmp->value.str.len); - } else { - tmp->value.str.val = str; - } - INIT_PZVAL(tmp); - return zend_hash_index_update(arg->value.ht, index, (void *) &tmp, sizeof(zval *),dest); -} - - -ZEND_API inline int add_property_long(zval *arg, char *key, long n) -{ - zval *tmp = (zval *) emalloc(sizeof(zval)); - - tmp->type = IS_LONG; - tmp->value.lval = n; - INIT_PZVAL(tmp); - return zend_hash_update(arg->value.obj.properties, key, strlen(key)+1, (void *) &tmp, sizeof(zval *), NULL); -} - - -ZEND_API inline int add_property_double(zval *arg, char *key, double d) -{ - zval *tmp = (zval *) emalloc(sizeof(zval)); - - tmp->type = IS_DOUBLE; - tmp->value.dval = d; - INIT_PZVAL(tmp); - return zend_hash_update(arg->value.obj.properties, key, strlen(key)+1, (void *) &tmp, sizeof(zval *), NULL); -} - - -ZEND_API inline int add_property_string(zval *arg, char *key, char *str, int duplicate) -{ - zval *tmp = (zval *) emalloc(sizeof(zval)); - - tmp->type = IS_STRING; - tmp->value.str.len = strlen(str); - if (duplicate) { - tmp->value.str.val = estrndup(str,tmp->value.str.len); - } else { - tmp->value.str.val = str; - } - INIT_PZVAL(tmp); - return zend_hash_update(arg->value.obj.properties, key, strlen(key)+1, (void *) &tmp, sizeof(zval *), NULL); -} - - -ZEND_API inline int add_property_stringl(zval *arg, char *key, char *str, uint length, int duplicate) -{ - zval *tmp = (zval *) emalloc(sizeof(zval)); - - tmp->type = IS_STRING; - tmp->value.str.len = length; - if (duplicate) { - tmp->value.str.val = estrndup(str,tmp->value.str.len); - } else { - tmp->value.str.val = str; - } - INIT_PZVAL(tmp); - return zend_hash_update(arg->value.obj.properties, key, strlen(key)+1, (void *) &tmp, sizeof(zval *), NULL); -} - - -int zend_startup_module(zend_module_entry *module) -{ - if (module) { - module->module_number = zend_next_free_module(); - if (module->module_startup_func) { - if (module->module_startup_func(MODULE_PERSISTENT, module->module_number)==FAILURE) { - zend_error(E_CORE_ERROR,"Unable to start %s module",module->name); - return FAILURE; - } - } - module->type = MODULE_PERSISTENT; - zend_register_module(module); - } - return SUCCESS; -} - - -ZEND_API int _register_list_destructors(void (*list_destructor)(void *), void (*plist_destructor)(void *), int module_number) -{ - list_destructors_entry ld; - -#if 0 - printf("Registering destructors %d for module %d\n", list_destructors.nNextFreeElement, module_number); -#endif - - ld.list_destructor=(void (*)(void *)) list_destructor; - ld.plist_destructor=(void (*)(void *)) plist_destructor; - ld.module_number = module_number; - ld.resource_id = list_destructors.nNextFreeElement; - - if (zend_hash_next_index_insert(&list_destructors,(void *) &ld,sizeof(list_destructors_entry),NULL)==FAILURE) { - return FAILURE; - } - return list_destructors.nNextFreeElement-1; -} - - -/* registers all functions in *library_functions in the function hash */ -int zend_register_functions(zend_function_entry *functions, HashTable *function_table) -{ - zend_function_entry *ptr = functions; - zend_internal_function internal_function; - int count=0,unload=0; - HashTable *target_function_table = function_table; - CLS_FETCH(); - - if (!target_function_table) { - target_function_table = CG(function_table); - } - internal_function.type = ZEND_INTERNAL_FUNCTION; - - while (ptr->fname) { - internal_function.handler = ptr->handler; - internal_function.arg_types = ptr->func_arg_types; - internal_function.function_name = ptr->fname; - if (!internal_function.handler) { - zend_error(E_CORE_WARNING,"Null function defined as active function"); - zend_unregister_functions(functions, count, target_function_table); - return FAILURE; - } - if (zend_hash_add(target_function_table, ptr->fname, strlen(ptr->fname)+1, &internal_function, sizeof(zend_internal_function), NULL) == FAILURE) { - unload=1; - break; - } - ptr++; - count++; - } - if (unload) { /* before unloading, display all remaining bad function in the module */ - while (ptr->fname) { - if (zend_hash_exists(target_function_table, ptr->fname, strlen(ptr->fname)+1)) { - zend_error(E_CORE_WARNING, "Function registration failed - duplicate name - %s",ptr->fname); - } - ptr++; - } - zend_unregister_functions(functions, count, target_function_table); - return FAILURE; - } - return SUCCESS; -} - -/* count=-1 means erase all functions, otherwise, - * erase the first count functions - */ -void zend_unregister_functions(zend_function_entry *functions, int count, HashTable *function_table) -{ - zend_function_entry *ptr = functions; - int i=0; - HashTable *target_function_table = function_table; - CLS_FETCH(); - - if (!target_function_table) { - target_function_table = CG(function_table); - } - while (ptr->fname) { - if (count!=-1 && i>=count) { - break; - } -#if 0 - zend_printf("Unregistering %s()\n", ptr->fname); -#endif - zend_hash_del(target_function_table, ptr->fname, strlen(ptr->fname)+1); - ptr++; - i++; - } -} - - -ZEND_API int zend_register_module(zend_module_entry *module) -{ -#if 0 - zend_printf("%s: Registering module %d\n",module->name, module->module_number); -#endif - if (module->functions && zend_register_functions(module->functions, NULL)==FAILURE) { - zend_error(E_CORE_WARNING,"%s: Unable to register functions, unable to load",module->name); - return FAILURE; - } - module->module_started=1; - return zend_hash_add(&module_registry, module->name,strlen(module->name)+1,(void *)module,sizeof(zend_module_entry),NULL); -} - - -void module_destructor(zend_module_entry *module) -{ - if (module->type == MODULE_TEMPORARY) { - zend_hash_apply_with_argument(&list_destructors, (int (*)(void *,void *)) clean_module_resource_destructors, (void *) &(module->module_number)); - clean_module_constants(module->module_number); - } - - if (module->request_started && module->request_shutdown_func) { -#if 0 - zend_printf("%s: Request shutdown\n",module->name); -#endif - module->request_shutdown_func(module->type, module->module_number); - } - module->request_started=0; - if (module->module_started && module->module_shutdown_func) { -#if 0 - zend_printf("%s: Module shutdown\n",module->name); -#endif - module->module_shutdown_func(module->type, module->module_number); - } - module->module_started=0; - if (module->functions) { - zend_unregister_functions(module->functions, -1, NULL); - } - -#if HAVE_LIBDL - if (module->handle) { - dlclose(module->handle); - } -#endif -} - - -/* call request startup for all modules */ -int module_registry_request_startup(zend_module_entry *module) -{ - if (!module->request_started && module->request_startup_func) { -#if 0 - zend_printf("%s: Request startup\n",module->name); -#endif - module->request_startup_func(module->type, module->module_number); - } - module->request_started=1; - return 0; -} - - -/* for persistent modules - call request shutdown and flag NOT to erase - * for temporary modules - do nothing, and flag to erase - */ -int module_registry_cleanup(zend_module_entry *module) -{ - switch(module->type) { - case MODULE_PERSISTENT: - if (module->request_started && module->request_shutdown_func) { -#if 0 - zend_printf("%s: Request shutdown\n",module->name); -#endif - module->request_shutdown_func(module->type, module->module_number); - } - module->request_started=0; - return 0; - break; - case MODULE_TEMPORARY: - return 1; - break; - } - return 0; -} - - -/* return the next free module number */ -int zend_next_free_module(void) -{ - return ++module_count; -} - - -ZEND_API zend_class_entry *register_internal_class(zend_class_entry *class_entry) -{ - zend_class_entry *register_class; - char *lowercase_name = zend_strndup(class_entry->name, class_entry->name_length); - CLS_FETCH(); - - zend_str_tolower(lowercase_name, class_entry->name_length); - - class_entry->type = ZEND_INTERNAL_CLASS; - class_entry->parent = NULL; - class_entry->refcount = (int *) malloc(sizeof(int)); - *class_entry->refcount = 1; - zend_hash_init(&class_entry->default_properties, 0, NULL, PVAL_PTR_DTOR, 1); - zend_hash_init(&class_entry->function_table, 0, NULL, ZEND_FUNCTION_DTOR, 1); - - zend_hash_update(CG(class_table), lowercase_name, class_entry->name_length+1, class_entry, sizeof(zend_class_entry), (void **) ®ister_class); - free(lowercase_name); - - if (class_entry->builtin_functions) { - zend_register_functions(class_entry->builtin_functions, &class_entry->function_table); - } - return register_class; -} - - -ZEND_API zend_module_entry *zend_get_module(int module_number) -{ - zend_module_entry *module; - - if (zend_hash_index_find(&module_registry, module_number, (void **) &module)==SUCCESS) { - return module; - } else { - return NULL; - } -} diff --git a/Zend/zend_API.h b/Zend/zend_API.h deleted file mode 100644 index 9e65b1d80d..0000000000 --- a/Zend/zend_API.h +++ /dev/null @@ -1,273 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | Zend Engine | - +----------------------------------------------------------------------+ - | Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski | - +----------------------------------------------------------------------+ - | This source file is subject to version 0.91 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at | - | http://www.zend.com/license/0_91.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Andi Gutmans <andi@zend.com> | - | Zeev Suraski <zeev@zend.com> | - +----------------------------------------------------------------------+ -*/ - - -#ifndef _ZEND_API_H -#define _ZEND_API_H - -#include "modules.h" -#include "zend_list.h" - - -#define ZEND_NAMED_FUNCTION(name) void name(INTERNAL_FUNCTION_PARAMETERS) -#define ZEND_FUNCTION(name) ZEND_NAMED_FUNCTION(zend_if_##name) - -#define ZEND_NAMED_FE(runtime_name, name, arg_types) { #runtime_name, name, arg_types }, -#define ZEND_FE(name, arg_types) ZEND_NAMED_FE(name, zend_if_##name, arg_types) - - -#define INIT_CLASS_ENTRY(class_container, class_name, functions) \ - { \ - class_container.name = strdup(class_name); \ - class_container.name_length = sizeof(class_name)-1; \ - class_container.builtin_functions = functions; \ - class_container.handle_function_call = NULL; \ - class_container.handle_property_get = NULL; \ - class_container.handle_property_set = NULL; \ - } - -#define INIT_OVERLOADED_CLASS_ENTRY(class_container, class_name, functions, handle_fcall, handle_propget, handle_propset) \ - { \ - class_container.name = strdup(class_name); \ - class_container.name_length = sizeof(class_name)-1; \ - class_container.builtin_functions = functions; \ - class_container.handle_function_call = handle_fcall; \ - class_container.handle_property_get = handle_propget; \ - class_container.handle_property_set = handle_propset; \ - } - - - -int zend_next_free_module(void); - -ZEND_API int getParameters(int ht, int param_count,...); -ZEND_API int getParametersArray(int ht, int param_count, zval **argument_array); -ZEND_API int getParametersEx(int param_count,...); -ZEND_API int getParametersArrayEx(int param_count, zval ***argument_array); - -ZEND_API int ParameterPassedByReference(int ht, uint n); - -int zend_register_functions(zend_function_entry *functions, HashTable *function_table); -void zend_unregister_functions(zend_function_entry *functions, int count, HashTable *function_table); -ZEND_API int zend_register_module(zend_module_entry *module_entry); -ZEND_API zend_class_entry *register_internal_class(zend_class_entry *class_entry); -ZEND_API zend_module_entry *zend_get_module(int module_number); - -ZEND_API void wrong_param_count(void); - -#define getThis() (this_ptr) - -#define WRONG_PARAM_COUNT { wrong_param_count(); return; } -#define WRONG_PARAM_COUNT_WITH_RETVAL(ret) { wrong_param_count(); return ret; } -#define ARG_COUNT(ht) (ht) - -#define BYREF_NONE 0 -#define BYREF_FORCE 1 -#define BYREF_ALLOW 2 - -#if !(WIN32||WINNT) -#define DLEXPORT -#endif - -int zend_startup_module(zend_module_entry *module); - -ZEND_API int array_init(zval *arg); -ZEND_API int object_init(zval *arg); -ZEND_API int object_init_ex(zval *arg, zend_class_entry *ce); -ZEND_API int add_assoc_long(zval *arg, char *key, long n); -ZEND_API int add_assoc_double(zval *arg, char *key, double d); -ZEND_API int add_assoc_string(zval *arg, char *key, char *str, int duplicate); -ZEND_API int add_assoc_stringl(zval *arg, char *key, char *str, uint length, int duplicate); -ZEND_API int add_assoc_function(zval *arg, char *key,void (*function_ptr)(INTERNAL_FUNCTION_PARAMETERS)); -ZEND_API int add_index_long(zval *arg, uint idx, long n); -ZEND_API int add_index_double(zval *arg, uint idx, double d); -ZEND_API int add_index_string(zval *arg, uint idx, char *str, int duplicate); -ZEND_API int add_index_stringl(zval *arg, uint idx, char *str, uint length, int duplicate); -ZEND_API int add_next_index_long(zval *arg, long n); -ZEND_API int add_next_index_double(zval *arg, double d); -ZEND_API int add_next_index_string(zval *arg, char *str, int duplicate); -ZEND_API int add_next_index_stringl(zval *arg, char *str, uint length, int duplicate); - -ZEND_API int add_get_assoc_string(zval *arg, char *key, char *str, void **dest, int duplicate); -ZEND_API int add_get_assoc_stringl(zval *arg, char *key, char *str, uint length, void **dest, int duplicate); -ZEND_API int add_get_index_long(zval *arg, uint idx, long l, void **dest); -ZEND_API int add_get_index_double(zval *arg, uint idx, double d, void **dest); -ZEND_API int add_get_index_string(zval *arg, uint idx, char *str, void **dest, int duplicate); -ZEND_API int add_get_index_stringl(zval *arg, uint idx, char *str, uint length, void **dest, int duplicate); - -ZEND_API int call_user_function(HashTable *function_table, zval *object, zval *function_name, zval *retval, int param_count, zval *params[]); -ZEND_API int call_user_function_ex(HashTable *function_table, zval *object, zval *function_name, zval *retval, int param_count, zval **params[], int no_separation); - - -ZEND_API int add_property_long(zval *arg, char *key, long l); -ZEND_API int add_property_double(zval *arg, char *key, double d); -ZEND_API int add_property_string(zval *arg, char *key, char *str, int duplicate); -ZEND_API int add_property_stringl(zval *arg, char *key, char *str, uint length, int duplicate); - -#define add_method(arg,key,method) add_assoc_function((arg),(key),(method)) - -#define RETVAL_RESOURCE(l) { \ - return_value->type = IS_RESOURCE;\ - return_value->value.lval = l; \ - } -#define RETVAL_LONG(l) { \ - return_value->type = IS_LONG; \ - return_value->value.lval = l; \ - } -#define RETVAL_DOUBLE(d) { \ - return_value->type = IS_DOUBLE; \ - return_value->value.dval = d; \ - } -#define RETVAL_STRING(s,duplicate) { \ - char *__s=(s); \ - return_value->value.str.len = strlen(__s); \ - return_value->value.str.val = (duplicate?estrndup(__s,return_value->value.str.len):__s); \ - return_value->type = IS_STRING; \ - } -#define RETVAL_STRINGL(s,l,duplicate) { \ - char *__s=(s); int __l=l; \ - return_value->value.str.len = __l; \ - return_value->value.str.val = (duplicate?estrndup(__s,__l):__s); \ - return_value->type = IS_STRING; \ - } - -#define RETVAL_FALSE { return_value->value.lval = 0; return_value->type = IS_BOOL; } -#define RETVAL_TRUE { return_value->value.lval = 1; return_value->type = IS_BOOL; } - -#define RETURN_RESOURCE(l) { \ - return_value->type = IS_RESOURCE;\ - return_value->value.lval = l; \ - return; \ - } -#define RETURN_LONG(l) { \ - return_value->type = IS_LONG; \ - return_value->value.lval = l; \ - return; \ - } -#define RETURN_DOUBLE(d) { \ - return_value->type = IS_DOUBLE; \ - return_value->value.dval = d; \ - return; \ - } -#define RETURN_STRING(s,duplicate) { \ - char *__s=(s); \ - return_value->value.str.len = strlen(__s); \ - return_value->value.str.val = (duplicate?estrndup(__s,return_value->value.str.len):__s); \ - return_value->type = IS_STRING; \ - return; \ - } -#define RETURN_STRINGL(s,l,duplicate) { \ - char *__s=(s); int __l=l; \ - return_value->value.str.len = __l; \ - return_value->value.str.val = (duplicate?estrndup(__s,__l):__s); \ - return_value->type = IS_STRING; \ - return; \ - } - -#define RETURN_FALSE { RETVAL_FALSE; return; } -#define RETURN_TRUE { RETVAL_TRUE; return; } - -#define SET_VAR_STRING(n,v) { \ - { \ - zval *var = (zval *) emalloc(sizeof(zval)); \ - char *str=(v); /* prevent 'v' from being evaluated more than once */ \ - \ - var->value.str.val = (str); \ - var->value.str.len = strlen((str)); \ - var->type = IS_STRING; \ - ZEND_SET_GLOBAL_VAR(n, var); \ - } \ - } - -#define SET_VAR_STRINGL(n,v,l) { \ - { \ - zval *var = (zval *) emalloc(sizeof(zval)); \ - \ - var->value.str.val = (v); \ - var->value.str.len = (l); \ - var->type = IS_STRING; \ - ZEND_SET_GLOBAL_VAR(n, var); \ - } \ - } - -#define SET_VAR_LONG(n,v) { \ - { \ - zval *var = (zval *) emalloc(sizeof(zval)); \ - \ - var->value.lval = (v); \ - var->type = IS_LONG; \ - ZEND_SET_GLOBAL_VAR(n, var); \ - } \ - } - -#define SET_VAR_DOUBLE(n,v) { \ - { \ - zval *var = (zval *) emalloc(sizeof(zval)); \ - \ - var->value.dval = (v); \ - var->type = IS_DOUBLE; \ - ZEND_SET_GLOBAL_VAR(n, var); \ - } \ - } - - -#define ZEND_SET_SYMBOL(symtable, name, var) \ - { \ - char *_name = (name); \ - \ - ZEND_SET_SYMBOL_WITH_LENGTH(symtable, _name, strlen(_name)+1, var); \ - } - - -#define ZEND_SET_SYMBOL_WITH_LENGTH(symtable, name, name_length, var) \ - { \ - zval **orig_var; \ - \ - if (zend_hash_find(symtable, (name), (name_length), (void **) &orig_var)==SUCCESS \ - && PZVAL_IS_REF(*orig_var)) { \ - var->refcount = (*orig_var)->refcount; \ - var->EA.locks = (*orig_var)->EA.locks; \ - var->EA.is_ref = 1; \ - \ - zval_dtor(*orig_var); \ - **orig_var = *var; \ - efree(var); \ - } else { \ - INIT_PZVAL(var); \ - zend_hash_update(symtable, (name), (name_length), &var, sizeof(zval *), NULL); \ - } \ - } - - -#define ZEND_SET_GLOBAL_VAR(name, var) \ - ZEND_SET_SYMBOL(&EG(symbol_table), name, var) - -#define ZEND_SET_GLOBAL_VAR_WITH_LENGTH(name, name_length, var) \ - ZEND_SET_SYMBOL_WITH_LENGTH(&EG(symbol_table), name, name_length, var) - -#define HASH_OF(p) ((p)->type==IS_ARRAY ? (p)->value.ht : (((p)->type==IS_OBJECT ? (p)->value.obj.properties : NULL))) - -#endif /* _ZEND_API_H */ - -/* - * Local variables: - * tab-width: 4 - * c-basic-offset: 4 - * End: - */ diff --git a/Zend/zend_alloc.c b/Zend/zend_alloc.c deleted file mode 100644 index 97cc8801b1..0000000000 --- a/Zend/zend_alloc.c +++ /dev/null @@ -1,553 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | Zend Engine | - +----------------------------------------------------------------------+ - | Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski | - +----------------------------------------------------------------------+ - | This source file is subject to version 0.91 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at | - | http://www.zend.com/license/0_91.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Andi Gutmans <andi@zend.com> | - | Zeev Suraski <zeev@zend.com> | - +----------------------------------------------------------------------+ -*/ - - -#include <stdlib.h> - -#include "zend.h" -#include "zend_alloc.h" -#include "zend_globals.h" -#ifdef HAVE_SIGNAL_H -# include <signal.h> -#endif -#ifdef HAVE_UNISTD_H -# include <unistd.h> -#endif - -#ifndef ZTS -static zend_alloc_globals alloc_globals; -#endif - - -#if ZEND_DEBUG -# define END_MAGIC_SIZE sizeof(long) -# define END_ALIGNMENT(size) (((size)%PLATFORM_ALIGNMENT)?(PLATFORM_ALIGNMENT-((size)%PLATFORM_ALIGNMENT)):0) -#else -# define END_MAGIC_SIZE 0 -# define END_ALIGNMENT(size) 0 -#endif - - -# if MEMORY_LIMIT -# if ZEND_DEBUG -#define CHECK_MEMORY_LIMIT(s) _CHECK_MEMORY_LIMIT(s ZEND_FILE_LINE_RELAY_CC) -# else -#define CHECK_MEMORY_LIMIT(s) _CHECK_MEMORY_LIMIT(s,NULL,0) -# endif - -#define _CHECK_MEMORY_LIMIT(s,file,lineno) { AG(allocated_memory) += (s);\ - if (AG(memory_limit)<AG(allocated_memory)) {\ - if (!file) { \ - zend_error(E_ERROR,"Allowed memory size of %d bytes exhausted (tried to allocate %d bytes)", AG(memory_limit),s); \ - } else { \ - zend_error(E_ERROR,"Allowed memory size of %d bytes exhausted at %s:%d (tried to allocate %d bytes)", AG(memory_limit), file, lineno, s); \ - } \ - } \ - } -# endif - -#ifndef CHECK_MEMORY_LIMIT -#define CHECK_MEMORY_LIMIT(s) -#endif - - -#define REMOVE_POINTER_FROM_LIST(p) \ - if (!p->persistent && p==AG(head)) { \ - AG(head) = p->pNext; \ - } else if (p->persistent && p==AG(phead)) { \ - AG(phead) = p->pNext; \ - } else { \ - p->pLast->pNext = p->pNext; \ - } \ - if (p->pNext) { \ - p->pNext->pLast = p->pLast; \ - } - -#define ADD_POINTER_TO_LIST(p) \ - if (p->persistent) { \ - p->pNext = AG(phead); \ - if (AG(phead)) { \ - AG(phead)->pLast = p; \ - } \ - AG(phead) = p; \ - } else { \ - p->pNext = AG(head); \ - if (AG(head)) { \ - AG(head)->pLast = p; \ - } \ - AG(head) = p; \ - } \ - p->pLast = (mem_header *) NULL; - - - -ZEND_API void *_emalloc(size_t size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC) -{ - mem_header *p; - ALS_FETCH(); - - HANDLE_BLOCK_INTERRUPTIONS(); - - if ((size < MAX_CACHED_MEMORY) && (AG(cache_count)[size] > 0)) { - p = AG(cache)[size][--AG(cache_count)[size]]; -#if ZEND_DEBUG - p->filename = __zend_filename; - p->lineno = __zend_lineno; - p->orig_filename = __zend_orig_filename; - p->orig_lineno = __zend_orig_lineno; - p->magic = MEM_BLOCK_START_MAGIC; - p->reported = 0; -#endif - HANDLE_UNBLOCK_INTERRUPTIONS(); - p->persistent = 0; - p->cached = 0; - return (void *)((char *)p + sizeof(mem_header) + PLATFORM_PADDING); - } else { - p = (mem_header *) malloc(sizeof(mem_header) + size + PLATFORM_PADDING + END_ALIGNMENT(size) + END_MAGIC_SIZE); - } - - if (!p) { - fprintf(stderr,"FATAL: emalloc(): Unable to allocate %ld bytes\n", (long) size); -#if ZEND_DEBUG && defined(HAVE_KILL) && defined(HAVE_GETPID) - kill(getpid(), SIGSEGV); -#else - exit(1); -#endif - HANDLE_UNBLOCK_INTERRUPTIONS(); - return (void *)p; - } - p->persistent = p->cached = 0; - ADD_POINTER_TO_LIST(p); - p->size = size; -#if ZEND_DEBUG - p->filename = __zend_filename; - p->lineno = __zend_lineno; - p->orig_filename = __zend_orig_filename; - p->orig_lineno = __zend_orig_lineno; - p->magic = MEM_BLOCK_START_MAGIC; - p->reported = 0; - *((long *)(((char *) p) + sizeof(mem_header)+size+PLATFORM_PADDING+END_ALIGNMENT(size))) = MEM_BLOCK_END_MAGIC; -#endif -#if MEMORY_LIMIT - CHECK_MEMORY_LIMIT(size); -#endif - HANDLE_UNBLOCK_INTERRUPTIONS(); - return (void *)((char *)p + sizeof(mem_header) + PLATFORM_PADDING); -} - - -ZEND_API void _efree(void *ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC) -{ - mem_header *p = (mem_header *) ((char *)ptr - sizeof(mem_header) - PLATFORM_PADDING); - ALS_FETCH(); - -#if ZEND_DEBUG - if (!_mem_block_check(ptr, 1 ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC)) { - return; - } - memset(ptr, 0x5a, p->size); -#endif - - if (!p->persistent && (p->size < MAX_CACHED_MEMORY) && (AG(cache_count)[p->size] < MAX_CACHED_ENTRIES)) { - AG(cache)[p->size][AG(cache_count)[p->size]++] = p; - p->cached = 1; -#if ZEND_DEBUG - p->magic = MEM_BLOCK_CACHED_MAGIC; -#endif - return; - } - HANDLE_BLOCK_INTERRUPTIONS(); - REMOVE_POINTER_FROM_LIST(p); - -#if MEMORY_LIMIT - AG(allocated_memory) -= p->size; -#endif - - free(p); - HANDLE_UNBLOCK_INTERRUPTIONS(); -} - - -ZEND_API void *_ecalloc(size_t nmemb, size_t size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC) -{ - void *p; - int final_size=size*nmemb; - - HANDLE_BLOCK_INTERRUPTIONS(); - p = _emalloc(final_size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC); - if (!p) { - HANDLE_UNBLOCK_INTERRUPTIONS(); - return (void *) p; - } - memset(p,(int)NULL,final_size); - HANDLE_UNBLOCK_INTERRUPTIONS(); - return p; -} - - -ZEND_API void *_erealloc(void *ptr, size_t size, int allow_failure ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC) -{ - mem_header *p = (mem_header *) ((char *)ptr-sizeof(mem_header)-PLATFORM_PADDING); - mem_header *orig = p; - ALS_FETCH(); - - if (!ptr) { - return _emalloc(size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC); - } - HANDLE_BLOCK_INTERRUPTIONS(); - REMOVE_POINTER_FROM_LIST(p); - p = (mem_header *) realloc(p,sizeof(mem_header)+size+PLATFORM_PADDING+END_ALIGNMENT(size)+END_MAGIC_SIZE); - if (!p) { - if (!allow_failure) { - fprintf(stderr,"FATAL: erealloc(): Unable to allocate %ld bytes\n", (long) size); -#if ZEND_DEBUG && HAVE_KILL && HAVE_GETPID - kill(getpid(), SIGSEGV); -#else - exit(1); -#endif - } - ADD_POINTER_TO_LIST(orig); - HANDLE_UNBLOCK_INTERRUPTIONS(); - return (void *)NULL; - } - ADD_POINTER_TO_LIST(p); -#if ZEND_DEBUG - p->filename = __zend_filename; - p->lineno = __zend_lineno; - p->magic = MEM_BLOCK_START_MAGIC; - *((long *)(((char *) p) + sizeof(mem_header)+size+PLATFORM_PADDING+END_ALIGNMENT(size))) = MEM_BLOCK_END_MAGIC; -#endif -#if MEMORY_LIMIT - CHECK_MEMORY_LIMIT(size - p->size); -#endif - p->size = size; - - HANDLE_UNBLOCK_INTERRUPTIONS(); - return (void *)((char *)p+sizeof(mem_header)+PLATFORM_PADDING); -} - - -ZEND_API char *_estrdup(const char *s ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC) -{ - int length; - char *p; - - length = strlen(s)+1; - HANDLE_BLOCK_INTERRUPTIONS(); - p = (char *) _emalloc(length ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC); - if (!p) { - HANDLE_UNBLOCK_INTERRUPTIONS(); - return (char *)NULL; - } - HANDLE_UNBLOCK_INTERRUPTIONS(); - memcpy(p,s,length); - return p; -} - - -ZEND_API char *_estrndup(const char *s, uint length ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC) -{ - char *p; - - HANDLE_BLOCK_INTERRUPTIONS(); - p = (char *) _emalloc(length+1 ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC); - if (!p) { - HANDLE_UNBLOCK_INTERRUPTIONS(); - return (char *)NULL; - } - HANDLE_UNBLOCK_INTERRUPTIONS(); - memcpy(p,s,length); - p[length]=0; - return p; -} - - -ZEND_API char *zend_strndup(const char *s, uint length) -{ - char *p; - - p = (char *) malloc(length+1); - if (!p) { - return (char *)NULL; - } - if (length) { - memcpy(p,s,length); - } - p[length]=0; - return p; -} - - -ZEND_API int zend_set_memory_limit(unsigned int memory_limit) -{ -#if MEMORY_LIMIT - ALS_FETCH(); - - AG(memory_limit) = memory_limit; - return SUCCESS; -#else - return FAILURE; -#endif -} - - -ZEND_API void start_memory_manager(ALS_D) -{ - AG(phead) = AG(head) = NULL; - -#if MEMORY_LIMIT - AG(memory_limit)=1<<30; /* rediculous limit, effectively no limit */ - AG(allocated_memory)=0; - AG(memory_exhausted)=0; -#endif - - memset(AG(cache_count),0,MAX_CACHED_MEMORY*sizeof(unsigned char)); -} - - -ZEND_API void shutdown_memory_manager(int silent, int clean_cache) -{ - mem_header *p, *t; -#if ZEND_DEBUG - int had_leaks=0; -#endif - ALS_FETCH(); - - p=AG(head); - t=AG(head); - while (t) { - if (!t->cached || clean_cache) { -#if ZEND_DEBUG - if (!t->cached && !t->reported) { - mem_header *iterator; - int total_leak=0, total_leak_count=0; - - had_leaks=1; - if (!silent) { - zend_message_dispatcher(ZMSG_MEMORY_LEAK_DETECTED, t); - } - t->reported = 1; - for (iterator=t->pNext; iterator; iterator=iterator->pNext) { - if (!iterator->cached - && iterator->filename==t->filename - && iterator->lineno==t->lineno) { - total_leak += iterator->size; - total_leak_count++; - iterator->reported = 1; - } - } - if (!silent && total_leak_count>0) { - zend_message_dispatcher(ZMSG_MEMORY_LEAK_REPEATED, (void *) (long) (total_leak_count)); - } - } -#endif - p = t->pNext; - REMOVE_POINTER_FROM_LIST(t); - free(t); - t = p; - } else { - t = t->pNext; - } - } -} - - -#if ZEND_DEBUG -void zend_debug_alloc_output(char *format, ...) -{ - char output_buf[256]; - va_list args; - - va_start(args, format); - vsprintf(output_buf, format, args); - va_end(args); - -#if WIN32||WINNT - OutputDebugString(output_buf); -#else - fprintf(stderr, output_buf); -#endif -} - - -ZEND_API int _mem_block_check(void *ptr, int silent ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC) -{ - mem_header *p = (mem_header *) ((char *)ptr - sizeof(mem_header) - PLATFORM_PADDING); - int no_cache_notice=0; - int valid_beginning=1; - int had_problems=0; - - if (silent==2) { - silent=1; - no_cache_notice=1; - } - if (silent==3) { - silent=0; - no_cache_notice=1; - } - if (!silent) { - zend_message_dispatcher(ZMSG_LOG_SCRIPT_NAME, NULL); - zend_debug_alloc_output("---------------------------------------\n"); - zend_debug_alloc_output("%s(%d) : Block 0x%0.8lX status:\n" ZEND_FILE_LINE_RELAY_CC, (long) p); - if (__zend_orig_filename) { - zend_debug_alloc_output("%s(%d) : Actual location (location was relayed)\n" ZEND_FILE_LINE_ORIG_RELAY_CC); - } - zend_debug_alloc_output("%10s\t","Beginning: "); - } - - switch (p->magic) { - case MEM_BLOCK_START_MAGIC: - if (!silent) { - zend_debug_alloc_output("OK (allocated on %s:%d, %d bytes)\n", p->filename, p->lineno, p->size); - } - break; /* ok */ - case MEM_BLOCK_FREED_MAGIC: - if (!silent) { - zend_debug_alloc_output("Freed\n"); - had_problems=1; - } else { - return _mem_block_check(ptr, 0 ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC); - } - break; - case MEM_BLOCK_CACHED_MAGIC: - if (!silent) { - if (!no_cache_notice) { - zend_debug_alloc_output("Cached (allocated on %s:%d, %d bytes)\n", p->filename, p->lineno, p->size); - had_problems=1; - } - } else { - if (!no_cache_notice) { - return _mem_block_check(ptr, 0 ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC); - } - } - break; - default: - if (!silent) { - zend_debug_alloc_output("Overrun (magic=0x%0.8lX, expected=0x%0.8lX)\n", p->magic, MEM_BLOCK_START_MAGIC); - } else { - return _mem_block_check(ptr, 0 ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC); - } - had_problems=1; - valid_beginning=0; - break; - } - - - if (valid_beginning - && *((long *)(((char *) p)+sizeof(mem_header)+p->size+PLATFORM_PADDING+END_ALIGNMENT(p->size))) != MEM_BLOCK_END_MAGIC) { - long magic_num = MEM_BLOCK_END_MAGIC; - char *overflow_ptr, *magic_ptr=(char *) &magic_num; - int overflows=0; - int i; - - if (silent) { - return _mem_block_check(ptr, 0 ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC); - } - had_problems=1; - overflow_ptr = ((char *) p)+sizeof(mem_header)+p->size+PLATFORM_PADDING; - - for (i=0; i<sizeof(long); i++) { - if (overflow_ptr[i]!=magic_ptr[i]) { - overflows++; - } - } - - zend_debug_alloc_output("%10s\t", "End:"); - zend_debug_alloc_output("Overflown (magic=0x%0.8lX instead of 0x%0.8lX)\n", - *((long *)(((char *) p) + sizeof(mem_header)+p->size+PLATFORM_PADDING+END_ALIGNMENT(p->size))), MEM_BLOCK_END_MAGIC); - zend_debug_alloc_output("%10s\t",""); - if (overflows>=sizeof(long)) { - zend_debug_alloc_output("At least %d bytes overflown\n", sizeof(long)); - } else { - zend_debug_alloc_output("%d byte(s) overflown\n", overflows); - } - } else if (!silent) { - zend_debug_alloc_output("%10s\t", "End:"); - if (valid_beginning) { - zend_debug_alloc_output("OK\n"); - } else { - zend_debug_alloc_output("Unknown\n"); - } - } - - if (had_problems) { - int foo = 5; - - foo+=1; - } - - if (!silent) { - zend_debug_alloc_output("---------------------------------------\n"); - } - return ((!had_problems) ? 1 : 0); -} - - -ZEND_API void _full_mem_check(int silent ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC) -{ - mem_header *p; - int errors=0; - ALS_FETCH(); - - p = AG(head); - - - zend_debug_alloc_output("------------------------------------------------\n"); - zend_debug_alloc_output("Full Memory Check at %s:%d\n" ZEND_FILE_LINE_RELAY_CC); - - while (p) { - if (!_mem_block_check((void *)((char *)p + sizeof(mem_header) + PLATFORM_PADDING), (silent?2:3) ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC)) { - errors++; - } - p = p->pNext; - } - zend_debug_alloc_output("End of full memory check %s:%d (%d errors)\n" ZEND_FILE_LINE_RELAY_CC, errors); - zend_debug_alloc_output("------------------------------------------------\n"); -} -#endif - - -ZEND_API void _persist_alloc(void *ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC) -{ - mem_header *p = (mem_header *) ((char *)ptr-sizeof(mem_header)-PLATFORM_PADDING); - ALS_FETCH(); - -#if ZEND_DEBUG - _mem_block_check(ptr, 1 ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC); -#endif - - HANDLE_BLOCK_INTERRUPTIONS(); - - /* remove the block from the non persistent list */ - REMOVE_POINTER_FROM_LIST(p); - - p->persistent = 1; - - /* add the block to the persistent list */ - ADD_POINTER_TO_LIST(p); - HANDLE_UNBLOCK_INTERRUPTIONS(); -} - - -/* - * Local variables: - * tab-width: 4 - * c-basic-offset: 4 - * End: - */ diff --git a/Zend/zend_alloc.h b/Zend/zend_alloc.h deleted file mode 100644 index 5eda4fd102..0000000000 --- a/Zend/zend_alloc.h +++ /dev/null @@ -1,129 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | Zend Engine | - +----------------------------------------------------------------------+ - | Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski | - +----------------------------------------------------------------------+ - | This source file is subject to version 0.91 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at | - | http://www.zend.com/license/0_91.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Andi Gutmans <andi@zend.com> | - | Zeev Suraski <zeev@zend.com> | - +----------------------------------------------------------------------+ -*/ - - -#ifndef _ALLOC_H -#define _ALLOC_H - -#include <stdio.h> - -#include "zend_globals_macros.h" - -#define MEM_BLOCK_START_MAGIC 0x7312F8DCL -#define MEM_BLOCK_END_MAGIC 0x2A8FCC84L -#define MEM_BLOCK_FREED_MAGIC 0x99954317L -#define MEM_BLOCK_CACHED_MAGIC 0xFB8277DCL - -typedef struct _mem_header { -#if ZEND_DEBUG - long magic; - char *filename; - uint lineno; - int reported; - char *orig_filename; - uint orig_lineno; -#endif - struct _mem_header *pNext; - struct _mem_header *pLast; - unsigned int size:30; - unsigned int persistent:1; - unsigned int cached:1; -} mem_header; - -typedef union _align_test { - void *ptr; - double dbl; - long lng; -} align_test; - -#define MAX_CACHED_MEMORY 64 -#define MAX_CACHED_ENTRIES 16 - -#define PLATFORM_ALIGNMENT (sizeof(align_test)) -#define PLATFORM_PADDING (((PLATFORM_ALIGNMENT-sizeof(mem_header))%PLATFORM_ALIGNMENT+PLATFORM_ALIGNMENT)%PLATFORM_ALIGNMENT) - -ZEND_API char *zend_strndup(const char *s, unsigned int length); - -BEGIN_EXTERN_C() - -ZEND_API void *_emalloc(size_t size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC); -ZEND_API void _efree(void *ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC); -ZEND_API void *_ecalloc(size_t nmemb, size_t size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC); -ZEND_API void *_erealloc(void *ptr, size_t size, int allow_failure ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC); -ZEND_API char *_estrdup(const char *s ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC); -ZEND_API char *_estrndup(const char *s, unsigned int length ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC); -ZEND_API void _persist_alloc(void *ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC); - -/* Standard wrapper macros */ -#define emalloc(size) _emalloc((size) ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC) -#define efree(ptr) _efree((ptr) ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC) -#define ecalloc(nmemb,size) _ecalloc((nmemb), (size) ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC) -#define erealloc(ptr,size) _erealloc((ptr), (size),0 ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC) -#define erealloc_recoverable(ptr,size) _erealloc((ptr), (size),1 ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC) -#define estrdup(s) _estrdup((s) ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC) -#define estrndup(s,length) _estrndup((s), (length) ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC) -#define persist_alloc(p) _persist_alloc((p) ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC) - -/* Relay wrapper macros */ -#define emalloc_rel(size) _emalloc((size) ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_CC) -#define efree_rel(ptr) _efree((ptr) ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_CC) -#define ecalloc_rel(nmemb, size) _ecalloc((nmemb), (size) ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_CC) -#define erealloc_rel(ptr, size) _erealloc((ptr), (size), 0 ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_CC) -#define erealloc_recoverable_rel(ptr, size) _erealloc((ptr), (size), 1 ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_CC) -#define estrdup_rel(s) _estrdup((s) ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_CC) -#define estrndup_rel(s, length) _estrndup((s), (length) ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_CC) -#define persist_alloc_rel(p) _persist_alloc((p) ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_CC) - -/* Selective persistent/non persistent allocation macros */ -#define pemalloc(size,persistent) ((persistent)?malloc(size):emalloc(size)) -#define pefree(ptr,persistent) ((persistent)?free(ptr):efree(ptr)) -#define pecalloc(nmemb,size,persistent) ((persistent)?calloc((nmemb),(size)):ecalloc((nmemb),(size))) -#define perealloc(ptr,size,persistent) ((persistent)?realloc((ptr),(size)):erealloc((ptr),(size))) -#define perealloc_recoverable(ptr,size,persistent) ((persistent)?realloc((ptr),(size)):erealloc_recoverable((ptr),(size))) -#define pestrdup(s,persistent) ((persistent)?strdup(s):estrdup(s)) - -#define safe_estrdup(ptr) ((ptr)?(estrdup(ptr)):(empty_string)) -#define safe_estrndup(ptr,len) ((ptr)?(estrndup((ptr),(len))):(empty_string)) - -ZEND_API int zend_set_memory_limit(unsigned int memory_limit); - -ZEND_API void start_memory_manager(ALS_D); -ZEND_API void shutdown_memory_manager(int silent, int clean_cache); - -#if ZEND_DEBUG -ZEND_API int _mem_block_check(void *ptr, int silent ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC); -ZEND_API void _full_mem_check(int silent ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC); -#define mem_block_check(ptr, silent) _mem_block_check(ptr, silent ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC) -#define full_mem_check(silent) _full_mem_check(silent ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC) -#else -#define mem_block_check(type, ptr, silent) -#define full_mem_check(silent) -#endif - - -END_EXTERN_C() - -#endif - -/* - * Local variables: - * tab-width: 4 - * c-basic-offset: 4 - * End: - */ diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c deleted file mode 100644 index 342cf6913b..0000000000 --- a/Zend/zend_builtin_functions.c +++ /dev/null @@ -1,424 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | Zend Engine | - +----------------------------------------------------------------------+ - | Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski | - +----------------------------------------------------------------------+ - | This source file is subject to version 0.91 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at | - | http://www.zend.com/license/0_91.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Andi Gutmans <andi@zend.com> | - | Zeev Suraski <zeev@zend.com> | - +----------------------------------------------------------------------+ -*/ - - -#include "zend.h" -#include "zend_API.h" -#include "zend_builtin_functions.h" -#include "zend_operators.h" -#include "zend_variables.h" -#include "zend_constants.h" - -static ZEND_FUNCTION(zend_version); -static ZEND_FUNCTION(func_num_args); -static ZEND_FUNCTION(func_get_arg); -static ZEND_FUNCTION(func_get_args); -static ZEND_FUNCTION(strlen); -static ZEND_FUNCTION(strcmp); -static ZEND_FUNCTION(strcasecmp); -static ZEND_FUNCTION(each); -static ZEND_FUNCTION(error_reporting); -static ZEND_FUNCTION(define); -static ZEND_FUNCTION(defined); -static ZEND_FUNCTION(get_class); -static ZEND_FUNCTION(get_parent_class); -static ZEND_FUNCTION(method_exists); -static ZEND_FUNCTION(leak); - -extern unsigned char first_arg_force_ref[]; - -static zend_function_entry builtin_functions[] = { - ZEND_FE(zend_version, NULL) - ZEND_FE(func_num_args, NULL) - ZEND_FE(func_get_arg, NULL) - ZEND_FE(func_get_args, NULL) - ZEND_FE(strlen, NULL) - ZEND_FE(strcmp, NULL) - ZEND_FE(strcasecmp, NULL) - ZEND_FE(each, first_arg_force_ref) - ZEND_FE(error_reporting, NULL) - ZEND_FE(define, NULL) - ZEND_FE(defined, NULL) - ZEND_FE(get_class, NULL) - ZEND_FE(get_parent_class, NULL) - ZEND_FE(method_exists, NULL) - ZEND_FE(leak, NULL) - { NULL, NULL, NULL } -}; - - -int zend_startup_builtin_functions() -{ - return zend_register_functions(builtin_functions, NULL); -} - - -ZEND_FUNCTION(zend_version) -{ - RETURN_STRINGL(ZEND_VERSION, sizeof(ZEND_VERSION)-1, 1); -} - - -ZEND_FUNCTION(func_num_args) -{ - void **p; - int arg_count; - ELS_FETCH(); - - p = EG(argument_stack).top_element-1; - arg_count = (ulong) *p; /* this is the amount of arguments passed to func_num_args(); */ - - p = EG(argument_stack).top_element-1-arg_count-1; - if (p>=EG(argument_stack).elements) { - RETURN_LONG((ulong) *p); - } else { - zend_error(E_WARNING, "func_num_args(): Called from the global scope - no function context"); - RETURN_LONG(-1); - } -} - - -ZEND_FUNCTION(func_get_arg) -{ - void **p; - int arg_count; - zval **z_requested_offset; - zval *arg; - long requested_offset; - ELS_FETCH(); - - if (ARG_COUNT(ht)!=1 || getParametersEx(1, &z_requested_offset)==FAILURE) { - RETURN_FALSE; - } - convert_to_long_ex(z_requested_offset); - requested_offset = (*z_requested_offset)->value.lval; - - p = EG(argument_stack).top_element-1; - arg_count = (ulong) *p; /* this is the amount of arguments passed to func_num_args(); */ - - p = EG(argument_stack).top_element-1-arg_count-1; - if (p<EG(argument_stack).elements) { - zend_error(E_WARNING, "func_get_arg(): Called from the global scope - no function context"); - RETURN_FALSE; - } - arg_count = (ulong) *p; - - if (requested_offset>arg_count) { - zend_error(E_WARNING, "func_get_arg(): Only %d arguments passed to function (argument %d requested)", arg_count, requested_offset); - RETURN_FALSE; - } - - arg = *(p-(arg_count-requested_offset)); - *return_value = *arg; - zval_copy_ctor(return_value); -} - - -ZEND_FUNCTION(func_get_args) -{ - void **p; - int arg_count; - int i; - ELS_FETCH(); - - p = EG(argument_stack).top_element-1; - arg_count = (ulong) *p; /* this is the amount of arguments passed to func_num_args(); */ - - p = EG(argument_stack).top_element-1-arg_count-1; - if (p<EG(argument_stack).elements) { - zend_error(E_WARNING, "func_get_args(): Called from the global scope - no function context"); - RETURN_FALSE; - } - arg_count = (ulong) *p; - - - array_init(return_value); - for (i=0; i<arg_count; i++) { - zval *element; - - element = (zval *) emalloc(sizeof(zval)); - *element = **((zval **) (p-(arg_count-i))); - zval_copy_ctor(element); - INIT_PZVAL(element); - zend_hash_next_index_insert(return_value->value.ht, &element, sizeof(zval *), NULL); - } -} - - -/* {{{ proto int strlen(string str) - Get string length */ -ZEND_FUNCTION(strlen) -{ - zval **str; - - if (ARG_COUNT(ht) != 1 || getParametersEx(1, &str) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_string_ex(str); - RETVAL_LONG((*str)->value.str.len); -} -/* }}} */ - -/* {{{ proto int strcmp(string str1, string str2) - Binary safe string comparison */ -ZEND_FUNCTION(strcmp) -{ - zval *s1,*s2; - - if (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &s1, &s2) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_string(s1); - convert_to_string(s2); - RETURN_LONG(zend_binary_strcmp(s1,s2)); -} -/* }}} */ - -/* {{{ proto int strcasecmp(string str1, string str2) - Binary safe case-insensitive string comparison */ -ZEND_FUNCTION(strcasecmp) -{ - zval *s1,*s2; - - if (ARG_COUNT(ht)!=2 || getParameters(ht, 2, &s1, &s2) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_string(s1); - convert_to_string(s2); - RETURN_LONG(zend_binary_strcasecmp(s1, s2)); -} -/* }}} */ - -ZEND_FUNCTION(each) -{ - zval *array,*entry,**entry_ptr, *tmp; - char *string_key; - ulong num_key; - zval **inserted_pointer; - HashTable *target_hash; - - if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &array) == FAILURE) { - WRONG_PARAM_COUNT; - } - target_hash = HASH_OF(array); - if (!target_hash) { - zend_error(E_WARNING,"Variable passed to each() is not an array or object"); - return; - } - if (zend_hash_get_current_data(target_hash, (void **) &entry_ptr)==FAILURE) { - RETURN_FALSE; - } - array_init(return_value); - entry = *entry_ptr; - - /* add value elements */ - if (entry->EA.is_ref) { - tmp = (zval *)emalloc(sizeof(zval)); - *tmp = *entry; - zval_copy_ctor(tmp); - tmp->EA.is_ref=0; - tmp->EA.locks = 0; - tmp->refcount=0; - entry=tmp; - } - zend_hash_index_update(return_value->value.ht, 1, &entry, sizeof(zval *), NULL); - entry->refcount++; - zend_hash_update_ptr(return_value->value.ht, "value", sizeof("value"), entry, sizeof(zval *), NULL); - entry->refcount++; - - /* add the key elements */ - switch (zend_hash_get_current_key(target_hash, &string_key, &num_key)) { - case HASH_KEY_IS_STRING: - add_get_index_string(return_value,0,string_key,(void **) &inserted_pointer,0); - break; - case HASH_KEY_IS_LONG: - add_get_index_long(return_value,0,num_key, (void **) &inserted_pointer); - break; - } - zend_hash_update(return_value->value.ht, "key", sizeof("key"), inserted_pointer, sizeof(zval *), NULL); - (*inserted_pointer)->refcount++; - zend_hash_move_forward(target_hash); -} - -ZEND_FUNCTION(error_reporting) -{ - zval *arg; - int old_error_reporting; - ELS_FETCH(); - - old_error_reporting = EG(error_reporting); - switch (ARG_COUNT(ht)) { - case 0: - break; - case 1: - if (getParameters(ht,1,&arg) == FAILURE) { - RETURN_FALSE; - } - convert_to_long(arg); - EG(error_reporting)=arg->value.lval; - break; - default: - WRONG_PARAM_COUNT; - break; - } - - RETVAL_LONG(old_error_reporting); -} - -ZEND_FUNCTION(define) -{ - zval *var, *val, *non_cs; - int case_sensitive; - zend_constant c; - ELS_FETCH(); - - switch(ARG_COUNT(ht)) { - case 2: - if (getParameters(ht, 2, &var, &val)==FAILURE) { - RETURN_FALSE; - } - case_sensitive = CONST_CS; - break; - case 3: - if (getParameters(ht, 3, &var, &val, &non_cs)==FAILURE) { - RETURN_FALSE; - } - convert_to_long(non_cs); - if (non_cs->value.lval) { - case_sensitive = 0; - } else { - case_sensitive = CONST_CS; - } - break; - default: - WRONG_PARAM_COUNT; - break; - } - switch(val->type) { - case IS_LONG: - case IS_DOUBLE: - case IS_STRING: - case IS_BOOL: - case IS_RESOURCE: - break; - default: - zend_error(E_WARNING,"Constants may only evaluate to scalar values"); - RETURN_FALSE; - break; - } - convert_to_string(var); - - c.value = *val; - zval_copy_ctor(&c.value); - c.flags = case_sensitive | ~CONST_PERSISTENT; /* non persistent */ - c.name = zend_strndup(var->value.str.val, var->value.str.len); - c.name_len = var->value.str.len+1; - zend_register_constant(&c ELS_CC); - RETURN_TRUE; -} - - -ZEND_FUNCTION(defined) -{ - zval *var; - zval c; - - if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &var)==FAILURE) { - WRONG_PARAM_COUNT; - } - - convert_to_string(var); - if (zend_get_constant(var->value.str.val, var->value.str.len, &c)) { - zval_dtor(&c); - RETURN_LONG(1); - } else { - RETURN_LONG(0); - } -} - -/* {{{ proto string get_class(object object) - Retrieves the class name ... -*/ -ZEND_FUNCTION(get_class) -{ - zval *arg; - - if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &arg)==FAILURE) { - RETURN_FALSE; - } - if (arg->type != IS_OBJECT) { - RETURN_FALSE; - } - RETURN_STRINGL(arg->value.obj.ce->name, arg->value.obj.ce->name_length, 1); -} -/* }}} */ - -/* {{{ proto string get_parent_class(object object) - Retrieves the parent class name ... -*/ -ZEND_FUNCTION(get_parent_class) -{ - zval *arg; - - if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &arg)==FAILURE) { - RETURN_FALSE; - } - if ((arg->type != IS_OBJECT) || !arg->value.obj.ce->parent) { - RETURN_FALSE; - } - RETURN_STRINGL(arg->value.obj.ce->parent->name, arg->value.obj.ce->parent->name_length, 1); -} -/* }}} */ - -/* {{{ proto bool method_exists(object object, string method) - Checks if the class method exists ... -*/ -ZEND_FUNCTION(method_exists) -{ - zval *arg1, *arg2; - - if (ARG_COUNT(ht)!=2 || getParameters(ht, 2, &arg1, &arg2)==FAILURE) { - RETURN_FALSE; - } - if (arg1->type != IS_OBJECT) { - RETURN_FALSE; - } - convert_to_string(arg2); - if(zend_hash_exists(&arg1->value.obj.ce->function_table, arg2->value.str.val, arg2->value.str.len+1)) { - RETURN_TRUE; - } else { - RETURN_FALSE; - } -} -/* }}} */ - -ZEND_FUNCTION(leak) -{ - int leakbytes=3; - zval *leak; - - if (ARG_COUNT(ht)>=1) { - if (getParameters(ht, 1, &leak)==SUCCESS) { - convert_to_long(leak); - leakbytes = leak->value.lval; - } - } - - emalloc(leakbytes); -} diff --git a/Zend/zend_builtin_functions.h b/Zend/zend_builtin_functions.h deleted file mode 100644 index ddc2464d15..0000000000 --- a/Zend/zend_builtin_functions.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | Zend Engine | - +----------------------------------------------------------------------+ - | Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski | - +----------------------------------------------------------------------+ - | This source file is subject to version 0.91 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at | - | http://www.zend.com/license/0_91.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Andi Gutmans <andi@zend.com> | - | Zeev Suraski <zeev@zend.com> | - +----------------------------------------------------------------------+ -*/ - - -#ifndef _ZEND_BUILTIN_FUNCTIONS_H -#define _ZEND_BUILTIN_FUNCTIONS_H - -int zend_startup_builtin_functions(); - -#endif /* _ZEND_BUILTIN_FUNCTIONS_H */ diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c deleted file mode 100644 index 7863dd65ee..0000000000 --- a/Zend/zend_compile.c +++ /dev/null @@ -1,2149 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | Zend Engine | - +----------------------------------------------------------------------+ - | Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski | - +----------------------------------------------------------------------+ - | This source file is subject to version 0.91 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at | - | http://www.zend.com/license/0_91.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Andi Gutmans <andi@zend.com> | - | Zeev Suraski <zeev@zend.com> | - +----------------------------------------------------------------------+ -*/ - - -#include "zend.h" -#include "zend_compile.h" -#include "zend_llist.h" -#include "zend_API.h" -#include "zend_variables.h" -#include "zend_operators.h" - - -ZEND_API zend_op_array *(*zend_compile_files)(int mark_as_ref CLS_DC, int file_count, ...); - - -#ifndef ZTS -ZEND_API zend_compiler_globals compiler_globals; -ZEND_API zend_executor_globals executor_globals; -#endif - - -#define SET_UNUSED(op) (op).op_type = IS_UNUSED - -static int is_not_internal_function(zend_function *function) -{ - return(function->type != ZEND_INTERNAL_FUNCTION); -} - - -static int is_not_internal_class(zend_class_entry *ce) -{ - return(ce->type != ZEND_INTERNAL_CLASS); -} - - -static void free_filename(void *p) -{ - efree(*((char **) p)); -} - - -static void build_runtime_defined_function_key(zval *result, zval *name, zend_op *opline) -{ - char lineno_buf[32]; - uint lineno_len; - char *filename; - - lineno_len = zend_sprintf(lineno_buf, "%d", opline->lineno); - if (opline->filename) { - filename = opline->filename; - } else { - filename = "-"; - } - - /* NULL, name length, filename length, line number length */ - result->value.str.len = 1+name->value.str.len+strlen(filename)+lineno_len+1; - result->value.str.val = (char *) emalloc(result->value.str.len+1); - sprintf(result->value.str.val, "%c%s%s%s", '\0', name->value.str.val, filename, lineno_buf); - result->type = IS_STRING; - result->refcount = 1; -} - - -void init_compiler(CLS_D ELS_DC) -{ - zend_stack_init(&CG(bp_stack)); - zend_stack_init(&CG(function_call_stack)); - zend_stack_init(&CG(switch_cond_stack)); - zend_stack_init(&CG(foreach_copy_stack)); - zend_stack_init(&CG(object_stack)); - CG(active_class_entry) = NULL; - zend_llist_init(&CG(list_llist), sizeof(list_llist_element), NULL, 0); - zend_llist_init(&CG(dimension_llist), sizeof(int), NULL, 0); - zend_llist_init(&CG(filenames_list), sizeof(char *), free_filename, 0); - CG(short_tags) = ZEND_UV(short_tags); - CG(asp_tags) = ZEND_UV(asp_tags); - CG(handle_op_arrays) = 1; - zend_hash_apply(&module_registry, (int (*)(void *)) module_registry_request_startup); - init_resource_list(ELS_C); - CG(unclean_shutdown) = 0; - zend_llist_init(&CG(open_files), sizeof(void *), zend_open_file_dtor, 0); -} - - -void shutdown_compiler(CLS_D) -{ - zend_stack_destroy(&CG(bp_stack)); - zend_stack_destroy(&CG(function_call_stack)); - zend_stack_destroy(&CG(switch_cond_stack)); - zend_stack_destroy(&CG(foreach_copy_stack)); - zend_stack_destroy(&CG(object_stack)); - zend_llist_destroy(&CG(filenames_list)); - zend_hash_apply(CG(function_table), (int (*)(void *)) is_not_internal_function); - zend_hash_apply(CG(class_table), (int (*)(void *)) is_not_internal_class); - zend_llist_destroy(&CG(open_files)); -} - - -ZEND_API char *zend_set_compiled_filename(char *new_compiled_filename) -{ - char *p = estrdup(new_compiled_filename); - CLS_FETCH(); - - zend_llist_add_element(&CG(filenames_list), &p); - CG(compiled_filename) = p; - return p; -} - - -ZEND_API void zend_restore_compiled_filename(char *original_compiled_filename) -{ - CLS_FETCH(); - - CG(compiled_filename) = original_compiled_filename; -} - -ZEND_API char *zend_get_compiled_filename() -{ - CLS_FETCH(); - - return CG(compiled_filename); -} - - -static int get_temporary_variable(zend_op_array *op_array) -{ - return (op_array->T)++; -} - - -void do_binary_op(int op, znode *result, znode *op1, znode *op2 CLS_DC) -{ - zend_op *opline = get_next_op(CG(active_op_array) CLS_CC); - - opline->opcode = op; - opline->result.op_type = IS_TMP_VAR; - opline->result.u.var = get_temporary_variable(CG(active_op_array)); - opline->op1 = *op1; - opline->op2 = *op2; - *result = opline->result; -} - - -void do_unary_op(int op, znode *result, znode *op1 CLS_DC) -{ - zend_op *opline = get_next_op(CG(active_op_array) CLS_CC); - - opline->opcode = op; - opline->result.op_type = IS_TMP_VAR; - opline->result.u.var = get_temporary_variable(CG(active_op_array)); - opline->op1 = *op1; - *result = opline->result; - SET_UNUSED(opline->op2); -} - - -void do_binary_assign_op(int op, znode *result, znode *op1, znode *op2 CLS_DC) -{ - zend_op *opline = get_next_op(CG(active_op_array) CLS_CC); - - opline->opcode = op; - opline->result.op_type = IS_VAR; - opline->result.u.EA.type = 0; - opline->result.u.var = get_temporary_variable(CG(active_op_array)); - opline->op1 = *op1; - opline->op2 = *op2; - *result = opline->result; -} - - - -void do_fetch_globals(znode *varname CLS_DC) -{ - if (!CG(active_op_array)->uses_globals - && varname->op_type == IS_CONST - && varname->u.constant.type == IS_STRING - && varname->u.constant.value.str.len == (sizeof("GLOBALS")-1) - && !memcmp(varname->u.constant.value.str.val, "GLOBALS", sizeof("GLOBALS")-1)) { - CG(active_op_array)->uses_globals = 1; - } -} - -void fetch_simple_variable_ex(znode *result, znode *varname, int bp, int op CLS_DC) -{ - zend_op opline; - zend_op *opline_ptr; - zend_llist *fetch_list_ptr; - - if (bp) { - opline_ptr = &opline; - init_op(opline_ptr CLS_CC); - } else { - opline_ptr = get_next_op(CG(active_op_array) CLS_CC); - } - - opline_ptr->opcode = op; - opline_ptr->result.op_type = IS_VAR; - opline_ptr->result.u.EA.type = 0; - opline_ptr->result.u.var = get_temporary_variable(CG(active_op_array)); - opline_ptr->op1 = *varname; - *result = opline_ptr->result; - SET_UNUSED(opline_ptr->op2); - opline_ptr->op2.u.fetch_type = ZEND_FETCH_LOCAL; - - if (bp) { - zend_stack_top(&CG(bp_stack), (void **) &fetch_list_ptr); - zend_llist_add_element(fetch_list_ptr, opline_ptr); - } -} - -void fetch_simple_variable(znode *result, znode *varname, int bp CLS_DC) -{ - /* the default mode must be Write, since fetch_simple_variable() is used to define function arguments */ - fetch_simple_variable_ex(result, varname, bp, ZEND_FETCH_W CLS_CC); -} - - -void fetch_array_begin(znode *result, znode *varname, znode *first_dim CLS_DC) -{ - fetch_simple_variable(result, varname, 1 CLS_CC); - - fetch_array_dim(result, result, first_dim CLS_CC); -} - - -void fetch_array_dim(znode *result, znode *parent, znode *dim CLS_DC) -{ - zend_op opline; - zend_llist *fetch_list_ptr; - - init_op(&opline CLS_CC); - opline.opcode = ZEND_FETCH_DIM_W; /* the backpatching routine assumes W */ - opline.result.op_type = IS_VAR; - opline.result.u.EA.type = 0; - opline.result.u.var = get_temporary_variable(CG(active_op_array)); - opline.op1 = *parent; - opline.op2 = *dim; - opline.extended_value = ZEND_FETCH_STANDARD; - *result = opline.result; - - zend_stack_top(&CG(bp_stack), (void **) &fetch_list_ptr); - zend_llist_add_element(fetch_list_ptr, &opline); -} - - -void do_print(znode *result, znode *arg CLS_DC) -{ - zend_op *opline = get_next_op(CG(active_op_array) CLS_CC); - - opline->result.op_type = IS_TMP_VAR; - opline->result.u.var = get_temporary_variable(CG(active_op_array)); - opline->opcode = ZEND_PRINT; - opline->op1 = *arg; - SET_UNUSED(opline->op2); - *result = opline->result; -} - - -void do_echo(znode *arg CLS_DC) -{ - zend_op *opline = get_next_op(CG(active_op_array) CLS_CC); - - opline->opcode = ZEND_ECHO; - opline->op1 = *arg; - SET_UNUSED(opline->op2); -} - - -void do_assign(znode *result, znode *variable, znode *value CLS_DC) -{ - zend_op *opline = get_next_op(CG(active_op_array) CLS_CC); - - opline->opcode = ZEND_ASSIGN; - opline->result.op_type = IS_VAR; - opline->result.u.EA.type = 0; - opline->result.u.var = get_temporary_variable(CG(active_op_array)); - opline->op1 = *variable; - opline->op2 = *value; - *result = opline->result; -} - - -void do_assign_ref(znode *result, znode *lvar, znode *rvar CLS_DC) -{ - zend_op *opline = get_next_op(CG(active_op_array) CLS_CC); - - opline->opcode = ZEND_ASSIGN_REF; - if (result) { - opline->result.op_type = IS_VAR; - opline->result.u.EA.type = 0; - opline->result.u.var = get_temporary_variable(CG(active_op_array)); - *result = opline->result; - } else { - SET_UNUSED(opline->result); - } - opline->op1 = *lvar; - opline->op2 = *rvar; -} - - -static inline void do_begin_loop(CLS_D) -{ - zend_brk_cont_element *brk_cont_element; - int parent; - - parent = CG(active_op_array)->current_brk_cont; - CG(active_op_array)->current_brk_cont = CG(active_op_array)->last_brk_cont; - brk_cont_element = get_next_brk_cont_element(CG(active_op_array)); - brk_cont_element->parent = parent; -} - - -static inline void do_end_loop(int cont_addr CLS_DC) -{ - CG(active_op_array)->brk_cont_array[CG(active_op_array)->current_brk_cont].cont = cont_addr; - CG(active_op_array)->brk_cont_array[CG(active_op_array)->current_brk_cont].brk = get_next_op_number(CG(active_op_array)); - CG(active_op_array)->current_brk_cont = CG(active_op_array)->brk_cont_array[CG(active_op_array)->current_brk_cont].parent; -} - - -void do_while_cond(znode *expr, znode *close_bracket_token CLS_DC) -{ - int while_cond_op_number = get_next_op_number(CG(active_op_array)); - zend_op *opline = get_next_op(CG(active_op_array) CLS_CC); - - opline->opcode = ZEND_JMPZ; - opline->op1 = *expr; - close_bracket_token->u.opline_num = while_cond_op_number; - SET_UNUSED(opline->op2); - - do_begin_loop(CLS_C); - INC_BPC(CG(active_op_array)); -} - - -void do_while_end(znode *while_token, znode *close_bracket_token CLS_DC) -{ - zend_op *opline = get_next_op(CG(active_op_array) CLS_CC); - - /* add unconditional jump */ - opline->opcode = ZEND_JMP; - opline->op1.u.opline_num = while_token->u.opline_num; - SET_UNUSED(opline->op1); - SET_UNUSED(opline->op2); - - /* update while's conditional jmp */ - CG(active_op_array)->opcodes[close_bracket_token->u.opline_num].op2.u.opline_num = get_next_op_number(CG(active_op_array)); - - do_end_loop(while_token->u.opline_num CLS_CC); - - DEC_BPC(CG(active_op_array)); -} - - -void do_for_cond(znode *expr, znode *second_semicolon_token CLS_DC) -{ - int for_cond_op_number = get_next_op_number(CG(active_op_array)); - zend_op *opline = get_next_op(CG(active_op_array) CLS_CC); - - opline->opcode = ZEND_JMPZNZ; - opline->result = *expr; /* the conditional expression */ - second_semicolon_token->u.opline_num = for_cond_op_number; - SET_UNUSED(opline->op1); - SET_UNUSED(opline->op2); -} - - -void do_for_before_statement(znode *cond_start, znode *second_semicolon_token CLS_DC) -{ - zend_op *opline = get_next_op(CG(active_op_array) CLS_CC); - - opline->opcode = ZEND_JMP; - opline->op1.u.opline_num = cond_start->u.opline_num; - CG(active_op_array)->opcodes[second_semicolon_token->u.opline_num].op1.u.opline_num = get_next_op_number(CG(active_op_array)); - SET_UNUSED(opline->op1); - SET_UNUSED(opline->op2); - - do_begin_loop(CLS_C); - - INC_BPC(CG(active_op_array)); -} - - -void do_for_end(znode *second_semicolon_token CLS_DC) -{ - zend_op *opline = get_next_op(CG(active_op_array) CLS_CC); - - opline->opcode = ZEND_JMP; - opline->op1.u.opline_num = second_semicolon_token->u.opline_num+1; - CG(active_op_array)->opcodes[second_semicolon_token->u.opline_num].op2.u.opline_num = get_next_op_number(CG(active_op_array)); - SET_UNUSED(opline->op1); - SET_UNUSED(opline->op2); - - do_end_loop(second_semicolon_token->u.opline_num+1 CLS_CC); - - DEC_BPC(CG(active_op_array)); -} - - -void do_pre_incdec(znode *result, znode *op1, int op CLS_DC) -{ - zend_op *opline = get_next_op(CG(active_op_array) CLS_CC); - - opline->opcode = op; - opline->result.op_type = IS_VAR; - opline->result.u.EA.type = 0; - opline->result.u.var = get_temporary_variable(CG(active_op_array)); - opline->op1 = *op1; - *result = opline->result; - SET_UNUSED(opline->op2); -} - - -void do_post_incdec(znode *result, znode *op1, int op CLS_DC) -{ - zend_op *opline = get_next_op(CG(active_op_array) CLS_CC); - - opline->opcode = op; - opline->result.op_type = IS_TMP_VAR; - opline->result.u.var = get_temporary_variable(CG(active_op_array)); - opline->op1 = *op1; - *result = opline->result; - SET_UNUSED(opline->op2); -} - - -void do_if_cond(znode *cond, znode *closing_bracket_token CLS_DC) -{ - int if_cond_op_number = get_next_op_number(CG(active_op_array)); - zend_op *opline = get_next_op(CG(active_op_array) CLS_CC); - - opline->opcode = ZEND_JMPZ; - opline->op1 = *cond; - closing_bracket_token->u.opline_num = if_cond_op_number; - SET_UNUSED(opline->op2); - INC_BPC(CG(active_op_array)); -} - - -void do_if_after_statement(znode *closing_bracket_token, unsigned char initialize CLS_DC) -{ - int if_end_op_number = get_next_op_number(CG(active_op_array)); - zend_op *opline = get_next_op(CG(active_op_array) CLS_CC); - zend_llist *jmp_list_ptr; - - opline->opcode = ZEND_JMP; - /* save for backpatching */ - if (initialize) { - zend_llist jmp_list; - - zend_llist_init(&jmp_list, sizeof(int), NULL, 0); - zend_stack_push(&CG(bp_stack), (void *) &jmp_list, sizeof(zend_llist)); - } - zend_stack_top(&CG(bp_stack), (void **) &jmp_list_ptr); - zend_llist_add_element(jmp_list_ptr, &if_end_op_number); - - CG(active_op_array)->opcodes[closing_bracket_token->u.opline_num].op2.u.opline_num = if_end_op_number+1; - SET_UNUSED(opline->op1); - SET_UNUSED(opline->op2); -} - - -void do_if_end(CLS_D) -{ - int next_op_number = get_next_op_number(CG(active_op_array)); - zend_llist *jmp_list_ptr; - zend_llist_element *le; - - zend_stack_top(&CG(bp_stack), (void **) &jmp_list_ptr); - for (le=jmp_list_ptr->head; le; le = le->next) { - CG(active_op_array)->opcodes[*((int *) le->data)].op1.u.opline_num = next_op_number; - } - zend_llist_destroy(jmp_list_ptr); - zend_stack_del_top(&CG(bp_stack)); - DEC_BPC(CG(active_op_array)); -} - - -void do_begin_variable_parse(CLS_D) -{ - zend_llist fetch_list; - - /* zend_llist_init(&fetch_list, sizeof(int), NULL, 0); - zend_stack_push(&CG(bp_stack), (void *) &fetch_list, sizeof(zend_llist));*/ - zend_llist_init(&fetch_list, sizeof(zend_op), NULL, 0); - zend_stack_push(&CG(bp_stack), (void *) &fetch_list, sizeof(zend_llist)); -} - - -void do_end_variable_parse(int type CLS_DC) -{ - zend_llist *fetch_list_ptr; - zend_llist_element *le; - zend_op *opline, *opline_ptr; - int last_temp_var=-1; - - zend_stack_top(&CG(bp_stack), (void **) &fetch_list_ptr); - - le = fetch_list_ptr->head; - - while (le) { - opline_ptr = (zend_op *)le->data; - opline = get_next_op(CG(active_op_array) CLS_CC); - memcpy(opline, opline_ptr, sizeof(zend_op)); - switch (type) { - case BP_VAR_R: - if (opline->opcode == ZEND_FETCH_DIM_W && opline->op2.op_type == IS_UNUSED) { - zend_error(E_COMPILE_ERROR, "Cannot use [] for reading"); - } - opline->opcode -= 3; - break; - case BP_VAR_W: - break; - case BP_VAR_RW: - opline->opcode += 3; - break; - case BP_VAR_IS: - opline->opcode += 6; /* 3+3 */ - } - le = le->next; - } - zend_llist_destroy(fetch_list_ptr); - zend_stack_del_top(&CG(bp_stack)); -} - - -void do_init_string(znode *result CLS_DC) -{ - zend_op *opline = get_next_op(CG(active_op_array) CLS_CC); - - opline->opcode = ZEND_INIT_STRING; - opline->result.op_type = IS_TMP_VAR; - opline->result.u.var = get_temporary_variable(CG(active_op_array)); - *result = opline->result; - SET_UNUSED(opline->op1); - SET_UNUSED(opline->op2); -} - - -void do_add_char(znode *result, znode *op1, znode *op2 CLS_DC) -{ - zend_op *opline = get_next_op(CG(active_op_array) CLS_CC); - - opline->opcode = ZEND_ADD_CHAR; - opline->op1 = *op1; - opline->op2 = *op2; - opline->op2.op_type = IS_CONST; - opline->result = opline->op1; - *result = opline->result; -} - - -void do_add_string(znode *result, znode *op1, znode *op2 CLS_DC) -{ - zend_op *opline = get_next_op(CG(active_op_array) CLS_CC); - - opline->opcode = ZEND_ADD_STRING; - opline->op1 = *op1; - opline->op2 = *op2; - opline->op2.op_type = IS_CONST; - opline->result = opline->op1; - *result = opline->result; -} - - -void do_add_variable(znode *result, znode *op1, znode *op2 CLS_DC) -{ - zend_op *opline; - - if (op1->op_type == IS_CONST) { - opline = get_next_op(CG(active_op_array) CLS_CC); - opline->opcode = ZEND_INIT_STRING; - opline->result.op_type = IS_TMP_VAR; - opline->result.u.var = get_temporary_variable(CG(active_op_array)); - *result = opline->result; - SET_UNUSED(opline->op1); - SET_UNUSED(opline->op2); - - if (op1->u.constant.value.str.len>0) { - opline = get_next_op(CG(active_op_array) CLS_CC); - opline->opcode = ZEND_ADD_STRING; - opline->result = *result; - opline->op1 = *result; - opline->op2 = *op1; - opline->result = opline->op1; - } else { - zval_dtor(&op1->u.constant); - } - } else { - *result = *op1; - } - - opline = get_next_op(CG(active_op_array) CLS_CC); - opline->opcode = ZEND_ADD_VAR; - opline->result = *result; - opline->op1 = *result; - opline->op2 = *op2; - *result = opline->result; -} - - -void do_free(znode *op1 CLS_DC) -{ - if (op1->op_type==IS_TMP_VAR) { - zend_op *opline = get_next_op(CG(active_op_array) CLS_CC); - - opline->opcode = ZEND_FREE; - opline->op1 = *op1; - SET_UNUSED(opline->op2); - } else if (op1->op_type==IS_VAR) { - zend_op *opline = &CG(active_op_array)->opcodes[CG(active_op_array)->last-1]; - - if (opline->result.op_type == op1->op_type - && opline->result.u.var == op1->u.var) { - opline->result.u.EA.type |= EXT_TYPE_UNUSED; - } else { - /* This should be an object instanciation - * Find JMP_NO_CTOR, mark the preceding ASSIGN and the - * proceeding INIT_FCALL_BY_NAME as unused - */ - while (opline>CG(active_op_array)->opcodes) { - if (opline->opcode == ZEND_JMP_NO_CTOR) { - (opline-1)->result.u.EA.type |= EXT_TYPE_UNUSED; - (opline+1)->op1.u.EA.type |= EXT_TYPE_UNUSED; - break; - } - opline--; - } - } - } -} - - -void do_begin_function_declaration(znode *function_token, znode *function_name, int is_method CLS_DC) -{ - zend_op_array op_array; - char *name = function_name->u.constant.value.str.val; - int name_len = function_name->u.constant.value.str.len; - int function_begin_line = function_token->u.opline_num; - - function_token->u.op_array = CG(active_op_array); - zend_str_tolower(name, name_len); - - init_op_array(&op_array, INITIAL_OP_ARRAY_SIZE); - op_array.function_name = name; - op_array.arg_types = NULL; - - if (is_method) { - zend_hash_update(&CG(active_class_entry)->function_table, name, name_len+1, &op_array, sizeof(zend_op_array), (void **) &CG(active_op_array)); - } else { - zend_op *opline = get_next_op(CG(active_op_array) CLS_CC); - - opline->opcode = ZEND_DECLARE_FUNCTION_OR_CLASS; - opline->op1.op_type = IS_CONST; - build_runtime_defined_function_key(&opline->op1.u.constant, &function_name->u.constant, opline); - opline->op2.op_type = IS_CONST; - opline->op2.u.constant.type = IS_STRING; - opline->op2.u.constant.value.str.val = estrndup(name, name_len); - opline->op2.u.constant.value.str.len = name_len; - opline->op2.u.constant.refcount = 1; - opline->extended_value = ZEND_DECLARE_FUNCTION; - zend_hash_update(CG(function_table), opline->op1.u.constant.value.str.val, opline->op1.u.constant.value.str.len, &op_array, sizeof(zend_op_array), (void **) &CG(active_op_array)); - } - - if (CG(extended_info)) { - zend_op *opline = get_next_op(CG(active_op_array) CLS_CC); - - opline->opcode = ZEND_EXT_NOP; - opline->lineno = function_begin_line; - SET_UNUSED(opline->op1); - SET_UNUSED(opline->op2); - } - - { - /* Push a seperator to the switch and foreach stacks */ - zend_switch_entry switch_entry; - - switch_entry.cond.op_type = IS_UNUSED; - switch_entry.default_case = 0; - switch_entry.control_var = 0; - - zend_stack_push(&CG(switch_cond_stack), (void *) &switch_entry, sizeof(switch_entry)); - - zend_stack_push(&CG(foreach_copy_stack), (void *) &switch_entry.cond, sizeof(znode)); - } -} - - -void do_end_function_declaration(znode *function_token CLS_DC) -{ - pass_two(CG(active_op_array)); - CG(active_op_array) = function_token->u.op_array; - - /* Pop the switch and foreach seperators */ - zend_stack_del_top(&CG(switch_cond_stack)); - zend_stack_del_top(&CG(foreach_copy_stack)); -} - - -void do_receive_arg(int op, znode *var, znode *offset, znode *initialization, unsigned char pass_type CLS_DC) -{ - zend_op *opline = get_next_op(CG(active_op_array) CLS_CC); - - opline->opcode = op; - opline->result = *var; - opline->op1 = *offset; - if ((op == ZEND_RECV_INIT) && initialization) { - opline->op2 = *initialization; - } else { - SET_UNUSED(opline->op2); - } - if (pass_type==BYREF_FORCE && !CG(active_op_array)->arg_types) { - int i; - - CG(active_op_array)->arg_types = (unsigned char *) emalloc(sizeof(unsigned char)*(offset->u.constant.value.lval+1)); - for (i=1; i<offset->u.constant.value.lval; i++) { - CG(active_op_array)->arg_types[i] = BYREF_NONE; - } - CG(active_op_array)->arg_types[0]=(unsigned char) offset->u.constant.value.lval; - } - if (CG(active_op_array)->arg_types) { - CG(active_op_array)->arg_types = (unsigned char *) erealloc(CG(active_op_array)->arg_types, sizeof(unsigned char)*(offset->u.constant.value.lval+1)); - CG(active_op_array)->arg_types[offset->u.constant.value.lval] = pass_type; - CG(active_op_array)->arg_types[0]++; - } -} - - -int do_begin_function_call(znode *function_name CLS_DC) -{ - zend_function *function; - - zend_str_tolower(function_name->u.constant.value.str.val, function_name->u.constant.value.str.len); - if (zend_hash_find(CG(function_table), function_name->u.constant.value.str.val,function_name->u.constant.value.str.len+1, (void **) &function)==FAILURE) { - znode tmp = *function_name; - - zval_copy_ctor(&tmp.u.constant); - do_begin_dynamic_function_call(&tmp CLS_CC); - return 1; /* Dynamic */ - } - - switch (function->type) { - case ZEND_USER_FUNCTION: { - zend_op_array *op_array = (zend_op_array *) function; - - zend_stack_push(&CG(function_call_stack), (void *) &op_array, sizeof(zend_function *)); - } - break; - case ZEND_INTERNAL_FUNCTION: { - zend_internal_function *internal_function = (zend_internal_function *) function; - - zend_stack_push(&CG(function_call_stack), (void *) &internal_function, sizeof(zend_function *)); - } - break; - } - return 0; -} - - -void do_begin_dynamic_function_call(znode *function_name CLS_DC) -{ - unsigned char *ptr = NULL; - int last_op_number = get_next_op_number(CG(active_op_array))-1; - - if (last_op_number>=0 && CG(active_op_array)->opcodes[last_op_number].opcode == ZEND_FETCH_OBJ_R) { - CG(active_op_array)->opcodes[last_op_number].opcode = ZEND_INIT_FCALL_BY_NAME; - CG(active_op_array)->opcodes[last_op_number].extended_value = ZEND_MEMBER_FUNC_CALL; - } else { - zend_op *opline = get_next_op(CG(active_op_array) CLS_CC); - - opline->opcode = ZEND_INIT_FCALL_BY_NAME; - opline->op2 = *function_name; - opline->extended_value = 0; - SET_UNUSED(opline->op1); - } - zend_stack_push(&CG(function_call_stack), (void *) &ptr, sizeof(zend_function *)); -} - - -void do_begin_class_member_function_call(znode *class_name, znode *function_name CLS_DC) -{ - unsigned char *ptr = NULL; - zend_op *opline = get_next_op(CG(active_op_array) CLS_CC); - - opline->opcode = ZEND_INIT_FCALL_BY_NAME; - zend_str_tolower(class_name->u.constant.value.str.val, class_name->u.constant.value.str.len); - opline->op1 = *class_name; - opline->op2 = *function_name; - opline->extended_value = ZEND_MEMBER_FUNC_CALL; - zval_copy_ctor(&opline->op2.u.constant); - zend_stack_push(&CG(function_call_stack), (void *) &ptr, sizeof(zend_function *)); -} - - -void do_end_function_call(znode *function_name, znode *result, znode *argument_list, int is_method, int is_dynamic_fcall CLS_DC) -{ - zend_op *opline = get_next_op(CG(active_op_array) CLS_CC); - ELS_FETCH(); - - if (function_name->op_type==IS_CONST && !is_method && !is_dynamic_fcall) { - opline->opcode = ZEND_DO_FCALL; - } else { - opline->opcode = ZEND_DO_FCALL_BY_NAME; - } - opline->op1 = *function_name; - opline->result.u.var = get_temporary_variable(CG(active_op_array)); - opline->result.op_type = IS_TMP_VAR; - *result = opline->result; - SET_UNUSED(opline->op2); - opline->op2.u.constant.value.lval = is_method; - zend_stack_del_top(&CG(function_call_stack)); - opline->extended_value = argument_list->u.constant.value.lval; -} - - -void do_pass_param(znode *param, int op, int offset CLS_DC) -{ - zend_op *opline; - unsigned char *arg_types; - int original_op=op; - zend_function **function_ptr_ptr, *function_ptr; - - zend_stack_top(&CG(function_call_stack), (void **) &function_ptr_ptr); - function_ptr = *function_ptr_ptr; - if (function_ptr) { - arg_types = function_ptr->common.arg_types; - } else { - arg_types = NULL; - } - - if (op == ZEND_SEND_VAL) { - switch (param->op_type) { - case IS_CONST: /* constants behave like variables when passed to functions, - * as far as reference counting is concerned. Treat them - * as if they were variables here. - */ - case IS_VAR: - op = ZEND_SEND_VAR; - break; - } - } - if (arg_types && offset<=arg_types[0] - && arg_types[offset]==BYREF_FORCE) { - /* change to passing by reference */ - switch (param->op_type) { - case IS_VAR: - op = ZEND_SEND_REF; - break; - default: - zend_error(E_COMPILE_ERROR, "Only variables can be passed by reference"); - break; - } - } - - if (original_op==ZEND_SEND_VAR) { - switch(op) { - case ZEND_SEND_VAR: - if (function_ptr) { - do_end_variable_parse(BP_VAR_R CLS_CC); - } else { - do_end_variable_parse(BP_VAR_W CLS_CC); - } - break; - case ZEND_SEND_REF: - do_end_variable_parse(BP_VAR_W CLS_CC); - break; - } - } - - opline = get_next_op(CG(active_op_array) CLS_CC); - if (function_ptr) { - opline->extended_value = ZEND_DO_FCALL; - } else { - opline->extended_value = ZEND_DO_FCALL_BY_NAME; - } - opline->opcode = op; - opline->op1 = *param; - opline->op2.u.opline_num = offset; - SET_UNUSED(opline->op2); -} - - -static int generate_free_switch_expr(zend_switch_entry *switch_entry CLS_DC) -{ - zend_op *opline; - - if (switch_entry->cond.op_type == IS_UNUSED) { - return 1; - } - - opline = get_next_op(CG(active_op_array) CLS_CC); - - opline->opcode = ZEND_SWITCH_FREE; - opline->op1 = switch_entry->cond; - SET_UNUSED(opline->op2); - return 0; -} - -static int generate_free_foreach_copy(znode *foreach_copy CLS_DC) -{ - zend_op *opline; - - if (foreach_copy->op_type == IS_UNUSED) { - return 1; - } - - opline = get_next_op(CG(active_op_array) CLS_CC); - - opline->opcode = ZEND_FREE; - opline->op1 = *foreach_copy; - SET_UNUSED(opline->op2); - return 0; -} - -void do_return(znode *expr CLS_DC) -{ - zend_op *opline; - -#ifdef ZTS - zend_stack_apply_with_argument(&CG(switch_cond_stack), (int (*)(void *element, void *)) generate_free_switch_expr, ZEND_STACK_APPLY_TOPDOWN CLS_CC); - zend_stack_apply_with_argument(&CG(foreach_copy_stack), (int (*)(void *element, void *)) generate_free_foreach_copy, ZEND_STACK_APPLY_TOPDOWN CLS_CC); -#else - zend_stack_apply(&CG(switch_cond_stack), (int (*)(void *element)) generate_free_switch_expr, ZEND_STACK_APPLY_TOPDOWN); - zend_stack_apply(&CG(foreach_copy_stack), (int (*)(void *element)) generate_free_foreach_copy, ZEND_STACK_APPLY_TOPDOWN); -#endif - - opline = get_next_op(CG(active_op_array) CLS_CC); - - opline->opcode = ZEND_RETURN; - if (expr) { - opline->op1 = *expr; - } else { - var_uninit(&opline->op1.u.constant); - opline->op1.op_type = IS_CONST; - INIT_PZVAL(&opline->op1.u.constant); - } - SET_UNUSED(opline->op2); -} - - -static void function_add_ref(zend_function *function) -{ - if (function->type == ZEND_USER_FUNCTION) { - (*((zend_op_array *) function)->refcount)++; - } -} - - -static void do_inherit_parent_constructor(zend_class_entry *ce) -{ - if (ce->parent - && !zend_hash_exists(&ce->function_table, ce->name, ce->name_length+1)) { - zend_function *function; - - if (zend_hash_find(&ce->parent->function_table, ce->parent->name, ce->parent->name_length+1, (void **) &function)==SUCCESS) { - /* inherit parent's constructor */ - zend_hash_update(&ce->function_table, ce->name, ce->name_length+1, function, sizeof(zend_function), NULL); - function_add_ref(function); - } - } -} - - -ZEND_API int do_bind_function_or_class(zend_op *opline, HashTable *function_table, HashTable *class_table, int compile_time) -{ - switch (opline->extended_value) { - case ZEND_DECLARE_FUNCTION: { - zend_function *function; - - zend_hash_find(function_table, opline->op1.u.constant.value.str.val, opline->op1.u.constant.value.str.len, (void **) &function); - (*function->op_array.refcount)++; - if (zend_hash_add(function_table, opline->op2.u.constant.value.str.val, opline->op2.u.constant.value.str.len+1, function, sizeof(zend_function), NULL)==FAILURE) { - if (!compile_time) { - zend_error(E_ERROR, "Cannot redeclare %s()", opline->op2.u.constant.value.str.val); - } - return FAILURE; - } else { - return SUCCESS; - } - } - break; - case ZEND_DECLARE_CLASS: { - zend_class_entry *ce; - - zend_hash_find(class_table, opline->op1.u.constant.value.str.val, opline->op1.u.constant.value.str.len, (void **) &ce); - (*ce->refcount)++; - if (zend_hash_add(class_table, opline->op2.u.constant.value.str.val, opline->op2.u.constant.value.str.len+1, ce, sizeof(zend_class_entry), NULL)==FAILURE) { - (*ce->refcount)--; - if (!compile_time) { - zend_error(E_ERROR, "Cannot redeclare class %s", opline->op2.u.constant.value.str.val); - } - return FAILURE; - } else { - return SUCCESS; - } - } - break; - case ZEND_DECLARE_INHERITED_CLASS: { - zend_class_entry *ce, *parent_ce; - char *class_name, *parent_name; - zend_function tmp_zend_function; - zval *tmp; - - zend_hash_find(class_table, opline->op1.u.constant.value.str.val, opline->op1.u.constant.value.str.len, (void **) &ce); - (*ce->refcount)++; - - /* Restore base class / derived class names */ - parent_name = opline->op2.u.constant.value.str.val; - class_name = strchr(opline->op2.u.constant.value.str.val, ':'); - if (!class_name) { - zend_error(E_CORE_ERROR, "Invalid runtime class entry"); - } - *class_name++ = 0; - - /* Obtain parent class */ - if (zend_hash_find(class_table, parent_name, strlen(parent_name)+1, (void **) &parent_ce)==FAILURE) { - if (!compile_time) { - zend_error(E_ERROR, "Class %s: Cannot inherit from undefined class %s", class_name, parent_name); - } - (*ce->refcount)--; - *(class_name-1) = ':'; - return FAILURE; - } - - /* Perform inheritence */ - zend_hash_merge(&ce->default_properties, &parent_ce->default_properties, (void (*)(void *)) zval_add_ref, (void *) &tmp, sizeof(zval *), 0); - zend_hash_merge(&ce->function_table, &parent_ce->function_table, (void (*)(void *)) function_add_ref, &tmp_zend_function, sizeof(zend_function), 0); - ce->parent = parent_ce; - do_inherit_parent_constructor(ce); - - /* Register the derived class */ - if (zend_hash_add(class_table, class_name, strlen(class_name)+1, ce, sizeof(zend_class_entry), NULL)==FAILURE) { - if (!compile_time) { - zend_error(E_ERROR, "Cannot redeclare class %s", opline->op2.u.constant.value.str.val); - } - (*ce->refcount)--; - zend_hash_destroy(&ce->function_table); - zend_hash_destroy(&ce->default_properties); - return FAILURE; - } - return SUCCESS; - } - break; - } - return FAILURE; -} - - -void do_early_binding(CLS_D) -{ - zend_op *opline = &CG(active_op_array)->opcodes[CG(active_op_array)->last-1]; - HashTable *table; - - if (do_bind_function_or_class(opline, CG(function_table), CG(class_table), 1)==FAILURE) { - return; - } - switch (opline->extended_value) { - case ZEND_DECLARE_FUNCTION: - table = CG(function_table); - break; - case ZEND_DECLARE_CLASS: - table = CG(class_table); - break; - default: - zend_error(E_COMPILE_ERROR, "Invalid binding type"); - return; - } - zend_hash_del(table, opline->op1.u.constant.value.str.val, opline->op1.u.constant.value.str.len); - zval_dtor(&opline->op1.u.constant); - zval_dtor(&opline->op2.u.constant); - opline->opcode = ZEND_NOP; - SET_UNUSED(opline->op1); - SET_UNUSED(opline->op2); -} - - -void do_boolean_or_begin(znode *expr1, znode *op_token CLS_DC) -{ - int next_op_number = get_next_op_number(CG(active_op_array)); - zend_op *opline = get_next_op(CG(active_op_array) CLS_CC); - - opline->opcode = ZEND_JMPNZ_EX; - if (expr1->op_type == IS_TMP_VAR) { - opline->result = *expr1; - } else { - opline->result.u.var = get_temporary_variable(CG(active_op_array)); - opline->result.op_type = IS_TMP_VAR; - } - opline->op1 = *expr1; - SET_UNUSED(opline->op2); - - op_token->u.opline_num = next_op_number; - - *expr1 = opline->result; -} - - -void do_boolean_or_end(znode *result, znode *expr1, znode *expr2, znode *op_token CLS_DC) -{ - zend_op *opline = get_next_op(CG(active_op_array) CLS_CC); - - *result = *expr1; /* we saved the original result in expr1 */ - opline->opcode = ZEND_BOOL; - opline->result = *result; - opline->op1 = *expr2; - SET_UNUSED(opline->op2); - - CG(active_op_array)->opcodes[op_token->u.opline_num].op2.u.opline_num = get_next_op_number(CG(active_op_array)); -} - - -void do_boolean_and_begin(znode *expr1, znode *op_token CLS_DC) -{ - int next_op_number = get_next_op_number(CG(active_op_array)); - zend_op *opline = get_next_op(CG(active_op_array) CLS_CC); - - opline->opcode = ZEND_JMPZ_EX; - if (expr1->op_type == IS_TMP_VAR) { - opline->result = *expr1; - } else { - opline->result.u.var = get_temporary_variable(CG(active_op_array)); - opline->result.op_type = IS_TMP_VAR; - } - opline->op1 = *expr1; - SET_UNUSED(opline->op2); - - op_token->u.opline_num = next_op_number; - - *expr1 = opline->result; -} - - -void do_boolean_and_end(znode *result, znode *expr1, znode *expr2, znode *op_token CLS_DC) -{ - zend_op *opline = get_next_op(CG(active_op_array) CLS_CC); - - *result = *expr1; /* we saved the original result in expr1 */ - opline->opcode = ZEND_BOOL; - opline->result = *result; - opline->op1 = *expr2; - SET_UNUSED(opline->op2); - - CG(active_op_array)->opcodes[op_token->u.opline_num].op2.u.opline_num = get_next_op_number(CG(active_op_array)); -} - - -void do_do_while_begin(CLS_D) -{ - do_begin_loop(CLS_C); - INC_BPC(CG(active_op_array)); -} - - -void do_do_while_end(znode *do_token, znode *expr CLS_DC) -{ - zend_op *opline = get_next_op(CG(active_op_array) CLS_CC); - - opline->opcode = ZEND_JMPNZ; - opline->op1 = *expr; - opline->op2.u.opline_num = do_token->u.opline_num; - SET_UNUSED(opline->op2); - - do_end_loop(do_token->u.opline_num CLS_CC); - - DEC_BPC(CG(active_op_array)); -} - - -void do_brk_cont(int op, znode *expr CLS_DC) -{ - zend_op *opline = get_next_op(CG(active_op_array) CLS_CC); - - opline->opcode = op; - opline->op1.u.opline_num = CG(active_op_array)->current_brk_cont; - SET_UNUSED(opline->op1); - if (expr) { - opline->op2 = *expr; - } else { - opline->op2.u.constant.type = IS_LONG; - opline->op2.u.constant.value.lval = 1; - INIT_PZVAL(&opline->op2.u.constant); - opline->op2.op_type = IS_CONST; - } -} - - -void do_switch_cond(znode *cond CLS_DC) -{ - zend_switch_entry switch_entry; - zend_op *opline = &CG(active_op_array)->opcodes[CG(active_op_array)->last-1]; - - switch_entry.cond = *cond; - switch_entry.default_case = -1; - switch_entry.control_var = -1; - zend_stack_push(&CG(switch_cond_stack), (void *) &switch_entry, sizeof(switch_entry)); - - if (opline->result.op_type == IS_VAR) { - opline->result.u.EA.type |= EXT_TYPE_UNUSED; - } - - do_begin_loop(CLS_C); - - INC_BPC(CG(active_op_array)); -} - - - -void do_switch_end(znode *case_list CLS_DC) -{ - zend_op *opline; - zend_switch_entry *switch_entry_ptr; - - zend_stack_top(&CG(switch_cond_stack), (void **) &switch_entry_ptr); - - if (case_list->u.opline_num != -1) { /* empty switch */ - int next_op_number = get_next_op_number(CG(active_op_array)); - - CG(active_op_array)->opcodes[case_list->u.opline_num].op1.u.opline_num = next_op_number; - } - - /* add code to jmp to default case */ - if (switch_entry_ptr->default_case != -1) { - opline = get_next_op(CG(active_op_array) CLS_CC); - opline->opcode = ZEND_JMPZ; - opline->op1.op_type = IS_TMP_VAR; - opline->op1.u.var = switch_entry_ptr->control_var; - opline->op2.u.opline_num = switch_entry_ptr->default_case; - SET_UNUSED(opline->op2); - } - - - /* remember break/continue loop information */ - CG(active_op_array)->brk_cont_array[CG(active_op_array)->current_brk_cont].cont = CG(active_op_array)->brk_cont_array[CG(active_op_array)->current_brk_cont].brk = get_next_op_number(CG(active_op_array)); - CG(active_op_array)->current_brk_cont = CG(active_op_array)->brk_cont_array[CG(active_op_array)->current_brk_cont].parent; - - /* emit free for the switch condition*/ - opline = get_next_op(CG(active_op_array) CLS_CC); - opline->opcode = ZEND_SWITCH_FREE; - opline->op1 = switch_entry_ptr->cond; - SET_UNUSED(opline->op2); - if (switch_entry_ptr->cond.op_type == IS_CONST) { - zval_dtor(&switch_entry_ptr->cond.u.constant); - } - - zend_stack_del_top(&CG(switch_cond_stack)); - - DEC_BPC(CG(active_op_array)); -} - - -void do_case_before_statement(znode *case_list, znode *case_token, znode *case_expr CLS_DC) -{ - zend_op *opline = get_next_op(CG(active_op_array) CLS_CC); - int next_op_number; - zend_switch_entry *switch_entry_ptr; - znode result; - - zend_stack_top(&CG(switch_cond_stack), (void **) &switch_entry_ptr); - - opline->opcode = ZEND_CASE; - if (switch_entry_ptr->control_var==-1) { - switch_entry_ptr->control_var = get_temporary_variable(CG(active_op_array)); - } - opline->result.u.var = switch_entry_ptr->control_var; - opline->result.op_type = IS_TMP_VAR; - opline->op1 = switch_entry_ptr->cond; - opline->op2 = *case_expr; - if (opline->op1.op_type == IS_CONST) { - zval_copy_ctor(&opline->op1.u.constant); - } - result = opline->result; - - next_op_number = get_next_op_number(CG(active_op_array)); - opline = get_next_op(CG(active_op_array) CLS_CC); - opline->opcode = ZEND_JMPZ; - opline->op1 = result; - SET_UNUSED(opline->op2); - case_token->u.opline_num = next_op_number; - - if (case_list->u.opline_num==-1) { - return; - } - next_op_number = get_next_op_number(CG(active_op_array)); - CG(active_op_array)->opcodes[case_list->u.opline_num].op1.u.opline_num = next_op_number; -} - - -void do_case_after_statement(znode *result, znode *case_token CLS_DC) -{ - int next_op_number = get_next_op_number(CG(active_op_array)); - zend_op *opline = get_next_op(CG(active_op_array) CLS_CC); - - opline->opcode = ZEND_JMP; - SET_UNUSED(opline->op1); - SET_UNUSED(opline->op2); - result->u.opline_num = next_op_number; - - switch (CG(active_op_array)->opcodes[case_token->u.opline_num].opcode) { - case ZEND_JMP: - CG(active_op_array)->opcodes[case_token->u.opline_num].op1.u.opline_num = get_next_op_number(CG(active_op_array)); - break; - case ZEND_JMPZ: - CG(active_op_array)->opcodes[case_token->u.opline_num].op2.u.opline_num = get_next_op_number(CG(active_op_array)); - break; - } -} - - - -void do_default_before_statement(znode *case_list, znode *default_token CLS_DC) -{ - int next_op_number = get_next_op_number(CG(active_op_array)); - zend_op *opline = get_next_op(CG(active_op_array) CLS_CC); - zend_switch_entry *switch_entry_ptr; - - zend_stack_top(&CG(switch_cond_stack), (void **) &switch_entry_ptr); - - opline->opcode = ZEND_JMP; - SET_UNUSED(opline->op1); - SET_UNUSED(opline->op2); - default_token->u.opline_num = next_op_number; - - next_op_number = get_next_op_number(CG(active_op_array)); - opline = get_next_op(CG(active_op_array) CLS_CC); - opline->opcode = ZEND_BOOL; - if (switch_entry_ptr->control_var==-1) { - switch_entry_ptr->control_var = get_temporary_variable(CG(active_op_array)); - } - opline->result.u.var = switch_entry_ptr->control_var; - opline->result.op_type = IS_TMP_VAR; - opline->op1.op_type = IS_CONST; - opline->op1.u.constant.type = IS_LONG; - opline->op1.u.constant.value.lval = 1; - INIT_PZVAL(&opline->op1.u.constant); - SET_UNUSED(opline->op2); - switch_entry_ptr->default_case = next_op_number; - - next_op_number = get_next_op_number(CG(active_op_array)); - if (case_list->u.opline_num==-1) { - return; - } - CG(active_op_array)->opcodes[case_list->u.opline_num].op1.u.opline_num = next_op_number; -} - - -void do_begin_class_declaration(znode *class_name, znode *parent_class_name CLS_DC) -{ - zend_op *opline = get_next_op(CG(active_op_array) CLS_CC); - int runtime_inheritence = 0; - - if (CG(active_class_entry)) { - zend_error(E_COMPILE_ERROR, "Class declarations may not be nested"); - return; - } - CG(class_entry).type = ZEND_USER_CLASS; - CG(class_entry).name = class_name->u.constant.value.str.val; - CG(class_entry).name_length = class_name->u.constant.value.str.len; - CG(class_entry).refcount = (int *) emalloc(sizeof(int)); - *CG(class_entry).refcount = 1; - - zend_str_tolower(CG(class_entry).name, CG(class_entry).name_length); - - zend_hash_init(&CG(class_entry).function_table, 10, NULL, ZEND_FUNCTION_DTOR, 0); - zend_hash_init(&CG(class_entry).default_properties, 10, NULL, PVAL_PTR_DTOR, 0); - - /* code for inheritance from parent class */ - if (parent_class_name) { - zend_class_entry *parent_class; - zend_function tmp_zend_function; - zval *tmp; - - zend_str_tolower(parent_class_name->u.constant.value.str.val, parent_class_name->u.constant.value.str.len); - - if (zend_hash_find(CG(class_table), parent_class_name->u.constant.value.str.val, parent_class_name->u.constant.value.str.len+1, (void **) &parent_class)==SUCCESS) { - /* copy functions */ - zend_hash_copy(&CG(class_entry).function_table, &parent_class->function_table, (void (*)(void *)) function_add_ref, &tmp_zend_function, sizeof(zend_function)); - - /* copy default properties */ - zend_hash_copy(&CG(class_entry).default_properties, &parent_class->default_properties, (void (*)(void *)) zval_add_ref, (void *) &tmp, sizeof(zval *)); - - CG(class_entry).parent = parent_class; - - zval_dtor(&parent_class_name->u.constant); - } else { - runtime_inheritence = 1; - CG(class_entry).parent = NULL; - } - } else { - CG(class_entry).parent = NULL; - } - - CG(class_entry).handle_function_call = NULL; - CG(class_entry).handle_property_set = NULL; - CG(class_entry).handle_property_get = NULL; - - opline->opcode = ZEND_DECLARE_FUNCTION_OR_CLASS; - opline->op1.op_type = IS_CONST; - build_runtime_defined_function_key(&opline->op1.u.constant, &class_name->u.constant, opline); - opline->op2.op_type = IS_CONST; - opline->op2.u.constant.type = IS_STRING; - opline->op2.u.constant.refcount = 1; - if (runtime_inheritence) { - char *full_class_name; - - opline->op2.u.constant.value.str.len = parent_class_name->u.constant.value.str.len+1+CG(class_entry).name_length; - full_class_name = opline->op2.u.constant.value.str.val = (char *) emalloc(opline->op2.u.constant.value.str.len+1); - - memcpy(full_class_name, parent_class_name->u.constant.value.str.val, parent_class_name->u.constant.value.str.len); - full_class_name += parent_class_name->u.constant.value.str.len; - full_class_name[0] = ':'; - full_class_name++; - memcpy(full_class_name, CG(class_entry).name, CG(class_entry).name_length); - zval_dtor(&parent_class_name->u.constant); - full_class_name += CG(class_entry).name_length; - full_class_name[0] = 0; - opline->extended_value = ZEND_DECLARE_INHERITED_CLASS; - } else { - opline->op2.u.constant.value.str.val = estrndup(CG(class_entry).name, CG(class_entry).name_length); - opline->op2.u.constant.value.str.len = CG(class_entry).name_length; - opline->extended_value = ZEND_DECLARE_CLASS; - } - - zend_hash_update(CG(class_table), opline->op1.u.constant.value.str.val, opline->op1.u.constant.value.str.len, &CG(class_entry), sizeof(zend_class_entry), (void **) &CG(active_class_entry)); -} - - -void do_end_class_declaration(CLS_D) -{ - do_inherit_parent_constructor(CG(active_class_entry)); - CG(active_class_entry) = NULL; -} - - -void do_declare_property(znode *var_name, znode *value CLS_DC) -{ - if (value) { - zval *property = (zval *) emalloc(sizeof(zval)); - - *property = value->u.constant; - zend_hash_update(&CG(active_class_entry)->default_properties, var_name->u.constant.value.str.val, var_name->u.constant.value.str.len+1, &property, sizeof(zval *), NULL); - } - FREE_PNODE(var_name); -} - - -void do_fetch_property(znode *result, znode *object, znode *property CLS_DC) -{ - zend_op opline; - zend_llist *fetch_list_ptr; - - init_op(&opline CLS_CC); - opline.opcode = ZEND_FETCH_OBJ_W; /* the backpatching routine assumes W */ - opline.result.op_type = IS_VAR; - opline.result.u.EA.type = 0; - opline.result.u.var = get_temporary_variable(CG(active_op_array)); - opline.op1 = *object; - opline.op2 = *property; - *result = opline.result; - - zend_stack_top(&CG(bp_stack), (void **) &fetch_list_ptr); - zend_llist_add_element(fetch_list_ptr, &opline); -} - - -void do_push_object(znode *object CLS_DC) -{ - zend_stack_push(&CG(object_stack), object, sizeof(znode)); -} - - -void do_pop_object(znode *object CLS_DC) -{ - znode *tmp; - - zend_stack_top(&CG(object_stack), (void **) &tmp); - *object = *tmp; - zend_stack_del_top(&CG(object_stack)); -} - - -void do_begin_new_object(znode *new_token, znode *class_name CLS_DC) -{ - zend_op *opline = get_next_op(CG(active_op_array) CLS_CC); - unsigned char *ptr = NULL; - - opline->opcode = ZEND_NEW; - opline->result.op_type = IS_TMP_VAR; - opline->result.u.var = get_temporary_variable(CG(active_op_array)); - opline->op1 = *class_name; - SET_UNUSED(opline->op2); - - /* *result = opline->result; - do_assign(result, variable, &opline->result CLS_CC); */ - - - new_token->u.opline_num = get_next_op_number(CG(active_op_array)); - opline = get_next_op(CG(active_op_array) CLS_CC); - opline->opcode = ZEND_JMP_NO_CTOR; - opline->op1 = (opline-1)->result; - SET_UNUSED(opline->op2); - - if (class_name->op_type == IS_CONST) { - zval_copy_ctor(&class_name->u.constant); - } - opline = get_next_op(CG(active_op_array) CLS_CC); - opline->opcode = ZEND_INIT_FCALL_BY_NAME; - opline->op1 = (opline-2)->result; - opline->op2 = *class_name; - opline->extended_value = ZEND_MEMBER_FUNC_CALL | ZEND_CTOR_CALL; - zend_stack_push(&CG(function_call_stack), (void *) &ptr, sizeof(unsigned char *)); -} - - -void do_end_new_object(znode *result, znode *class_name, znode *new_token, znode *argument_list CLS_DC) -{ - znode ctor_result; - - if (class_name->op_type == IS_CONST) { - zval_copy_ctor(&class_name->u.constant); - } - do_end_function_call(class_name, &ctor_result, argument_list, 1, 0 CLS_CC); - do_free(&ctor_result CLS_CC); - - CG(active_op_array)->opcodes[new_token->u.opline_num].op2.u.opline_num = get_next_op_number(CG(active_op_array)); - *result = CG(active_op_array)->opcodes[new_token->u.opline_num].op1; -} - - -void do_fetch_constant(znode *result, znode *constant_name, int mode CLS_DC) -{ - switch (mode) { - case ZEND_CT: - *result = *constant_name; - result->u.constant.type = IS_CONSTANT; - break; - case ZEND_RT: { - zend_op *opline = get_next_op(CG(active_op_array) CLS_CC); - - opline->opcode = ZEND_FETCH_CONSTANT; - opline->result.op_type = IS_TMP_VAR; - opline->result.u.var = get_temporary_variable(CG(active_op_array)); - opline->op1 = *constant_name; - *result = opline->result; - SET_UNUSED(opline->op2); - } - break; - } -} - - -void do_shell_exec(znode *result, znode *cmd CLS_DC) -{ - zend_op *opline = get_next_op(CG(active_op_array) CLS_CC); - - switch (cmd->op_type) { - case IS_TMP_VAR: - opline->opcode = ZEND_SEND_VAL; - break; - default: - opline->opcode = ZEND_SEND_VAR; - break; - } - opline->op1 = *cmd; - opline->op2.u.opline_num = 0; - opline->extended_value = ZEND_DO_FCALL; - SET_UNUSED(opline->op2); - - opline = get_next_op(CG(active_op_array) CLS_CC); - opline->opcode = ZEND_DO_FCALL; - opline->result.u.var = get_temporary_variable(CG(active_op_array)); - opline->result.op_type = IS_TMP_VAR; - opline->op1.u.constant.value.str.val = estrndup("shell_exec",sizeof("shell_exec")-1); - opline->op1.u.constant.value.str.len = sizeof("shell_exec")-1; - INIT_PZVAL(&opline->op1.u.constant); - opline->op1.u.constant.type = IS_STRING; - opline->op1.op_type = IS_CONST; - opline->extended_value = 1; - SET_UNUSED(opline->op2); - *result = opline->result; -} - - - -void do_init_array(znode *result, znode *expr, znode *offset CLS_DC) -{ - zend_op *opline = get_next_op(CG(active_op_array) CLS_CC); - - opline->opcode = ZEND_INIT_ARRAY; - opline->result.u.var = get_temporary_variable(CG(active_op_array)); - opline->result.op_type = IS_TMP_VAR; - *result = opline->result; - if (expr) { - opline->op1 = *expr; - if (offset) { - opline->op2 = *offset; - } else { - SET_UNUSED(opline->op2); - } - } else { - SET_UNUSED(opline->op1); - SET_UNUSED(opline->op2); - } -} - - -void do_add_array_element(znode *result, znode *expr, znode *offset CLS_DC) -{ - zend_op *opline = get_next_op(CG(active_op_array) CLS_CC); - - opline->opcode = ZEND_ADD_ARRAY_ELEMENT; - opline->result = *result; - opline->op1 = *expr; - if (offset) { - opline->op2 = *offset; - } else { - SET_UNUSED(opline->op2); - } -} - - - -void do_add_static_array_element(znode *result, znode *offset, znode *expr) -{ - zval *element = (zval *) emalloc(sizeof(zval)); - - *element = expr->u.constant; - if (offset) { - switch (offset->u.constant.type) { - case IS_STRING: - zend_hash_update(result->u.constant.value.ht, offset->u.constant.value.str.val, offset->u.constant.value.str.len+1, &element, sizeof(zval *), NULL); - zval_dtor(&offset->u.constant); - break; - case IS_LONG: - zend_hash_index_update(result->u.constant.value.ht, offset->u.constant.value.lval, &element, sizeof(zval *), NULL); - break; - } - } else { - zend_hash_next_index_insert(result->u.constant.value.ht, &element, sizeof(zval *), NULL); - } -} - - -void do_add_list_element(znode *element CLS_DC) -{ - list_llist_element lle; - - if (element) { - lle.var = *element; - zend_llist_copy(&lle.dimensions, &CG(dimension_llist)); - zend_llist_add_element(&CG(list_llist), &lle); - } - (*((int *)CG(dimension_llist).tail->data))++; -} - - -void do_new_list_begin(CLS_D) -{ - int current_dimension = 0; - zend_llist_add_element(&CG(dimension_llist), ¤t_dimension); -} - - -void do_new_list_end(CLS_D) -{ - zend_llist_remove_tail(&CG(dimension_llist)); - (*((int *)CG(dimension_llist).tail->data))++; -} - - -void do_list_init(CLS_D) -{ - zend_llist_init(&CG(list_llist), sizeof(list_llist_element), NULL, 0); - zend_llist_init(&CG(dimension_llist), sizeof(int), NULL, 0); - do_new_list_begin(CLS_C); -} - - -void do_list_end(znode *result, znode *expr CLS_DC) -{ - zend_llist_element *le; - zend_llist_element *dimension; - zend_op *opline; - znode last_container; - - le = CG(list_llist).head; - while (le) { - zend_llist *tmp_dimension_llist = &((list_llist_element *)le->data)->dimensions; - dimension = tmp_dimension_llist->head; - while (dimension) { - opline = get_next_op(CG(active_op_array) CLS_CC); - if (dimension == tmp_dimension_llist->head) { /* first */ - last_container = *expr; - switch(expr->op_type) { - case IS_VAR: - opline->opcode = ZEND_FETCH_DIM_R; - break; - case IS_TMP_VAR: - case IS_CONST: /* fetch_dim_tmp_var will handle this bogus fetch */ - opline->opcode = ZEND_FETCH_DIM_TMP_VAR; - break; - } - } else { - opline->opcode = ZEND_FETCH_DIM_R; - } - opline->result.op_type = IS_VAR; - opline->result.u.EA.type = 0; - opline->result.u.var = get_temporary_variable(CG(active_op_array)); - opline->op1 = last_container; - opline->op2.op_type = IS_CONST; - opline->op2.u.constant.type = IS_LONG; - opline->op2.u.constant.value.lval = *((int *) dimension->data); - INIT_PZVAL(&opline->op2.u.constant); - if (le == CG(list_llist).tail) { - opline->extended_value = ZEND_FETCH_STANDARD; - } else { - opline->extended_value = ZEND_FETCH_ADD_LOCK; - } - last_container = opline->result; - dimension = dimension->next; - } - ((list_llist_element *) le->data)->value = last_container; - zend_llist_destroy(&((list_llist_element *) le->data)->dimensions); - le = le->next; - } - - le = CG(list_llist).head; - while (le) { - do_assign(result, &((list_llist_element *) le->data)->var, &((list_llist_element *) le->data)->value CLS_CC); - CG(active_op_array)->opcodes[CG(active_op_array)->last-1].result.u.EA.type |= EXT_TYPE_UNUSED; - le = le->next; - } - zend_llist_destroy(&CG(dimension_llist)); - zend_llist_destroy(&CG(list_llist)); - *result = *expr; -} - - -void do_fetch_global_or_static_variable(znode *varname, znode *static_assignment, int fetch_type CLS_DC) -{ - zend_op *opline = get_next_op(CG(active_op_array) CLS_CC); - znode lval; - - if (fetch_type==ZEND_FETCH_STATIC && static_assignment) { - zval *tmp = (zval *) emalloc(sizeof(zval)); - - convert_to_string(&varname->u.constant); - *tmp = static_assignment->u.constant; - if (!CG(active_op_array)->static_variables) { - CG(active_op_array)->static_variables = (HashTable *) emalloc(sizeof(HashTable)); - zend_hash_init(CG(active_op_array)->static_variables, 2, NULL, PVAL_PTR_DTOR, 0); - } - zend_hash_update_ptr(CG(active_op_array)->static_variables, varname->u.constant.value.str.val, varname->u.constant.value.str.len+1, tmp, sizeof(zval *), NULL); - } - - - opline->opcode = ZEND_FETCH_W; /* the default mode must be Write, since fetch_simple_variable() is used to define function arguments */ - opline->result.op_type = IS_VAR; - opline->result.u.EA.type = 0; - opline->result.u.var = get_temporary_variable(CG(active_op_array)); - opline->op1 = *varname; - SET_UNUSED(opline->op2); - opline->op2.u.fetch_type = fetch_type; - - if (varname->op_type == IS_CONST) { - zval_copy_ctor(&varname->u.constant); - } - fetch_simple_variable(&lval, varname, 0 CLS_CC); /* Relies on the fact that the default fetch is BP_VAR_W */ - - - do_assign_ref(NULL, &lval, &opline->result CLS_CC); - CG(active_op_array)->opcodes[CG(active_op_array)->last-1].result.u.EA.type |= EXT_TYPE_UNUSED; -} - - -void do_cast(znode *result, znode *expr, int type CLS_DC) -{ - zend_op *opline = get_next_op(CG(active_op_array) CLS_CC); - - opline->opcode = ZEND_CAST; - opline->result.op_type = IS_TMP_VAR; - opline->result.u.var = get_temporary_variable(CG(active_op_array)); - opline->op1 = *expr; - SET_UNUSED(opline->op2); - opline->op2.u.constant.type = type; - *result = opline->result; -} - - -void do_include_or_eval(int type, znode *result, znode *op1 CLS_DC) -{ - zend_op *opline = get_next_op(CG(active_op_array) CLS_CC); - - opline->opcode = ZEND_INCLUDE_OR_EVAL; - opline->result.op_type = IS_TMP_VAR; - opline->result.u.var = get_temporary_variable(CG(active_op_array)); - opline->op1 = *op1; - SET_UNUSED(opline->op2); - opline->op2.u.constant.value.lval = type; - *result = opline->result; -} - - -void do_indirect_references(znode *result, znode *num_references, znode *variable CLS_DC) -{ - int i; - - do_end_variable_parse(BP_VAR_R CLS_CC); - for (i=1; i<num_references->u.constant.value.lval; i++) { - fetch_simple_variable_ex(result, variable, 0, ZEND_FETCH_R CLS_CC); - *variable = *result; - } - do_begin_variable_parse(CLS_C); - fetch_simple_variable(result, variable, 1 CLS_CC); -} - - -void do_unset(znode *variable CLS_DC) -{ - zend_op *last_op; - - last_op = &CG(active_op_array)->opcodes[get_next_op_number(CG(active_op_array))-1]; - - switch (last_op->opcode) { - case ZEND_FETCH_R: - last_op->opcode = ZEND_UNSET_VAR; - break; - case ZEND_FETCH_DIM_R: - case ZEND_FETCH_OBJ_R: - last_op->opcode = ZEND_UNSET_DIM_OBJ; - break; - - } -} - - -void do_isset_or_isempty(int type, znode *result, znode *variable CLS_DC) -{ - zend_op *opline; - - do_end_variable_parse(BP_VAR_IS CLS_CC); - opline = get_next_op(CG(active_op_array) CLS_CC); - - opline->opcode = ZEND_ISSET_ISEMPTY; - opline->result.op_type = IS_TMP_VAR; - opline->result.u.var = get_temporary_variable(CG(active_op_array)); - opline->op1 = *variable; - opline->op2.u.constant.value.lval = type; - SET_UNUSED(opline->op2); - *result = opline->result; -} - - -void do_foreach_begin(znode *foreach_token, znode *array, znode *open_brackets_token, znode *as_token CLS_DC) -{ - zend_op *opline = get_next_op(CG(active_op_array) CLS_CC); - - /* Preform array reset */ - opline->opcode = ZEND_FE_RESET; - opline->result.op_type = IS_TMP_VAR; - opline->result.u.var = get_temporary_variable(CG(active_op_array)); - opline->op1 = *array; - SET_UNUSED(opline->op2); - *open_brackets_token = opline->result; - - zend_stack_push(&CG(foreach_copy_stack), (void *) &opline->result, sizeof(znode)); - - /* save the location of the beginning of the loop (array fetching) */ - foreach_token->u.opline_num = get_next_op_number(CG(active_op_array)); - - opline = get_next_op(CG(active_op_array) CLS_CC); - opline->opcode = ZEND_FE_FETCH; - opline->result.op_type = IS_TMP_VAR; - opline->result.u.var = get_temporary_variable(CG(active_op_array)); - opline->op1 = *open_brackets_token; - SET_UNUSED(opline->op2); - *as_token = opline->result; -} - - -void do_foreach_cont(znode *value, znode *key, znode *as_token CLS_DC) -{ - zend_op *opline = get_next_op(CG(active_op_array) CLS_CC); - znode result_value, result_key, dummy; - - if (key->op_type != IS_UNUSED) { - znode *tmp; - - /* switch between the key and value... */ - tmp = key; - key = value; - value = tmp; - } - - opline->opcode = ZEND_FETCH_DIM_TMP_VAR; - opline->result.op_type = IS_VAR; - opline->result.u.EA.type = 0; - opline->result.u.opline_num = get_temporary_variable(CG(active_op_array)); - opline->op1 = *as_token; - opline->op2.op_type = IS_CONST; - opline->op2.u.constant.type = IS_LONG; - opline->op2.u.constant.value.lval = 0; - opline->extended_value = ZEND_FETCH_STANDARD; /* ignored in fetch_dim_tmp_var, but what the hell. */ - result_value = opline->result; - - if (key->op_type != IS_UNUSED) { - opline = get_next_op(CG(active_op_array) CLS_CC); - opline->opcode = ZEND_FETCH_DIM_TMP_VAR; - opline->result.op_type = IS_VAR; - opline->result.u.EA.type = 0; - opline->result.u.opline_num = get_temporary_variable(CG(active_op_array)); - opline->op1 = *as_token; - opline->op2.op_type = IS_CONST; - opline->op2.u.constant.type = IS_LONG; - opline->op2.u.constant.value.lval = 1; - opline->extended_value = ZEND_FETCH_STANDARD; /* ignored in fetch_dim_tmp_var, but what the hell. */ - result_key = opline->result; - } - - do_assign(&dummy, value, &result_value CLS_CC); - CG(active_op_array)->opcodes[CG(active_op_array)->last-1].result.u.EA.type |= EXT_TYPE_UNUSED; - if (key->op_type != IS_UNUSED) { - do_assign(&dummy, key, &result_key CLS_CC); - CG(active_op_array)->opcodes[CG(active_op_array)->last-1].result.u.EA.type |= EXT_TYPE_UNUSED; - } - do_free(as_token CLS_CC); - - do_begin_loop(CLS_C); - INC_BPC(CG(active_op_array)); -} - - -void do_foreach_end(znode *foreach_token, znode *open_brackets_token CLS_DC) -{ - zend_op *opline = get_next_op(CG(active_op_array) CLS_CC); - - opline->opcode = ZEND_JMP; - opline->op1.u.opline_num = foreach_token->u.opline_num; - SET_UNUSED(opline->op2); - - CG(active_op_array)->opcodes[foreach_token->u.opline_num].op2.u.opline_num = get_next_op_number(CG(active_op_array)); - - do_end_loop(foreach_token->u.opline_num CLS_CC); - - do_free(open_brackets_token CLS_CC); - - zend_stack_del_top(&CG(foreach_copy_stack)); - - DEC_BPC(CG(active_op_array)); -} - - -void do_end_heredoc(CLS_D) -{ - int opline_num = get_next_op_number(CG(active_op_array))-1; - zend_op *opline = &CG(active_op_array)->opcodes[opline_num]; - - if (opline->opcode != ZEND_ADD_STRING) { - return; - } - - opline->op2.u.constant.value.str.val[(opline->op2.u.constant.value.str.len--)-1] = 0; - if (opline->op2.u.constant.value.str.len>0) { - if (opline->op2.u.constant.value.str.val[opline->op2.u.constant.value.str.len-1]=='\r') { - opline->op2.u.constant.value.str.val[(opline->op2.u.constant.value.str.len--)-1] = 0; - } - } -} - - -void do_exit(znode *result, znode *message CLS_DC) -{ - zend_op *opline = get_next_op(CG(active_op_array) CLS_CC); - - opline->opcode = ZEND_EXIT; - opline->op1 = *message; - SET_UNUSED(opline->op2); - - result->op_type = IS_CONST; - result->u.constant.type = IS_BOOL; - result->u.constant.value.lval = 1; -} - - -void do_begin_silence(znode *strudel_token CLS_DC) -{ - zend_op *opline = get_next_op(CG(active_op_array) CLS_CC); - - opline->opcode = ZEND_BEGIN_SILENCE; - opline->result.op_type = IS_TMP_VAR; - opline->result.u.var = get_temporary_variable(CG(active_op_array)); - SET_UNUSED(opline->op1); - SET_UNUSED(opline->op2); - *strudel_token = opline->result; -} - - -void do_end_silence(znode *strudel_token CLS_DC) -{ - zend_op *opline = get_next_op(CG(active_op_array) CLS_CC); - - opline->opcode = ZEND_END_SILENCE; - opline->op1 = *strudel_token; - SET_UNUSED(opline->op2); -} - - -void do_begin_qm_op(znode *cond, znode *qm_token CLS_DC) -{ - int jmpz_op_number = get_next_op_number(CG(active_op_array)); - zend_op *opline; - - opline = get_next_op(CG(active_op_array) CLS_CC); - - opline->opcode = ZEND_JMPZ; - opline->op1 = *cond; - SET_UNUSED(opline->op2); - opline->op2.u.opline_num = jmpz_op_number; - *qm_token = opline->op2; - - INC_BPC(CG(active_op_array)); -} - - -void do_qm_true(znode *true_value, znode *qm_token, znode *colon_token CLS_DC) -{ - zend_op *opline = get_next_op(CG(active_op_array) CLS_CC); - - CG(active_op_array)->opcodes[qm_token->u.opline_num].op2.u.opline_num = get_next_op_number(CG(active_op_array))+1; /* jmp over the ZEND_JMP */ - - opline->opcode = ZEND_QM_ASSIGN; - opline->result.op_type = IS_TMP_VAR; - opline->result.u.var = get_temporary_variable(CG(active_op_array)); - opline->op1 = *true_value; - SET_UNUSED(opline->op2); - - *qm_token = opline->result; - colon_token->u.opline_num = get_next_op_number(CG(active_op_array)); - - opline = get_next_op(CG(active_op_array) CLS_CC); - opline->opcode = ZEND_JMP; - SET_UNUSED(opline->op1); - SET_UNUSED(opline->op2); -} - - -void do_qm_false(znode *result, znode *false_value, znode *qm_token, znode *colon_token CLS_DC) -{ - zend_op *opline = get_next_op(CG(active_op_array) CLS_CC); - - opline->opcode = ZEND_QM_ASSIGN; - opline->result = *qm_token; - opline->op1 = *false_value; - SET_UNUSED(opline->op2); - - CG(active_op_array)->opcodes[colon_token->u.opline_num].op1.u.opline_num = get_next_op_number(CG(active_op_array)); - - *result = opline->result; - - DEC_BPC(CG(active_op_array)); -} - -void do_extended_info(CLS_D) -{ - zend_op *opline; - - if (!CG(extended_info)) { - return; - } - - opline = get_next_op(CG(active_op_array) CLS_CC); - - opline->opcode = ZEND_EXT_STMT; - SET_UNUSED(opline->op1); - SET_UNUSED(opline->op2); -} - -void do_extended_fcall_begin(CLS_D) -{ - zend_op *opline; - - if (!CG(extended_info)) { - return; - } - - opline = get_next_op(CG(active_op_array) CLS_CC); - - opline->opcode = ZEND_EXT_FCALL_BEGIN; - SET_UNUSED(opline->op1); - SET_UNUSED(opline->op2); -} - - -void do_extended_fcall_end(CLS_D) -{ - zend_op *opline; - - if (!CG(extended_info)) { - return; - } - - opline = get_next_op(CG(active_op_array) CLS_CC); - - opline->opcode = ZEND_EXT_FCALL_END; - SET_UNUSED(opline->op1); - SET_UNUSED(opline->op2); -} - - -int zendlex(znode *zendlval CLS_DC) -{ - int retval; - - zendlval->u.constant.type = IS_LONG; - retval = lex_scan(&zendlval->u.constant CLS_CC); - switch(retval) { - case T_COMMENT: - case T_OPEN_TAG: - case T_WHITESPACE: - case T_PHP_TRACK_VARS: - retval = zendlex(zendlval CLS_CC); - break; - case T_CLOSE_TAG: - retval = ';'; /* implicit ; */ - break; - case T_OPEN_TAG_WITH_ECHO: - retval = T_ECHO; - break; - } - - INIT_PZVAL(&zendlval->u.constant); - zendlval->op_type = IS_CONST; - return retval; -} diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h deleted file mode 100644 index 23fd4936de..0000000000 --- a/Zend/zend_compile.h +++ /dev/null @@ -1,564 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | Zend Engine | - +----------------------------------------------------------------------+ - | Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski | - +----------------------------------------------------------------------+ - | This source file is subject to version 0.91 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at | - | http://www.zend.com/license/0_91.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Andi Gutmans <andi@zend.com> | - | Zeev Suraski <zeev@zend.com> | - +----------------------------------------------------------------------+ -*/ - - -#ifndef _COMPILE_H -#define _COMPILE_H - -#include "zend.h" - -#ifdef HAVE_STDARG_H -# include <stdarg.h> -#endif - -#include "zend_llist.h" -#define YYSTYPE znode -#include "zend-parser.h" - -#define DEBUG_ZEND 0 - -#ifndef ZTS -# define SUPPORT_INTERACTIVE 1 -#else -# define SUPPORT_INTERACTIVE 0 -#endif - -#define FREE_PNODE(znode) zval_dtor(&znode->u.constant); -#define FREE_OP(op, should_free) if (should_free) zval_dtor(&Ts[(op)->u.var].tmp_var); - - -#if SUPPORT_INTERACTIVE -#define INC_BPC(op_array) ((op_array)->backpatch_count++) -#define DEC_BPC(op_array) ((op_array)->backpatch_count--) -#define HANDLE_INTERACTIVE() if (EG(interactive)) { execute_new_code(CLS_C); } -#else -#define INC_BPC(op_array) -#define DEC_BPC(op_array) -#define HANDLE_INTERACTIVE() -#endif - -typedef struct _zend_op_array zend_op_array; - -typedef struct _znode { - int op_type; - union { - zval constant; - - int var; - int opline_num; - int fetch_type; - zend_op_array *op_array; - struct { - int var; /* dummy */ - int type; - } EA; - } u; -} znode; - - -typedef struct _zend_op { - int opcode; - znode result; - znode op1; - znode op2; - ulong extended_value; - char *filename; - uint lineno; -} zend_op; - - -typedef struct _zend_brk_cont_element { - int cont; - int brk; - int parent; -} zend_brk_cont_element; - - -struct _zend_op_array { - int type; /* MUST be the first element of this struct! */ - - unsigned char *arg_types; /* MUST be the second element of this struct! */ - - int *refcount; - - zend_op *opcodes; - int last, size; - - int T; - - char *function_name; - - zend_brk_cont_element *brk_cont_array; - int last_brk_cont; - int current_brk_cont; - unsigned char uses_globals; - - /* static variables support */ - HashTable *static_variables; - -#if SUPPORT_INTERACTIVE - int start_op_number, end_op_number; - int last_executed_op_number; - int backpatch_count; -#endif - - void *reserved[ZEND_MAX_RESERVED_RESOURCES]; -}; - - -typedef struct _zend_internal_function { - int type; /* MUST be the first element of this struct! */ - - unsigned char *arg_types; /* MUST be the second element of this struct */ - - void (*handler)(INTERNAL_FUNCTION_PARAMETERS); - char *function_name; -} zend_internal_function; - - -typedef union _zend_function { - int type; /* MUST be the first element of this struct! */ - struct { - int type; /* never used */ - unsigned char *arg_types; - } common; - - zend_op_array op_array; - zend_internal_function internal_function; -} zend_function; - - -typedef struct _zend_function_state { - HashTable *function_symbol_table; - zend_function *function; - void *reserved[ZEND_MAX_RESERVED_RESOURCES]; -} zend_function_state; - - -typedef struct _zend_switch_entry { - znode cond; - int default_case; - int control_var; -} zend_switch_entry; - - -typedef struct _list_llist_element { - znode var; - zend_llist dimensions; - znode value; -} list_llist_element; - - -typedef struct _zend_file_handle { - int type; - char *filename; - union { - int fd; - FILE *fp; -#ifdef __cplusplus - istream *is; -#endif - } handle; -} zend_file_handle; - - -#include "zend_globals.h" - -#define IS_CONST (1<<0) -#define IS_TMP_VAR (1<<1) -#define IS_VAR (1<<2) -#define IS_UNUSED (1<<3) /* Unused variable */ - - -#define EXT_TYPE_UNUSED (1<<0) - -void init_compiler(CLS_D ELS_DC); -void shutdown_compiler(CLS_D); - -BEGIN_EXTERN_C() -extern ZEND_API zend_op_array *(*zend_compile_files)(int mark_as_ref CLS_DC, int file_count, ...); - -void zend_activate(CLS_D ELS_DC); -void zend_deactivate(CLS_D ELS_DC); - -int lex_scan(zval *zendlval CLS_DC); -void startup_scanner(CLS_D); -void shutdown_scanner(CLS_D); - -ZEND_API char *zend_set_compiled_filename(char *new_compiled_filename); -ZEND_API void zend_restore_compiled_filename(char *original_compiled_filename); -ZEND_API char *zend_get_compiled_filename(); - -#ifdef ZTS -const char *zend_get_zendtext(CLS_D); -int zend_get_zendleng(CLS_D); -#endif - -END_EXTERN_C() - -/* parser-driven code generators */ -void do_binary_op(int op, znode *result, znode *op1, znode *op2 CLS_DC); -void do_unary_op(int op, znode *result, znode *op1 CLS_DC); -void do_binary_assign_op(int op, znode *result, znode *op1, znode *op2 CLS_DC); -void do_assign(znode *result, znode *variable, znode *value CLS_DC); -void do_assign_ref(znode *result, znode *lvar, znode *rvar CLS_DC); -void fetch_simple_variable(znode *result, znode *varname, int bp CLS_DC); -void fetch_simple_variable_ex(znode *result, znode *varname, int bp, int op CLS_DC); -void do_indirect_references(znode *result, znode *num_references, znode *variable CLS_DC); -void do_fetch_global_or_static_variable(znode *varname, znode *static_assignment, int fetch_type CLS_DC); -void do_fetch_globals(znode *varname CLS_DC); - -void fetch_array_begin(znode *result, znode *varname, znode *first_dim CLS_DC); -void fetch_array_dim(znode *result, znode *parent, znode *dim CLS_DC); -void do_print(znode *result, znode *arg CLS_DC); -void do_echo(znode *arg CLS_DC); -typedef int (*unary_op_type)(zval *, zval *); -ZEND_API unary_op_type get_unary_op(int opcode); -ZEND_API void *get_binary_op(int opcode); - -void do_while_cond(znode *expr, znode *close_bracket_token CLS_DC); -void do_while_end(znode *while_token, znode *close_bracket_token CLS_DC); -void do_do_while_begin(CLS_D); -void do_do_while_end(znode *do_token, znode *expr CLS_DC); - - -void do_if_cond(znode *cond, znode *closing_bracket_token CLS_DC); -void do_if_after_statement(znode *closing_bracket_token, unsigned char initialize CLS_DC); -void do_if_end(CLS_D); - -void do_for_cond(znode *expr, znode *second_semicolon_token CLS_DC); -void do_for_before_statement(znode *cond_start, znode *second_semicolon_token CLS_DC); -void do_for_end(znode *second_semicolon_token CLS_DC); - -void do_pre_incdec(znode *result, znode *op1, int op CLS_DC); -void do_post_incdec(znode *result, znode *op1, int op CLS_DC); - -void do_begin_variable_parse(CLS_D); -void do_end_variable_parse(int type CLS_DC); - -void do_free(znode *op1 CLS_DC); - -void do_init_string(znode *result CLS_DC); -void do_add_char(znode *result, znode *op1, znode *op2 CLS_DC); -void do_add_string(znode *result, znode *op1, znode *op2 CLS_DC); -void do_add_variable(znode *result, znode *op1, znode *op2 CLS_DC); - -void do_begin_function_declaration(znode *function_token, znode *function_name, int is_method CLS_DC); -void do_end_function_declaration(znode *function_token CLS_DC); -void do_receive_arg(int op, znode *var, znode *offset, znode *initialization, unsigned char pass_type CLS_DC); -int do_begin_function_call(znode *function_name CLS_DC); -void do_begin_dynamic_function_call(znode *function_name CLS_DC); -void do_begin_class_member_function_call(znode *class_name, znode *function_name CLS_DC); -void do_end_function_call(znode *function_name, znode *result, znode *argument_list, int is_method, int is_dynamic_fcall CLS_DC); -void do_return(znode *expr CLS_DC); -ZEND_API int do_bind_function_or_class(zend_op *opline, HashTable *function_table, HashTable *class_table, int compile_time); -void do_early_binding(CLS_D); - -void do_pass_param(znode *param, int op, int offset CLS_DC); - - -void do_boolean_or_begin(znode *expr1, znode *op_token CLS_DC); -void do_boolean_or_end(znode *result, znode *expr1, znode *expr2, znode *op_token CLS_DC); -void do_boolean_and_begin(znode *expr1, znode *op_token CLS_DC); -void do_boolean_and_end(znode *result, znode *expr1, znode *expr2, znode *op_token CLS_DC); - -void do_brk_cont(int op, znode *expr CLS_DC); - -void do_switch_cond(znode *cond CLS_DC); -void do_switch_end(znode *case_list CLS_DC); -void do_case_before_statement(znode *case_list, znode *case_token, znode *case_expr CLS_DC); -void do_case_after_statement(znode *result, znode *case_token CLS_DC); -void do_default_before_statement(znode *case_list, znode *default_token CLS_DC); - -void do_begin_class_declaration(znode *class_name, znode *parent_class_name CLS_DC); -void do_end_class_declaration(CLS_D); -void do_declare_property(znode *var_name, znode *value CLS_DC); - -void do_fetch_property(znode *result, znode *object, znode *property CLS_DC); - - -void do_push_object(znode *object CLS_DC); -void do_pop_object(znode *object CLS_DC); - - -void do_begin_new_object(znode *new_token, znode *class_name CLS_DC); -void do_end_new_object(znode *result, znode *class_name, znode *new_token, znode *argument_list CLS_DC); - -void do_fetch_constant(znode *result, znode *constant_name, int mode CLS_DC); - -void do_shell_exec(znode *result, znode *cmd CLS_DC); - -void do_init_array(znode *result, znode *expr, znode *offset CLS_DC); -void do_add_array_element(znode *result, znode *expr, znode *offset CLS_DC); -void do_add_static_array_element(znode *result, znode *offset, znode *expr); -void do_list_init(); -void do_list_end(znode *result, znode *expr CLS_DC); -void do_add_list_element(znode *element CLS_DC); -void do_new_list_begin(CLS_D); -void do_new_list_end(CLS_D); - -void do_cast(znode *result, znode *expr, int type CLS_DC); -void do_include_or_eval(int type, znode *result, znode *op1 CLS_DC); - -void do_unset(znode *variable CLS_DC); -void do_isset_or_isempty(int type, znode *result, znode *variable CLS_DC); - -void do_foreach_begin(znode *foreach_token, znode *array, znode *open_brackets_token, znode *as_token CLS_DC); -void do_foreach_cont(znode *value, znode *key, znode *as_token CLS_DC); -void do_foreach_end(znode *foreach_token, znode *open_brackets_token CLS_DC); - -void do_end_heredoc(CLS_D); - -void do_exit(znode *result, znode *message CLS_DC); - -void do_begin_silence(znode *strudel_token CLS_DC); -void do_end_silence(znode *strudel_token CLS_DC); - -void do_begin_qm_op(znode *cond, znode *qm_token CLS_DC); -void do_qm_true(znode *true_value, znode *qm_token, znode *colon_token CLS_DC); -void do_qm_false(znode *result, znode *false_value, znode *qm_token, znode *colon_token CLS_DC); - -void do_extended_info(CLS_D); -void do_extended_fcall_begin(CLS_D); -void do_extended_fcall_end(CLS_D); - -#define INITIAL_OP_ARRAY_SIZE 64 - - -/* helper functions in zend-scanner.l */ -BEGIN_EXTERN_C() -ZEND_API int require_file(zend_file_handle *file_handle CLS_DC); -ZEND_API int require_filename(char *filename CLS_DC); -ZEND_API zend_op_array *compile_files(int mark_as_ref CLS_DC, int file_count, ...); -ZEND_API zend_op_array *v_compile_files(int mark_as_ref CLS_DC, int file_count, va_list files); -ZEND_API zend_op_array *compile_string(zval *source_string CLS_DC); -ZEND_API zend_op_array *compile_filename(zval *filename CLS_DC); -ZEND_API inline int open_file_for_scanning(zend_file_handle *file_handle CLS_DC); -ZEND_API void init_op_array(zend_op_array *op_array, int initial_ops_size); -ZEND_API void destroy_op_array(zend_op_array *op_array); -ZEND_API void zend_close_file_handle(zend_file_handle *file_handle CLS_DC); -ZEND_API void zend_open_file_dtor(void *f); -END_EXTERN_C() - -ZEND_API int destroy_zend_function(zend_function *function); -ZEND_API int destroy_zend_class(zend_class_entry *ce); -void zend_class_add_ref(zend_class_entry *ce); - -#define ZEND_FUNCTION_DTOR (int (*)(void *)) destroy_zend_function -#define ZEND_CLASS_DTOR (int (*)(void *)) destroy_zend_class - -zend_op *get_next_op(zend_op_array *op_array CLS_DC); -void init_op(zend_op *op CLS_DC); -int get_next_op_number(zend_op_array *op_array); -int print_class(zend_class_entry *class_entry); -void print_op_array(zend_op_array *op_array, int optimizations); -BEGIN_EXTERN_C() -int pass_two(zend_op_array *op_array); -void pass_include_eval(zend_op_array *op_array); -END_EXTERN_C() -zend_brk_cont_element *get_next_brk_cont_element(zend_op_array *op_array); - - -int zendlex(znode *zendlval CLS_DC); - - -#define ZEND_NOP 0 - -#define ZEND_ADD 1 -#define ZEND_SUB 2 -#define ZEND_MUL 3 -#define ZEND_DIV 4 -#define ZEND_MOD 5 -#define ZEND_SL 6 -#define ZEND_SR 7 -#define ZEND_CONCAT 8 -#define ZEND_BW_OR 9 -#define ZEND_BW_AND 10 -#define ZEND_BW_XOR 11 -#define ZEND_BW_NOT 12 -#define ZEND_BOOL_NOT 13 -#define ZEND_BOOL_XOR 14 -#define ZEND_IS_EQUAL 15 -#define ZEND_IS_NOT_EQUAL 16 -#define ZEND_IS_SMALLER 17 -#define ZEND_IS_SMALLER_OR_EQUAL 18 -#define ZEND_CAST 19 -#define ZEND_QM_ASSIGN 20 - -#define ZEND_ASSIGN_ADD 21 -#define ZEND_ASSIGN_SUB 22 -#define ZEND_ASSIGN_MUL 23 -#define ZEND_ASSIGN_DIV 24 -#define ZEND_ASSIGN_MOD 25 -#define ZEND_ASSIGN_SL 26 -#define ZEND_ASSIGN_SR 27 -#define ZEND_ASSIGN_CONCAT 28 -#define ZEND_ASSIGN_BW_OR 29 -#define ZEND_ASSIGN_BW_AND 30 -#define ZEND_ASSIGN_BW_XOR 31 - -#define ZEND_PRE_INC 32 -#define ZEND_PRE_DEC 33 -#define ZEND_POST_INC 34 -#define ZEND_POST_DEC 35 - -#define ZEND_ASSIGN 36 -#define ZEND_ASSIGN_REF 37 - -#define ZEND_ECHO 38 -#define ZEND_PRINT 39 - -#define ZEND_JMP 40 -#define ZEND_JMPZ 41 -#define ZEND_JMPNZ 42 -#define ZEND_JMPZNZ 43 -#define ZEND_JMPZ_EX 44 -#define ZEND_JMPNZ_EX 45 -#define ZEND_CASE 46 -#define ZEND_SWITCH_FREE 47 -#define ZEND_BRK 48 -#define ZEND_CONT 49 -#define ZEND_BOOL 50 - -#define ZEND_INIT_STRING 51 -#define ZEND_ADD_CHAR 52 -#define ZEND_ADD_STRING 53 -#define ZEND_ADD_VAR 54 - -#define ZEND_BEGIN_SILENCE 55 -#define ZEND_END_SILENCE 56 - -#define ZEND_INIT_FCALL_BY_NAME 57 -#define ZEND_DO_FCALL 58 -#define ZEND_DO_FCALL_BY_NAME 59 -#define ZEND_RETURN 60 - -#define ZEND_RECV 61 -#define ZEND_RECV_INIT 62 - -#define ZEND_SEND_VAL 63 -#define ZEND_SEND_VAR 64 -#define ZEND_SEND_REF 65 - -#define ZEND_NEW 66 -#define ZEND_JMP_NO_CTOR 67 -#define ZEND_FREE 68 - -#define ZEND_INIT_ARRAY 69 -#define ZEND_ADD_ARRAY_ELEMENT 70 - -#define ZEND_INCLUDE_OR_EVAL 71 - -#define ZEND_UNSET_VAR 72 -#define ZEND_UNSET_DIM_OBJ 73 -#define ZEND_ISSET_ISEMPTY 74 - -#define ZEND_FE_RESET 75 -#define ZEND_FE_FETCH 76 - -#define ZEND_EXIT 77 - - -/* the following 12 opcodes are 4 groups of 3 opcodes each, and must - * remain in that order! - */ -#define ZEND_FETCH_R 78 -#define ZEND_FETCH_DIM_R 79 -#define ZEND_FETCH_OBJ_R 80 -#define ZEND_FETCH_W 81 -#define ZEND_FETCH_DIM_W 82 -#define ZEND_FETCH_OBJ_W 83 -#define ZEND_FETCH_RW 84 -#define ZEND_FETCH_DIM_RW 85 -#define ZEND_FETCH_OBJ_RW 86 -#define ZEND_FETCH_IS 87 -#define ZEND_FETCH_DIM_IS 88 -#define ZEND_FETCH_OBJ_IS 89 - -#define ZEND_FETCH_DIM_TMP_VAR 90 -#define ZEND_FETCH_CONSTANT 91 - -#define ZEND_DECLARE_FUNCTION_OR_CLASS 92 - -#define ZEND_EXT_STMT 93 -#define ZEND_EXT_FCALL_BEGIN 94 -#define ZEND_EXT_FCALL_END 95 -#define ZEND_EXT_NOP 96 - -/* end of block */ - - - - -/* global/local fetches */ -#define ZEND_FETCH_GLOBAL 0 -#define ZEND_FETCH_LOCAL 1 -#define ZEND_FETCH_STATIC 2 - -/* var status for backpatching */ -#define BP_VAR_R 0 -#define BP_VAR_W 1 -#define BP_VAR_RW 2 -#define BP_VAR_IS 3 -#define BP_VAR_NA 4 /* if not applicable */ - - -#define ZEND_INTERNAL_FUNCTION 1 -#define ZEND_USER_FUNCTION 2 -#define ZEND_OVERLOADED_FUNCTION 3 -#define ZEND_EVAL_CODE 4 - -#define ZEND_INTERNAL_CLASS 1 -#define ZEND_USER_CLASS 2 - -#define ZEND_EVAL (1<<0) -#define ZEND_INCLUDE (1<<1) - -#define ZEND_ISSET (1<<0) -#define ZEND_ISEMPTY (1<<1) - -#define ZEND_CT (1<<0) -#define ZEND_RT (1<<1) - - -#define ZEND_HANDLE_FILENAME 0 -#define ZEND_HANDLE_FD 1 -#define ZEND_HANDLE_FP 2 -#define ZEND_HANDLE_ISTREAM 3 - -#define ZEND_DECLARE_CLASS 1 -#define ZEND_DECLARE_FUNCTION 2 -#define ZEND_DECLARE_INHERITED_CLASS 3 - -#define ZEND_FETCH_STANDARD 0 -#define ZEND_FETCH_ADD_LOCK 1 - -#define ZEND_MEMBER_FUNC_CALL 1<<0 -#define ZEND_CTOR_CALL 1<<1 - - -#define PZVAL_IS_REF(z) ((z)->EA.is_ref) -#define PZVAL_IS_LOCKED(z) ((z)->EA.locks>0) - -#define PZVAL_LOCK(z) (z)->EA.locks++ -#define PZVAL_UNLOCK(z) (z)->EA.locks-- -#define SELECTIVE_PZVAL_LOCK(pzv, pzn) if (!((pzn)->u.EA.type & EXT_TYPE_UNUSED)) { PZVAL_LOCK(pzv); } - - -#endif /* _COMPILE_H */ diff --git a/Zend/zend_config.in b/Zend/zend_config.in deleted file mode 100755 index c80000c8da..0000000000 --- a/Zend/zend_config.in +++ /dev/null @@ -1,43 +0,0 @@ -#! /bin/sh -# -# $Id$ -# -# Written by Sascha Schumann <sascha@schumann.cx> - - -# taken from autoconf - -if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then - # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. - if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then - ac_n= ac_c=' -' ac_t=' ' - else - ac_n=-n ac_c= ac_t= - fi -else - ac_n= ac_c='\c' ac_t= -fi - - -flags_libs="@LIBS@" -flags_ldflags="@LDFLAGS@" -flags_cflags="@CPPFLAGS@ @CFLAGS@" - -case "$1" in ---ldflags) - echo $ac_n "$flags_ldflags$ac_c" -;; ---cflags) - echo $ac_n "$flags_cflags$ac_c" -;; ---libs) - echo $ac_n "$flags_libs$ac_c" -;; -*) - echo "$0 [--libs|--cflags|--ldflags]" - exit 1 -;; -esac - -exit 0 diff --git a/Zend/zend_config.w32.h b/Zend/zend_config.w32.h deleted file mode 100644 index ad3979b825..0000000000 --- a/Zend/zend_config.w32.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | Zend Engine | - +----------------------------------------------------------------------+ - | Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski | - +----------------------------------------------------------------------+ - | This source file is subject to version 0.91 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at | - | http://www.zend.com/license/0_91.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Andi Gutmans <andi@zend.com> | - | Zeev Suraski <zeev@zend.com> | - +----------------------------------------------------------------------+ -*/ - - -#ifndef _ZEND_CONFIG_W32_H -#define _ZEND_CONFIG_W32_H - - -#include <string.h> -#include <windows.h> - -typedef unsigned long ulong; -typedef unsigned int uint; - -#define HAVE_ALLOCA 1 -#define HAVE_LIMITS_H 1 -#include <malloc.h> - -#undef HAVE_KILL -#define HAVE_GETPID 1 -/* #define HAVE_ALLOCA_H 1 */ -#define HAVE_MEMCPY 1 -#define HAVE_STRDUP 1 -#define HAVE_SYS_TYPES_H 1 -#define HAVE_STDIOSTR_H 1 -#define istdiostream stdiostream - -#ifdef inline -#undef inline -#endif - -#define zend_sprintf sprintf - -/* Visual C++ doesn't really work with inline for C */ -#define inline - - -#define DL_LOAD(libname) LoadLibrary(libname) -#define DL_FETCH_SYMBOL GetProcAddress -#define DL_UNLOAD FreeLibrary -#define DL_HANDLE HMODULE -#define ZEND_EXTENSIONS_SUPPORT 1 - -#ifdef LIBZEND_EXPORTS -# define ZEND_API __declspec(dllexport) -#else -# define ZEND_API __declspec(dllimport) -#endif - -#endif /* _ZEND_CONFIG_W32_H */ diff --git a/Zend/zend_constants.c b/Zend/zend_constants.c deleted file mode 100644 index 345c246ae5..0000000000 --- a/Zend/zend_constants.c +++ /dev/null @@ -1,268 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | Zend Engine | - +----------------------------------------------------------------------+ - | Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski | - +----------------------------------------------------------------------+ - | This source file is subject to version 0.91 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at | - | http://www.zend.com/license/0_91.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Andi Gutmans <andi@zend.com> | - | Zeev Suraski <zeev@zend.com> | - +----------------------------------------------------------------------+ -*/ - - -#include "zend.h" -#include "zend_constants.h" -#include "zend_variables.h" -#include "zend_operators.h" -#include "zend_globals.h" - - -int free_zend_constant(zend_constant *c) -{ - if (!(c->flags & CONST_PERSISTENT)) { - zval_dtor(&c->value); - } - free(c->name); - return 1; -} - - -void copy_zend_constant(zend_constant *c) -{ - c->name = zend_strndup(c->name, c->name_len); - zval_copy_ctor(&c->value); -} - - -void zend_copy_constants(HashTable *target, HashTable *source) -{ - zend_constant tmp_constant; - - zend_hash_copy(target, source, (void (*)(void *)) copy_zend_constant, &tmp_constant, sizeof(zend_constant)); -} - - -static int clean_non_persistent_constant(zend_constant *c) -{ - if (c->flags & CONST_PERSISTENT) { - return 0; - } else { - return 1; - } -} - - -static int clean_module_constant(zend_constant *c, int *module_number) -{ - if (c->module_number == *module_number) { - return 1; - } else { - return 0; - } -} - - -void clean_module_constants(int module_number) -{ - ELS_FETCH(); - - zend_hash_apply_with_argument(EG(zend_constants), (int (*)(void *,void *)) clean_module_constant, (void *) &module_number); -} - - -int zend_startup_constants(ELS_D) -{ -#if WIN32|WINNT - DWORD dwBuild=0; - DWORD dwVersion = GetVersion(); - DWORD dwWindowsMajorVersion = (DWORD)(LOBYTE(LOWORD(dwVersion))); - DWORD dwWindowsMinorVersion = (DWORD)(HIBYTE(LOWORD(dwVersion))); -#endif - - EG(zend_constants) = (HashTable *) malloc(sizeof(HashTable)); - - if (zend_hash_init(EG(zend_constants), 20, NULL, ZEND_CONSTANT_DTOR, 1)==FAILURE) { - return FAILURE; - } - return SUCCESS; -} - - - -void zend_register_standard_constants(ELS_D) -{ - /* ZEND_FIX: Move to PHP */ -#if 0 -#if WIN32|WINNT - /* Get build numbers for Windows NT or Win95 */ - if (dwVersion < 0x80000000){ - php3_os="WINNT"; - } else { - php3_os="WIN32"; - } -#else - php3_os=PHP_OS; -#endif -#endif - - -#if 0 - /* This should go back to PHP */ - REGISTER_MAIN_STRINGL_CONSTANT("PHP_VERSION", PHP_VERSION, sizeof(PHP_VERSION)-1, CONST_PERSISTENT | CONST_CS); - REGISTER_MAIN_STRINGL_CONSTANT("PHP_OS", php3_os, strlen(php3_os), CONST_PERSISTENT | CONST_CS); -#endif - REGISTER_MAIN_LONG_CONSTANT("E_ERROR", E_ERROR, CONST_PERSISTENT | CONST_CS); - REGISTER_MAIN_LONG_CONSTANT("E_WARNING", E_WARNING, CONST_PERSISTENT | CONST_CS); - REGISTER_MAIN_LONG_CONSTANT("E_PARSE", E_PARSE, CONST_PERSISTENT | CONST_CS); - REGISTER_MAIN_LONG_CONSTANT("E_NOTICE", E_NOTICE, CONST_PERSISTENT | CONST_CS); - REGISTER_MAIN_LONG_CONSTANT("E_CORE_ERROR", E_CORE_ERROR, CONST_PERSISTENT | CONST_CS); - REGISTER_MAIN_LONG_CONSTANT("E_CORE_WARNING", E_CORE_WARNING, CONST_PERSISTENT | CONST_CS); - REGISTER_MAIN_LONG_CONSTANT("E_COMPILE_ERROR", E_COMPILE_ERROR, CONST_PERSISTENT | CONST_CS); - REGISTER_MAIN_LONG_CONSTANT("E_COMPILE_WARNING", E_COMPILE_WARNING, CONST_PERSISTENT | CONST_CS); - - REGISTER_MAIN_LONG_CONSTANT("E_ALL", E_ALL, CONST_PERSISTENT | CONST_CS); - - /* true/false constants */ - { - zend_constant c; - - c.value.type = IS_BOOL; - c.flags = CONST_PERSISTENT; - c.module_number = 0; - - c.name = zend_strndup("TRUE",4); - c.name_len = 5; - c.value.value.lval = 1; - c.value.type = IS_BOOL; - zend_register_constant(&c ELS_CC); - - c.name = zend_strndup("FALSE",5); - c.name_len = 6; - c.value.value.lval = 0; - c.value.type = IS_BOOL; - zend_register_constant(&c ELS_CC); - } -} - - -int zend_shutdown_constants(ELS_D) -{ - zend_hash_destroy(EG(zend_constants)); - free(EG(zend_constants)); - return SUCCESS; -} - - -void clean_non_persistent_constants(void) -{ - ELS_FETCH(); - - zend_hash_apply(EG(zend_constants), (int (*)(void *)) clean_non_persistent_constant); -} - - -ZEND_API void zend_register_long_constant(char *name, uint name_len, long lval, int flags, int module_number ELS_DC) -{ - zend_constant c; - - c.value.type = IS_LONG; - c.value.value.lval = lval; - c.flags = flags; - c.name = zend_strndup(name,name_len); - c.name_len = name_len; - c.module_number = module_number; - zend_register_constant(&c ELS_CC); -} - - -ZEND_API void zend_register_double_constant(char *name, uint name_len, double dval, int flags, int module_number ELS_DC) -{ - zend_constant c; - - c.value.type = IS_DOUBLE; - c.value.value.dval = dval; - c.flags = flags; - c.name = zend_strndup(name,name_len); - c.name_len = name_len; - c.module_number = module_number; - zend_register_constant(&c ELS_CC); -} - - -ZEND_API void zend_register_stringl_constant(char *name, uint name_len, char *strval, uint strlen, int flags, int module_number ELS_DC) -{ - zend_constant c; - - c.value.type = IS_STRING; - c.value.value.str.val = strval; - c.value.value.str.len = strlen; - c.flags = flags; - c.name = zend_strndup(name,name_len); - c.name_len = name_len; - c.module_number = module_number; - zend_register_constant(&c ELS_CC); -} - - -ZEND_API void zend_register_string_constant(char *name, uint name_len, char *strval, int flags, int module_number ELS_DC) -{ - zend_register_stringl_constant(name, name_len, strval, strlen(strval), flags, module_number ELS_CC); -} - - -ZEND_API int zend_get_constant(char *name, uint name_len, zval *result) -{ - zend_constant *c; - char *lookup_name = estrndup(name,name_len); - int retval; - ELS_FETCH(); - - zend_str_tolower(lookup_name, name_len); - - if (zend_hash_find(EG(zend_constants), lookup_name, name_len+1, (void **) &c)==SUCCESS) { - if ((c->flags & CONST_CS) && memcmp(c->name, name, name_len)!=0) { - retval=0; - } else { - retval=1; - *result = c->value; - zval_copy_ctor(result); - } - } else { - retval=0; - } - - efree(lookup_name); - return retval; -} - - -ZEND_API void zend_register_constant(zend_constant *c ELS_DC) -{ - char *lowercase_name = zend_strndup(c->name, c->name_len); - -#if 0 - printf("Registering constant for module %d\n",c->module_number); -#endif - - zend_str_tolower(lowercase_name, c->name_len); - if (zend_hash_add(EG(zend_constants), lowercase_name, c->name_len, (void *) c, sizeof(zend_constant), NULL)==FAILURE) { - zval_dtor(&c->value); - } - free(lowercase_name); -} - - -/* - * Local variables: - * tab-width: 4 - * c-basic-offset: 4 - * End: - */ diff --git a/Zend/zend_constants.h b/Zend/zend_constants.h deleted file mode 100644 index fd196c450d..0000000000 --- a/Zend/zend_constants.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | Zend Engine | - +----------------------------------------------------------------------+ - | Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski | - +----------------------------------------------------------------------+ - | This source file is subject to version 0.91 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at | - | http://www.zend.com/license/0_91.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Andi Gutmans <andi@zend.com> | - | Zeev Suraski <zeev@zend.com> | - +----------------------------------------------------------------------+ -*/ - - -#ifndef _CONSTANTS_H -#define _CONSTANTS_H - -#include "zend_globals.h" - -#define CONST_CS 0x1 /* Case Sensitive */ -#define CONST_PERSISTENT 0x2 - -typedef struct _zend_constant { - zval value; - int flags; - char *name; - uint name_len; - int module_number; -} zend_constant; - -#define REGISTER_LONG_CONSTANT(name,lval,flags) zend_register_long_constant((name),sizeof(name),(lval),(flags),module_number ELS_CC) -#define REGISTER_DOUBLE_CONSTANT(name,dval,flags) zend_register_double_constant((name),sizeof(name),(dval),(flags),module_number ELS_CC) -#define REGISTER_STRING_CONSTANT(name,str,flags) zend_register_string_constant((name),sizeof(name),(str),(flags),module_number ELS_CC) -#define REGISTER_STRINGL_CONSTANT(name,str,len,flags) zend_register_stringl_constant((name),sizeof(name),(str),(len),(flags),module_number ELS_CC) - -#define REGISTER_MAIN_LONG_CONSTANT(name,lval,flags) zend_register_long_constant((name),sizeof(name),(lval),(flags),0 ELS_CC) -#define REGISTER_MAIN_DOUBLE_CONSTANT(name,dval,flags) zend_register_double_constant((name),sizeof(name),(dval),(flags),0 ELS_CC) -#define REGISTER_MAIN_STRING_CONSTANT(name,str,flags) zend_register_string_constant((name),sizeof(name),(str),(flags),0 ELS_CC) -#define REGISTER_MAIN_STRINGL_CONSTANT(name,str,len,flags) zend_register_stringl_constant((name),sizeof(name),(str),(len),(flags),0 ELS_CC) - -void clean_module_constants(int module_number); -int free_zend_constant(zend_constant *c); -int zend_startup_constants(ELS_D); -int zend_shutdown_constants(ELS_D); -void zend_register_standard_constants(ELS_D); -void clean_non_persistent_constants(void); -ZEND_API int zend_get_constant(char *name, uint name_len, zval *result); -ZEND_API void zend_register_long_constant(char *name, uint name_len, long lval, int flags, int module_number ELS_DC); -ZEND_API void zend_register_double_constant(char *name, uint name_len, double dval, int flags, int module_number ELS_DC); -ZEND_API void zend_register_string_constant(char *name, uint name_len, char *strval, int flags, int module_number ELS_DC); -ZEND_API void zend_register_stringl_constant(char *name, uint name_len, char *strval, uint strlen, int flags, int module_number ELS_DC); -ZEND_API void zend_register_constant(zend_constant *c ELS_DC); -void zend_copy_constants(HashTable *target, HashTable *sourc); - -#define ZEND_CONSTANT_DTOR (int (*)(void *)) free_zend_constant - -#endif diff --git a/Zend/zend_errors.h b/Zend/zend_errors.h deleted file mode 100644 index 36b6123d14..0000000000 --- a/Zend/zend_errors.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | Zend Engine | - +----------------------------------------------------------------------+ - | Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski | - +----------------------------------------------------------------------+ - | This source file is subject to version 0.91 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at | - | http://www.zend.com/license/0_91.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Andi Gutmans <andi@zend.com> | - | Zeev Suraski <zeev@zend.com> | - +----------------------------------------------------------------------+ -*/ - - -#ifndef _ZEND_ERRORS_H -#define _ZEND_ERRORS_H - -#define E_ERROR (1<<0L) -#define E_WARNING (1<<1L) -#define E_PARSE (1<<2L) -#define E_NOTICE (1<<3L) -#define E_CORE_ERROR (1<<4L) -#define E_CORE_WARNING (1<<5L) -#define E_COMPILE_ERROR (1<<6L) -#define E_COMPILE_WARNING (1<<7L) - -#define E_ALL (E_ERROR | E_WARNING | E_PARSE | E_NOTICE | E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_COMPILE_WARNING) -#define E_CORE (E_CORE_ERROR | E_CORE_WARNING) - -#endif /* _ZEND_ERRORS_H */ - diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c deleted file mode 100644 index 4c34b703bf..0000000000 --- a/Zend/zend_execute.c +++ /dev/null @@ -1,2090 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | Zend Engine | - +----------------------------------------------------------------------+ - | Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski | - +----------------------------------------------------------------------+ - | This source file is subject to version 0.91 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at | - | http://www.zend.com/license/0_91.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Andi Gutmans <andi@zend.com> | - | Zeev Suraski <zeev@zend.com> | - +----------------------------------------------------------------------+ -*/ - - -#include <stdio.h> -#include <signal.h> - -#include "zend.h" -#include "zend_compile.h" -#include "zend_execute.h" -#include "zend_API.h" -#include "zend_ptr_stack.h" -#include "zend_variables.h" -#include "zend_operators.h" -#include "zend_constants.h" -#include "zend_extensions.h" - -#if defined(HAVE_ALLOCA) && defined(HAVE_ALLOCA_H) -# include <alloca.h> -#endif - -#define get_zval_ptr(node, Ts, should_free, type) _get_zval_ptr(node, Ts, should_free ELS_CC) -#define get_zval_ptr_ptr(node, Ts, type) _get_zval_ptr_ptr(node, Ts ELS_CC) - -#define get_incdec_op(op, opcode) \ - switch (opcode) { \ - case ZEND_PRE_INC: \ - case ZEND_POST_INC: \ - (op) = increment_function; \ - break; \ - case ZEND_PRE_DEC: \ - case ZEND_POST_DEC: \ - (op) = decrement_function; \ - break; \ - default: \ - (op) = NULL; \ - break; \ - } \ - -/* These globals don't have to be thread safe since they're never modified */ - - -/* Prototypes */ -static zval get_overloaded_property(ELS_D); -static void set_overloaded_property(zval *value ELS_DC); -static void call_overloaded_function(int arg_count, zval *return_value, HashTable *list, HashTable *plist ELS_DC); -static inline void zend_fetch_var_address(znode *result, znode *op1, znode *op2, temp_variable *Ts, int type ELS_DC); -static inline void zend_fetch_dimension_address(znode *result, znode *op1, znode *op2, temp_variable *Ts, int type ELS_DC); -static inline void zend_fetch_property_address(znode *result, znode *op1, znode *op2, temp_variable *Ts, int type ELS_DC); -static inline void zend_fetch_dimension_address_from_tmp_var(znode *result, znode *op1, znode *op2, temp_variable *Ts ELS_DC); -static void zend_extension_statement_handler(zend_extension *extension, zend_op_array *op_array); -static void zend_extension_fcall_begin_handler(zend_extension *extension, zend_op_array *op_array); -static void zend_extension_fcall_end_handler(zend_extension *extension, zend_op_array *op_array); - - -static inline zval *_get_zval_ptr(znode *node, temp_variable *Ts, int *should_free ELS_DC) -{ - switch(node->op_type) { - case IS_CONST: - *should_free = 0; - return &node->u.constant; - break; - case IS_TMP_VAR: - *should_free = 1; - return &Ts[node->u.var].tmp_var; - break; - case IS_VAR: - if (Ts[node->u.var].var.ptr_ptr) { - PZVAL_UNLOCK(*Ts[node->u.var].var.ptr_ptr); - *should_free = 0; - return *Ts[node->u.var].var.ptr_ptr; - } else { - *should_free = 1; - - switch (Ts[node->u.var].EA.type) { - case IS_OVERLOADED_OBJECT: - Ts[node->u.var].tmp_var = get_overloaded_property(ELS_C); - Ts[node->u.var].tmp_var.refcount=1; - Ts[node->u.var].tmp_var.EA.is_ref=1; - Ts[node->u.var].tmp_var.EA.locks=0; - return &Ts[node->u.var].tmp_var; - break; - case IS_STRING_OFFSET: { - temp_variable *T = &Ts[node->u.var]; - zval *str = T->EA.str; - - if (T->EA.str->type != IS_STRING - || (T->EA.str->value.str.len <= T->EA.offset)) { - T->tmp_var.value.str.val = empty_string; - T->tmp_var.value.str.len = 0; - } else { - char c = str->value.str.val[T->EA.offset]; - - T->tmp_var.value.str.val = estrndup(&c, 1); - T->tmp_var.value.str.len = 1; - } - zval_ptr_dtor(&str); - T->tmp_var.refcount=1; - T->tmp_var.EA.is_ref=1; - T->tmp_var.EA.locks=0; - T->tmp_var.type = IS_STRING; - return &T->tmp_var; - } - break; - } - } - break; - case IS_UNUSED: - *should_free = 0; - return NULL; - break; -#if DEBUG_ZEND - default: - zend_error(E_ERROR, "Unknown temporary variable type"); - break; -#endif - } - return NULL; -} - - -static inline zval **_get_zval_ptr_ptr(znode *node, temp_variable *Ts ELS_DC) -{ - switch(node->op_type) { - case IS_VAR: - if (Ts[node->u.var].var.ptr_ptr) { - PZVAL_UNLOCK(*Ts[node->u.var].var.ptr_ptr); - } - return Ts[node->u.var].var.ptr_ptr; - break; - default: - return NULL; - break; - } -} - -static inline zval *_get_object_zval_ptr(znode *node, temp_variable *Ts, int *should_free, zval ***object_ptr_ptr ELS_DC) -{ - switch(node->op_type) { - case IS_TMP_VAR: - *should_free = 1; - *object_ptr_ptr = NULL; - return &Ts[node->u.var].tmp_var; - break; - case IS_VAR: - if (Ts[node->u.var].var.ptr_ptr) { - PZVAL_UNLOCK(*Ts[node->u.var].var.ptr_ptr); - *should_free = 0; - *object_ptr_ptr = Ts[node->u.var].var.ptr_ptr; - return **object_ptr_ptr; - } else { - *should_free = 1; - *object_ptr_ptr = NULL; - return NULL; - } - break; - case IS_UNUSED: - *object_ptr_ptr = NULL; - return NULL; - break; -#if DEBUG_ZEND - default: - zend_error(E_ERROR, "Unknown temporary variable type"); - break; -#endif - } - return NULL; -} - - -static inline zval **zend_fetch_property_address_inner(HashTable *ht, znode *op2, temp_variable *Ts, int type ELS_DC) -{ - int free_op2; - zval *prop_ptr = get_zval_ptr(op2, Ts, &free_op2, BP_VAR_R); - zval **retval; - zval tmp; - - - switch (op2->op_type) { - case IS_CONST: - /* already a constant string */ - break; - case IS_VAR: - tmp = *prop_ptr; - zval_copy_ctor(&tmp); - convert_to_string(&tmp); - prop_ptr = &tmp; - break; - case IS_TMP_VAR: - convert_to_string(prop_ptr); - break; - } - - if (zend_hash_find(ht, prop_ptr->value.str.val, prop_ptr->value.str.len+1, (void **) &retval) == FAILURE) { - switch (type) { - case BP_VAR_R: - zend_error(E_NOTICE,"Undefined property: %s", prop_ptr->value.str.val); - /* break missing intentionally */ - case BP_VAR_IS: - retval = &EG(uninitialized_zval_ptr); - break; - case BP_VAR_RW: - zend_error(E_NOTICE,"Undefined property: %s", prop_ptr->value.str.val); - /* break missing intentionally */ - case BP_VAR_W: { - zval *new_zval = &EG(uninitialized_zval); - - new_zval->refcount++; - zend_hash_update_ptr(ht, prop_ptr->value.str.val, prop_ptr->value.str.len+1, new_zval, sizeof(zval *), (void **) &retval); - } - break; - } - } - - if (prop_ptr == &tmp) { - zval_dtor(prop_ptr); - } - FREE_OP(op2, free_op2); - return retval; -} - - -static inline void zend_assign_to_variable(znode *result, znode *op1, znode *op2, zval *value, int type, temp_variable *Ts ELS_DC) -{ - zval **variable_ptr_ptr = get_zval_ptr_ptr(op1, Ts, BP_VAR_W); - zval *variable_ptr; - int previous_lock_count; - - if (!variable_ptr_ptr) { - switch (Ts[op1->u.var].EA.type) { - case IS_OVERLOADED_OBJECT: - set_overloaded_property(value ELS_CC); - if (type == IS_TMP_VAR) { - zval_dtor(value); - } - break; - case IS_STRING_OFFSET: { - temp_variable *T = &Ts[op1->u.var]; - - if (T->EA.str->type == IS_STRING - && (T->EA.offset < T->EA.str->value.str.len)) { - zval tmp; - zval *final_value = value; - - if (value->type!=IS_STRING) { - tmp = *value; - if (op2 && op2->op_type == IS_VAR) { - zval_copy_ctor(&tmp); - } - convert_to_string(&tmp); - final_value = &tmp; - } - - T->EA.str->value.str.val[T->EA.offset] = final_value->value.str.val[0]; - if (op2 - && op2->op_type == IS_VAR - && value==&Ts[op2->u.var].tmp_var) { - efree(value->value.str.val); - } - if (final_value == &tmp) { - zval_dtor(final_value); - } - /* - * the value of an assignment to a string offset is undefined - Ts[result->u.var].var = &T->EA.str; - */ - } - zval_ptr_dtor(&T->EA.str); - T->tmp_var.type = IS_STRING; - } - break; - } - Ts[result->u.var].var.ptr_ptr = &EG(uninitialized_zval_ptr); - SELECTIVE_PZVAL_LOCK(*Ts[result->u.var].var.ptr_ptr, result); - return; - } - - variable_ptr = *variable_ptr_ptr; - - if (variable_ptr == EG(error_zval_ptr)) { - if (result) { - Ts[result->u.var].var.ptr_ptr = &EG(uninitialized_zval_ptr); - SELECTIVE_PZVAL_LOCK(*Ts[result->u.var].var.ptr_ptr, result); - } - return; - } - - if (PZVAL_IS_REF(variable_ptr)) { - if (variable_ptr!=value) { - short refcount=variable_ptr->refcount; - - previous_lock_count = variable_ptr->EA.locks; - if (type!=IS_TMP_VAR) { - value->refcount++; - } - zendi_zval_dtor(*variable_ptr); - *variable_ptr = *value; - variable_ptr->refcount = refcount; - variable_ptr->EA.is_ref = 1; - variable_ptr->EA.locks = previous_lock_count; - if (type!=IS_TMP_VAR) { - zendi_zval_copy_ctor(*variable_ptr); - zval_ptr_dtor(&value); - } - } - } else { - variable_ptr->refcount--; - if (variable_ptr->refcount==0) { - switch (type) { - case IS_VAR: - if (PZVAL_IS_LOCKED(value)) { - zval *orig_value = value; - - value = (zval *) emalloc(sizeof(zval)); - *value = *orig_value; - value->refcount=0; - value->EA.locks = 0; - zval_copy_ctor(value); - } - /* break missing intentionally */ - case IS_CONST: - if (variable_ptr==value) { - variable_ptr->refcount++; - } else if (PZVAL_IS_REF(value)) { - zval tmp = *value; - - previous_lock_count = variable_ptr->EA.locks; - tmp = *value; - zval_copy_ctor(&tmp); - tmp.refcount=1; - tmp.EA.locks = previous_lock_count; - zendi_zval_dtor(*variable_ptr); - *variable_ptr = tmp; - } else { - value->refcount++; - zendi_zval_dtor(*variable_ptr); - safe_free_zval_ptr(variable_ptr); - *variable_ptr_ptr = value; - } - break; - case IS_TMP_VAR: - zendi_zval_dtor(*variable_ptr); - value->refcount=1; - previous_lock_count = variable_ptr->EA.locks; - *variable_ptr = *value; - variable_ptr->EA.locks = previous_lock_count; - break; - } - } else { /* we need to split */ - switch (type) { - case IS_VAR: - if (PZVAL_IS_LOCKED(value)) { - zval *orig_value = value; - - value = (zval *) emalloc(sizeof(zval)); - *value = *orig_value; - value->refcount=0; - value->EA.locks = 0; - zval_copy_ctor(value); - } - /* break missing intentionally */ - case IS_CONST: - if (PZVAL_IS_REF(value)) { - variable_ptr = *variable_ptr_ptr = (zval *) emalloc(sizeof(zval)); - *variable_ptr = *value; - zval_copy_ctor(variable_ptr); - variable_ptr->refcount=1; - variable_ptr->EA.locks = 0; - break; - } - *variable_ptr_ptr = value; - value->refcount++; - break; - case IS_TMP_VAR: - (*variable_ptr_ptr) = (zval *) emalloc(sizeof(zval)); - value->refcount=1; - value->EA.locks = 0; - **variable_ptr_ptr = *value; - break; - } - } - (*variable_ptr_ptr)->EA.is_ref=0; - } - if (result) { - Ts[result->u.var].var.ptr_ptr = variable_ptr_ptr; - SELECTIVE_PZVAL_LOCK(*variable_ptr_ptr, result); - } -} - - -/* Utility Functions for Extensions */ -static void zend_extension_statement_handler(zend_extension *extension, zend_op_array *op_array) -{ - if (extension->statement_handler) { - extension->statement_handler(op_array); - } -} - - -static void zend_extension_fcall_begin_handler(zend_extension *extension, zend_op_array *op_array) -{ - if (extension->fcall_begin_handler) { - extension->fcall_begin_handler(op_array); - } -} - - -static void zend_extension_fcall_end_handler(zend_extension *extension, zend_op_array *op_array) -{ - if (extension->fcall_end_handler) { - extension->fcall_end_handler(op_array); - } -} - - -static void print_refcount(zval *p, char *str) -{ - print_refcount(NULL, NULL); -} - - -static inline void zend_fetch_var_address(znode *result, znode *op1, znode *op2, temp_variable *Ts, int type ELS_DC) -{ - int free_op1; - zval *varname = get_zval_ptr(op1, Ts, &free_op1, BP_VAR_R); - zval **retval; - zval tmp_varname; - HashTable *target_symbol_table; - - switch (op2->u.fetch_type) { - case ZEND_FETCH_LOCAL: - default: /* just to shut gcc up */ - target_symbol_table = EG(active_symbol_table); - break; - case ZEND_FETCH_GLOBAL: - if (op1->op_type == IS_VAR) { - PZVAL_LOCK(varname); - } - target_symbol_table = &EG(symbol_table); - break; - case ZEND_FETCH_STATIC: - if (!EG(active_op_array)->static_variables) { - EG(active_op_array)->static_variables = (HashTable *) emalloc(sizeof(HashTable)); - zend_hash_init(EG(active_op_array)->static_variables, 2, NULL, PVAL_PTR_DTOR, 0); - } - target_symbol_table = EG(active_op_array)->static_variables; - break; - } - - if (varname->type != IS_STRING) { - tmp_varname = *varname; - zval_copy_ctor(&tmp_varname); - convert_to_string(&tmp_varname); - varname = &tmp_varname; - } - if (zend_hash_find(target_symbol_table, varname->value.str.val, varname->value.str.len+1, (void **) &retval) == FAILURE) { - switch (type) { - case BP_VAR_R: - zend_error(E_NOTICE,"Undefined variable: %s", varname->value.str.val); - /* break missing intentionally */ - case BP_VAR_IS: - retval = &EG(uninitialized_zval_ptr); - break; - case BP_VAR_RW: - zend_error(E_NOTICE,"Undefined variable: %s", varname->value.str.val); - /* break missing intentionally */ - case BP_VAR_W: { - zval *new_zval = &EG(uninitialized_zval); - - new_zval->refcount++; - zend_hash_update_ptr(target_symbol_table, varname->value.str.val, varname->value.str.len+1, new_zval, sizeof(zval *), (void **) &retval); - } - break; - } - } - if (op2->u.fetch_type == ZEND_FETCH_LOCAL) { - FREE_OP(op1, free_op1); - } else if (op2->u.fetch_type == ZEND_FETCH_STATIC) { - zval_update_constant(*retval); - } - - if (varname == &tmp_varname) { - zval_dtor(varname); - } - Ts[result->u.var].var.ptr_ptr = retval; - SELECTIVE_PZVAL_LOCK(*retval, result); -} - - -static inline zval **zend_fetch_dimension_address_inner(HashTable *ht, znode *op2, temp_variable *Ts, int type ELS_DC) -{ - int free_op2; - zval *dim = get_zval_ptr(op2, Ts, &free_op2, BP_VAR_R); - zval **retval; - - switch (dim->type) { - case IS_STRING: { - if (zend_hash_find(ht, dim->value.str.val, dim->value.str.len+1, (void **) &retval) == FAILURE) { - switch (type) { - case BP_VAR_R: - zend_error(E_NOTICE,"Undefined index: %s", dim->value.str.val); - /* break missing intentionally */ - case BP_VAR_IS: - retval = &EG(uninitialized_zval_ptr); - break; - case BP_VAR_RW: - zend_error(E_NOTICE,"Undefined index: %s", dim->value.str.val); - /* break missing intentionally */ - case BP_VAR_W: { - zval *new_zval = &EG(uninitialized_zval); - - new_zval->refcount++; - zend_hash_update_ptr(ht, dim->value.str.val, dim->value.str.len+1, new_zval, sizeof(zval *), (void **) &retval); - } - break; - } - } - } - break; - case IS_DOUBLE: - case IS_LONG: { - long index; - - if(dim->type == IS_LONG) { - index = dim->value.lval; - } else { - index = (long)dim->value.dval; - } - if (zend_hash_index_find(ht, index, (void **) &retval) == FAILURE) { - switch (type) { - case BP_VAR_R: - zend_error(E_NOTICE,"Undefined offset: %d", index); - /* break missing intentionally */ - case BP_VAR_IS: - retval = &EG(uninitialized_zval_ptr); - break; - case BP_VAR_RW: - zend_error(E_NOTICE,"Undefined offset: %d", index); - /* break missing intentionally */ - case BP_VAR_W: { - zval *new_zval = &EG(uninitialized_zval); - - new_zval->refcount++; - zend_hash_index_update(ht, index, &new_zval, sizeof(zval *), (void **) &retval); - } - break; - } - } - } - break; - default: - zend_error(E_WARNING, "Illegal offset type"); - if (type == BP_VAR_R || type == BP_VAR_IS) { - retval = &EG(uninitialized_zval_ptr); - } else { - retval = &EG(error_zval_ptr); - } - break; - } - FREE_OP(op2, free_op2); - return retval; -} - - -static inline void zend_fetch_dimension_address(znode *result, znode *op1, znode *op2, temp_variable *Ts, int type ELS_DC) -{ - int free_op2; - zval **container_ptr = get_zval_ptr_ptr(op1, Ts, type); - zval *container; - zval ***retval = &Ts[result->u.var].var.ptr_ptr; - - - if (container_ptr == NULL) { - zend_property_reference *property_reference; - zend_overloaded_element overloaded_element; - - if (Ts[op1->u.var].EA.type == IS_STRING_OFFSET) { - zval_ptr_dtor(&Ts[op1->u.var].EA.str); - switch (type) { - case BP_VAR_R: - case BP_VAR_IS: - *retval = &EG(uninitialized_zval_ptr); - return; - case BP_VAR_W: - case BP_VAR_RW: - *retval = &EG(error_zval_ptr); - return; - } - } - - /* prepare the new element */ - overloaded_element.element = *get_zval_ptr(op2, Ts, &free_op2, type); - overloaded_element.type = IS_ARRAY; - if (!free_op2) { - zval_copy_ctor(&overloaded_element.element); - } - - zend_stack_top(&EG(overloaded_objects_stack), (void **) &property_reference); - - zend_llist_add_element(&property_reference->elements_list, &overloaded_element); - - Ts[result->u.var].EA.type = IS_OVERLOADED_OBJECT; - *retval = NULL; - return; - } - container = *container_ptr; - - if (container == EG(error_zval_ptr)) { - *retval = &EG(error_zval_ptr); - SELECTIVE_PZVAL_LOCK(**retval, result); - return; - } - - if (container->type == IS_STRING && container->value.str.len==0) { - switch (type) { - case BP_VAR_RW: - case BP_VAR_W: - if (!PZVAL_IS_REF(container)) { - container->refcount--; - if (container->refcount>0) { - container = *container_ptr = (zval *) emalloc(sizeof(zval)); - container->EA.is_ref=0; - container->EA.locks = 0; - } - container->refcount=1; - } - array_init(container); - break; - } - } - - switch (container->type) { - case IS_ARRAY: - if ((type==BP_VAR_W || type==BP_VAR_RW) && container->refcount>1 && !PZVAL_IS_REF(container)) { - container->refcount--; - *container_ptr = (zval *) emalloc(sizeof(zval)); - **container_ptr = *container; - container = *container_ptr; - INIT_PZVAL(container); - zendi_zval_copy_ctor(*container); - } - if (op2->op_type == IS_UNUSED) { - zval *new_zval = &EG(uninitialized_zval); - - new_zval->refcount++; - zend_hash_next_index_insert_ptr(container->value.ht, new_zval, sizeof(zval *), (void **) retval); - } else { - *retval = zend_fetch_dimension_address_inner(container->value.ht, op2, Ts, type ELS_CC); - } - SELECTIVE_PZVAL_LOCK(**retval, result); - break; - case IS_STRING: { - zval *offset; - offset = get_zval_ptr(op2, Ts, &free_op2, BP_VAR_R); - - if (container->value.str.val == undefined_variable_string) { - /* for read-mode only */ - *retval = &EG(uninitialized_zval_ptr); - SELECTIVE_PZVAL_LOCK(**retval, result); - FREE_OP(op2, free_op2); - } else { - zval tmp; - - if (offset->type != IS_LONG) { - tmp = *offset; - zval_copy_ctor(&tmp); - convert_to_long(&tmp); - offset = &tmp; - } - Ts[result->u.var].EA.str = container; - container->refcount++; - Ts[result->u.var].EA.offset = offset->value.lval; - Ts[result->u.var].EA.type = IS_STRING_OFFSET; - FREE_OP(op2, free_op2); - *retval = NULL; - return; - } - } - break; - default: { - zval *offset; - - offset = get_zval_ptr(op2, Ts, &free_op2, BP_VAR_R); - if (type==BP_VAR_R || type==BP_VAR_IS) { - *retval = &EG(uninitialized_zval_ptr); - } else { - *retval = &EG(error_zval_ptr); - } - FREE_OP(op2, free_op2); - SELECTIVE_PZVAL_LOCK(**retval, result); - } - break; - } -} - - -static inline void zend_fetch_dimension_address_from_tmp_var(znode *result, znode *op1, znode *op2, temp_variable *Ts ELS_DC) -{ - int free_op1; - zval *container = get_zval_ptr(op1, Ts, &free_op1, BP_VAR_R); - - if (container->type != IS_ARRAY) { - Ts[result->u.var].var.ptr_ptr = &EG(uninitialized_zval_ptr); - SELECTIVE_PZVAL_LOCK(*Ts[result->u.var].var.ptr_ptr, result); - return; - } - - Ts[result->u.var].var.ptr_ptr = zend_fetch_dimension_address_inner(container->value.ht, op2, Ts, BP_VAR_R ELS_CC); - SELECTIVE_PZVAL_LOCK(*Ts[result->u.var].var.ptr_ptr, result); -} - - -static inline void zend_fetch_property_address(znode *result, znode *op1, znode *op2, temp_variable *Ts, int type ELS_DC) -{ - int free_op2; - zval **container_ptr = get_zval_ptr_ptr(op1, Ts, type); - zval *container; - zval ***retval = &Ts[result->u.var].var.ptr_ptr; - - - if (container_ptr == NULL) { - zend_property_reference *property_reference; - zend_overloaded_element overloaded_element; - - if (Ts[op1->u.var].EA.type == IS_STRING_OFFSET) { - zval_ptr_dtor(&Ts[op1->u.var].EA.str); - switch (type) { - case BP_VAR_R: - case BP_VAR_IS: - *retval = &EG(uninitialized_zval_ptr); - return; - case BP_VAR_W: - case BP_VAR_RW: - *retval = &EG(error_zval_ptr); - return; - } - } - - overloaded_element.element = *get_zval_ptr(op2, Ts, &free_op2, type); - overloaded_element.type = IS_OBJECT; - if (!free_op2) { - zval_copy_ctor(&overloaded_element.element); - } - - zend_stack_top(&EG(overloaded_objects_stack), (void **) &property_reference); - - zend_llist_add_element(&property_reference->elements_list, &overloaded_element); - - Ts[result->u.var].EA.type = IS_OVERLOADED_OBJECT; - *retval = NULL; - return; - } - - container = *container_ptr; - if (container == EG(error_zval_ptr)) { - *retval = &EG(error_zval_ptr); - SELECTIVE_PZVAL_LOCK(**retval, result); - return; - } - - if (container->type == IS_OBJECT - && container->value.obj.ce->handle_property_get) { - zend_property_reference property_reference; - zend_overloaded_element overloaded_element; - - property_reference.object = container; - property_reference.type = type; - zend_llist_init(&property_reference.elements_list, sizeof(zend_overloaded_element), NULL, 0); - overloaded_element.element = *get_zval_ptr(op2, Ts, &free_op2, type); - overloaded_element.type = IS_OBJECT; - if (!free_op2) { - zval_copy_ctor(&overloaded_element.element); - } - zend_llist_add_element(&property_reference.elements_list, &overloaded_element); - zend_stack_push(&EG(overloaded_objects_stack), &property_reference, sizeof(zend_property_reference)); - Ts[result->u.var].EA.type = IS_OVERLOADED_OBJECT; - *retval = NULL; - return; - } - - - - if (container->type == IS_STRING && container->value.str.len==0) { - switch (type) { - case BP_VAR_RW: - case BP_VAR_W: - if (!PZVAL_IS_REF(container)) { - container->refcount--; - if (container->refcount>0) { - container = *container_ptr = (zval *) emalloc(sizeof(zval)); - container->EA.is_ref=0; - container->EA.locks = 0; - } - container->refcount=1; - } - object_init(container); - break; - } - } - - if (container->type != IS_OBJECT) { - zval *offset; - - offset = get_zval_ptr(op2, Ts, &free_op2, BP_VAR_R); - FREE_OP(op2, free_op2); - if (type==BP_VAR_R || type==BP_VAR_IS) { - *retval = &EG(uninitialized_zval_ptr); - SELECTIVE_PZVAL_LOCK(**retval, result); - return; - } else { - *retval = &EG(error_zval_ptr); - SELECTIVE_PZVAL_LOCK(**retval, result); - return; - } - } - - - if ((type==BP_VAR_W || type==BP_VAR_RW) && container->refcount>1 && !PZVAL_IS_REF(container)) { - container->refcount--; - *container_ptr = (zval *) emalloc(sizeof(zval)); - **container_ptr = *container; - container = *container_ptr; - INIT_PZVAL(container); - zendi_zval_copy_ctor(*container); - } - *retval = zend_fetch_property_address_inner(container->value.obj.properties, op2, Ts, type ELS_CC); - SELECTIVE_PZVAL_LOCK(**retval, result); -} - - -static zval get_overloaded_property(ELS_D) -{ - zend_property_reference *property_reference; - zval result; - - zend_stack_top(&EG(overloaded_objects_stack), (void **) &property_reference); - result = (property_reference->object)->value.obj.ce->handle_property_get(property_reference); - - zend_llist_destroy(&property_reference->elements_list); - - zend_stack_del_top(&EG(overloaded_objects_stack)); - return result; -} - - -static void set_overloaded_property(zval *value ELS_DC) -{ - zend_property_reference *property_reference; - - zend_stack_top(&EG(overloaded_objects_stack), (void **) &property_reference); - (property_reference->object)->value.obj.ce->handle_property_set(property_reference, value); - - zend_llist_destroy(&property_reference->elements_list); - - zend_stack_del_top(&EG(overloaded_objects_stack)); -} - - -static void call_overloaded_function(int arg_count, zval *return_value, HashTable *list, HashTable *plist ELS_DC) -{ - zend_property_reference *property_reference; - - zend_stack_top(&EG(overloaded_objects_stack), (void **) &property_reference); - (property_reference->object)->value.obj.ce->handle_function_call(arg_count, return_value, list, plist, property_reference->object, property_reference); - zend_llist_destroy(&property_reference->elements_list); - - zend_stack_del_top(&EG(overloaded_objects_stack)); -} - - -#if (HAVE_ALLOCA || (defined (__GNUC__) && __GNUC__ >= 2)) && !(defined(ZTS) && (WINNT|WIN32)) -# define do_alloca(p) alloca(p) -# define free_alloca(p) -#else -# define do_alloca(p) emalloc(p) -# define free_alloca(p) efree(p) -#endif - -typedef struct _object_info { - zval *ptr; - zval **ptr_ptr; -} object_info; - -void execute(zend_op_array *op_array ELS_DC) -{ - zend_op *opline = op_array->opcodes; - zend_op *end = op_array->opcodes + op_array->last; - zend_function_state function_state; - zend_function *function_being_called=NULL; - object_info object = {NULL, NULL}; -#if !defined (__GNUC__) || __GNUC__ < 2 - temp_variable *Ts = (temp_variable *) do_alloca(sizeof(temp_variable)*op_array->T); -#else - temp_variable Ts[op_array->T]; -#endif - -#if SUPPORT_INTERACTIVE - if (EG(interactive)) { - opline = op_array->opcodes + op_array->start_op_number; - end = op_array->opcodes + op_array->end_op_number; - } -#endif - - EG(opline_ptr) = &opline; - - function_state.function = (zend_function *) op_array; - EG(function_state_ptr) = &function_state; -#if ZEND_DEBUG - /* function_state.function_symbol_table is saved as-is to a stack, - * which is an intentional UMR. Shut it up if we're in DEBUG. - */ - function_state.function_symbol_table = NULL; -#endif - - if (op_array->uses_globals) { - zval *globals = (zval *) emalloc(sizeof(zval)); - - globals->refcount=1; - globals->EA.is_ref=1; - globals->EA.locks = 0; - globals->type = IS_ARRAY; - globals->value.ht = &EG(symbol_table); - if (zend_hash_add(EG(active_symbol_table), "GLOBALS", sizeof("GLOBALS"), &globals, sizeof(zval *), NULL)==FAILURE) { - efree(globals); - } - } - - while (opline<end) { - switch(opline->opcode) { - case ZEND_ADD: - EG(binary_op) = add_function; - goto binary_op_addr; - case ZEND_SUB: - EG(binary_op) = sub_function; - goto binary_op_addr; - case ZEND_MUL: - EG(binary_op) = mul_function; - goto binary_op_addr; - case ZEND_DIV: - EG(binary_op) = div_function; - goto binary_op_addr; - case ZEND_MOD: - EG(binary_op) = mod_function; - goto binary_op_addr; - case ZEND_SL: - EG(binary_op) = shift_left_function; - goto binary_op_addr; - case ZEND_SR: - EG(binary_op) = shift_right_function; - goto binary_op_addr; - case ZEND_CONCAT: - EG(binary_op) = concat_function; - goto binary_op_addr; - case ZEND_IS_EQUAL: - EG(binary_op) = is_equal_function; - goto binary_op_addr; - case ZEND_IS_NOT_EQUAL: - EG(binary_op) = is_not_equal_function; - goto binary_op_addr; - case ZEND_IS_SMALLER: - EG(binary_op) = is_smaller_function; - goto binary_op_addr; - case ZEND_IS_SMALLER_OR_EQUAL: - EG(binary_op) = is_smaller_or_equal_function; - goto binary_op_addr; - case ZEND_BW_OR: - EG(binary_op) = bitwise_or_function; - goto binary_op_addr; - case ZEND_BW_AND: - EG(binary_op) = bitwise_and_function; - goto binary_op_addr; - case ZEND_BW_XOR: - EG(binary_op) = bitwise_xor_function; - goto binary_op_addr; - case ZEND_BOOL_XOR: - EG(binary_op) = boolean_xor_function; - /* Fall through */ -binary_op_addr: - EG(binary_op)(&Ts[opline->result.u.var].tmp_var, - get_zval_ptr(&opline->op1, Ts, &EG(free_op1), BP_VAR_R), - get_zval_ptr(&opline->op2, Ts, &EG(free_op2), BP_VAR_R) ); - FREE_OP(&opline->op1, EG(free_op1)); - FREE_OP(&opline->op2, EG(free_op2)); - break; - case ZEND_BW_NOT: - case ZEND_BOOL_NOT: - EG(unary_op) = get_unary_op(opline->opcode); - EG(unary_op)(&Ts[opline->result.u.var].tmp_var, - get_zval_ptr(&opline->op1, Ts, &EG(free_op1), BP_VAR_R) ); - FREE_OP(&opline->op1, EG(free_op1)); - break; - - case ZEND_ASSIGN_ADD: - EG(binary_op) = add_function; - goto binary_assign_op_addr; - case ZEND_ASSIGN_SUB: - EG(binary_op) = sub_function; - goto binary_assign_op_addr; - case ZEND_ASSIGN_MUL: - EG(binary_op) = mul_function; - goto binary_assign_op_addr; - case ZEND_ASSIGN_DIV: - EG(binary_op) = div_function; - goto binary_assign_op_addr; - case ZEND_ASSIGN_MOD: - EG(binary_op) = mod_function; - goto binary_assign_op_addr; - case ZEND_ASSIGN_SL: - EG(binary_op) = shift_left_function; - goto binary_assign_op_addr; - case ZEND_ASSIGN_SR: - EG(binary_op) = shift_right_function; - goto binary_assign_op_addr; - case ZEND_ASSIGN_CONCAT: - EG(binary_op) = concat_function; - goto binary_assign_op_addr; - case ZEND_ASSIGN_BW_OR: - EG(binary_op) = bitwise_or_function; - goto binary_assign_op_addr; - case ZEND_ASSIGN_BW_AND: - EG(binary_op) = bitwise_and_function; - goto binary_assign_op_addr; - case ZEND_ASSIGN_BW_XOR: - EG(binary_op) = bitwise_xor_function; - /* Fall through */ -binary_assign_op_addr: { - zval **var_ptr = get_zval_ptr_ptr(&opline->op1, Ts, BP_VAR_RW); - int previous_lock_count; - - if (!var_ptr) { - zend_error(E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets"); - } - if (*var_ptr == EG(error_zval_ptr)) { - Ts[opline->result.u.var].var.ptr_ptr = &EG(uninitialized_zval_ptr); - SELECTIVE_PZVAL_LOCK(*Ts[opline->result.u.var].var.ptr_ptr, &opline->result); - opline++; - continue; - } - if (!PZVAL_IS_REF(*var_ptr)) { - if ((*var_ptr)->refcount>1) { - zval *orig_var=*var_ptr; - - (*var_ptr)->refcount--; - *var_ptr = (zval *) emalloc(sizeof(zval)); - **var_ptr = *orig_var; - zendi_zval_copy_ctor(**var_ptr); - (*var_ptr)->refcount=1; - (*var_ptr)->EA.locks = 0; - } - } - previous_lock_count = (*var_ptr)->EA.locks; - EG(binary_op)(*var_ptr, *var_ptr, get_zval_ptr(&opline->op2, Ts, &EG(free_op2), BP_VAR_R)); - (*var_ptr)->EA.locks = previous_lock_count; - Ts[opline->result.u.var].var.ptr_ptr = var_ptr; - SELECTIVE_PZVAL_LOCK(*var_ptr, &opline->result); - FREE_OP(&opline->op2, EG(free_op2)); - } - break; - case ZEND_PRE_INC: - case ZEND_PRE_DEC: - case ZEND_POST_INC: - case ZEND_POST_DEC: { - int (*incdec_op)(zval *op); - zval **var_ptr = get_zval_ptr_ptr(&opline->op1, Ts, BP_VAR_RW); - - if (!var_ptr) { - zend_error(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets"); - } - if (*var_ptr == EG(error_zval_ptr)) { - Ts[opline->result.u.var].var.ptr_ptr = &EG(uninitialized_zval_ptr); - SELECTIVE_PZVAL_LOCK(*Ts[opline->result.u.var].var.ptr_ptr, &opline->result); - opline++; - continue; - } - - get_incdec_op(incdec_op, opline->opcode); - - switch (opline->opcode) { - case ZEND_POST_INC: - case ZEND_POST_DEC: - Ts[opline->result.u.var].tmp_var = **var_ptr; - zendi_zval_copy_ctor(Ts[opline->result.u.var].tmp_var); - break; - } - if (!PZVAL_IS_REF(*var_ptr)) { - if ((*var_ptr)->refcount>1) { - zval *orig_var = *var_ptr; - - (*var_ptr)->refcount--; - *var_ptr = (zval *) emalloc(sizeof(zval)); - **var_ptr = *orig_var; - zendi_zval_copy_ctor(**var_ptr); - (*var_ptr)->refcount=1; - (*var_ptr)->EA.locks = 0; - } - } - incdec_op(*var_ptr); - switch (opline->opcode) { - case ZEND_PRE_INC: - case ZEND_PRE_DEC: - Ts[opline->result.u.var].var.ptr_ptr = var_ptr; - SELECTIVE_PZVAL_LOCK(*var_ptr, &opline->result); - break; - } - } - break; - case ZEND_PRINT: - zend_print_variable(get_zval_ptr(&opline->op1, Ts, &EG(free_op1), BP_VAR_R)); - Ts[opline->result.u.var].tmp_var.value.lval = 1; - Ts[opline->result.u.var].tmp_var.type = IS_LONG; - FREE_OP(&opline->op1, EG(free_op1)); - break; - case ZEND_ECHO: - zend_print_variable(get_zval_ptr(&opline->op1, Ts, &EG(free_op1), BP_VAR_R)); - FREE_OP(&opline->op1, EG(free_op1)); - break; - case ZEND_FETCH_R: - zend_fetch_var_address(&opline->result, &opline->op1, &opline->op2, Ts, BP_VAR_R ELS_CC); - break; - case ZEND_FETCH_W: - zend_fetch_var_address(&opline->result, &opline->op1, &opline->op2, Ts, BP_VAR_W ELS_CC); - break; - case ZEND_FETCH_RW: - zend_fetch_var_address(&opline->result, &opline->op1, &opline->op2, Ts, BP_VAR_RW ELS_CC); - break; - case ZEND_FETCH_IS: - zend_fetch_var_address(&opline->result, &opline->op1, &opline->op2, Ts, BP_VAR_IS ELS_CC); - break; - case ZEND_FETCH_DIM_R: - if (opline->extended_value == ZEND_FETCH_ADD_LOCK) { - PZVAL_LOCK(*Ts[opline->op1.u.var].var.ptr_ptr); - } - zend_fetch_dimension_address(&opline->result, &opline->op1, &opline->op2, Ts, BP_VAR_R ELS_CC); - break; - case ZEND_FETCH_DIM_W: - zend_fetch_dimension_address(&opline->result, &opline->op1, &opline->op2, Ts, BP_VAR_W ELS_CC); - break; - case ZEND_FETCH_DIM_RW: - zend_fetch_dimension_address(&opline->result, &opline->op1, &opline->op2, Ts, BP_VAR_RW ELS_CC); - break; - case ZEND_FETCH_DIM_IS: - zend_fetch_dimension_address(&opline->result, &opline->op1, &opline->op2, Ts, BP_VAR_IS ELS_CC); - break; - case ZEND_FETCH_OBJ_R: - zend_fetch_property_address(&opline->result, &opline->op1, &opline->op2, Ts, BP_VAR_R ELS_CC); - break; - case ZEND_FETCH_OBJ_W: - zend_fetch_property_address(&opline->result, &opline->op1, &opline->op2, Ts, BP_VAR_W ELS_CC); - break; - case ZEND_FETCH_OBJ_RW: - zend_fetch_property_address(&opline->result, &opline->op1, &opline->op2, Ts, BP_VAR_RW ELS_CC); - break; - case ZEND_FETCH_OBJ_IS: - zend_fetch_property_address(&opline->result, &opline->op1, &opline->op2, Ts, BP_VAR_IS ELS_CC); - break; - case ZEND_FETCH_DIM_TMP_VAR: - zend_fetch_dimension_address_from_tmp_var(&opline->result, &opline->op1, &opline->op2, Ts ELS_CC); - break; - case ZEND_ASSIGN: { - zval *value = get_zval_ptr(&opline->op2, Ts, &EG(free_op2), BP_VAR_R); - - zend_assign_to_variable(&opline->result, &opline->op1, &opline->op2, value, (EG(free_op2)?IS_TMP_VAR:opline->op2.op_type), Ts ELS_CC); - /* zend_assign_to_variable() always takes care of op2, never free it! */ - } - break; - case ZEND_ASSIGN_REF: - zend_assign_to_variable_reference(&opline->result, get_zval_ptr_ptr(&opline->op1, Ts, BP_VAR_W), get_zval_ptr_ptr(&opline->op2, Ts, BP_VAR_W), Ts ELS_CC); - break; - case ZEND_JMP: -#if DEBUG_ZEND>=2 - printf("Jumping to %d\n", opline->op1.u.opline_num); -#endif - opline = &op_array->opcodes[opline->op1.u.opline_num]; - continue; - break; - case ZEND_JMPZ: { - znode *op1 = &opline->op1; - - if (!i_zend_is_true(get_zval_ptr(op1, Ts, &EG(free_op1), BP_VAR_R))) { -#if DEBUG_ZEND>=2 - printf("Conditional jmp to %d\n", opline->op2.u.opline_num); -#endif - opline = &op_array->opcodes[opline->op2.u.opline_num]; - FREE_OP(op1, EG(free_op1)); - continue; - } - FREE_OP(op1, EG(free_op1)); - } - break; - case ZEND_JMPNZ: { - znode *op1 = &opline->op1; - - if (zend_is_true(get_zval_ptr(op1, Ts, &EG(free_op1), BP_VAR_R))) { -#if DEBUG_ZEND>=2 - printf("Conditional jmp to %d\n", opline->op2.u.opline_num); -#endif - opline = &op_array->opcodes[opline->op2.u.opline_num]; - FREE_OP(op1, EG(free_op1)); - continue; - } - FREE_OP(op1, EG(free_op1)); - } - break; - case ZEND_JMPZNZ: { - znode *res = &opline->result; - - if (!zend_is_true(get_zval_ptr(res, Ts, &EG(free_op1), BP_VAR_R))) { -#if DEBUG_ZEND>=2 - printf("Conditional jmp on false to %d\n", opline->op2.u.opline_num); -#endif - opline = &op_array->opcodes[opline->op2.u.opline_num]; - } else { -#if DEBUG_ZEND>=2 - printf("Conditional jmp on true to %d\n", opline->op1.u.opline_num); -#endif - opline = &op_array->opcodes[opline->op1.u.opline_num]; - } - FREE_OP(res, EG(free_op1)); - } - continue; - break; - case ZEND_JMPZ_EX: { - zend_op *original_opline = opline; - int retval = zend_is_true(get_zval_ptr(&original_opline->op1, Ts, &EG(free_op1), BP_VAR_R)); - - if (!retval) { -#if DEBUG_ZEND>=2 - printf("Conditional jmp to %d\n", opline->op2.u.opline_num); -#endif - opline = &op_array->opcodes[opline->op2.u.opline_num]; - FREE_OP(&original_opline->op1, EG(free_op1)); - Ts[original_opline->result.u.var].tmp_var.value.lval = retval; - Ts[original_opline->result.u.var].tmp_var.type = IS_LONG; - continue; - } - FREE_OP(&original_opline->op1, EG(free_op1)); - Ts[original_opline->result.u.var].tmp_var.value.lval = retval; - Ts[original_opline->result.u.var].tmp_var.type = IS_LONG; - } - break; - case ZEND_JMPNZ_EX: { - zend_op *original_opline = opline; - int retval = zend_is_true(get_zval_ptr(&original_opline->op1, Ts, &EG(free_op1), BP_VAR_R)); - - if (retval) { -#if DEBUG_ZEND>=2 - printf("Conditional jmp to %d\n", opline->op2.u.opline_num); -#endif - opline = &op_array->opcodes[opline->op2.u.opline_num]; - FREE_OP(&original_opline->op1, EG(free_op1)); - Ts[original_opline->result.u.var].tmp_var.value.lval = retval; - Ts[original_opline->result.u.var].tmp_var.type = IS_LONG; - continue; - } - FREE_OP(&original_opline->op1, EG(free_op1)); - Ts[original_opline->result.u.var].tmp_var.value.lval = retval; - Ts[original_opline->result.u.var].tmp_var.type = IS_LONG; - } - break; - case ZEND_FREE: - zendi_zval_dtor(Ts[opline->op1.u.var].tmp_var); - break; - case ZEND_INIT_STRING: - Ts[opline->result.u.var].tmp_var.value.str.val = emalloc(1); - Ts[opline->result.u.var].tmp_var.value.str.val[0] = 0; - Ts[opline->result.u.var].tmp_var.value.str.len = 0; - Ts[opline->result.u.var].tmp_var.refcount = 1; - break; - case ZEND_ADD_CHAR: - add_char_to_string( &Ts[opline->result.u.var].tmp_var, - get_zval_ptr(&opline->op1, Ts, &EG(free_op1), BP_VAR_NA), - &opline->op2.u.constant); - /* FREE_OP is missing intentionally here - we're always working on the same temporary variable */ - break; - case ZEND_ADD_STRING: - add_string_to_string( &Ts[opline->result.u.var].tmp_var, - get_zval_ptr(&opline->op1, Ts, &EG(free_op1), BP_VAR_NA), - &opline->op2.u.constant); - /* FREE_OP is missing intentionally here - we're always working on the same temporary variable */ - break; - case ZEND_ADD_VAR: { - zval *var = get_zval_ptr(&opline->op2, Ts, &EG(free_op2), BP_VAR_R); - zval var_copy; - int use_copy; - - zend_make_printable_zval(var, &var_copy, &use_copy); - if (use_copy) { - var = &var_copy; - } - add_string_to_string( &Ts[opline->result.u.var].tmp_var, - get_zval_ptr(&opline->op1, Ts, &EG(free_op1), BP_VAR_NA), - var); - if (use_copy) { - zval_dtor(var); - } - /* original comment, possibly problematic: - * FREE_OP is missing intentionally here - we're always working on the same temporary variable - * (Zeev): I don't think it's problematic, we only use variables - * which aren't affected by FREE_OP()'s anyway, unless they're - * string offsets or overloaded objects - */ - FREE_OP(&opline->op2, EG(free_op2)); - } - break; - case ZEND_INIT_FCALL_BY_NAME: { - zval *function_name; - zend_function *function; - HashTable *active_function_table; - zval tmp; - - zend_ptr_stack_n_push(&EG(arg_types_stack), 3, function_being_called, object.ptr, object.ptr_ptr); - /* - zend_ptr_stack_push(&EG(arg_types_stack), function_being_called); - zend_ptr_stack_push(&EG(arg_types_stack), object.ptr); - zend_ptr_stack_push(&EG(arg_types_stack), object.ptr_ptr); - */ - if (opline->extended_value & ZEND_CTOR_CALL) { - /* constructor call */ - - if (opline->op1.op_type == IS_VAR) { - PZVAL_LOCK(*Ts[opline->op1.u.var].var.ptr_ptr); - } - if (opline->op2.op_type==IS_VAR) { - PZVAL_LOCK(*Ts[opline->op2.u.var].var.ptr_ptr); - } - } - function_name = get_zval_ptr(&opline->op2, Ts, &EG(free_op2), BP_VAR_R); - - tmp = *function_name; - zval_copy_ctor(&tmp); - convert_to_string(&tmp); - function_name = &tmp; - zend_str_tolower(tmp.value.str.val, tmp.value.str.len); - - if (opline->op1.op_type != IS_UNUSED) { - if (opline->op1.op_type==IS_CONST) { /* used for class_name::function() */ - zend_class_entry *ce; - zval **object_ptr_ptr; - - if (zend_hash_find(EG(class_table), opline->op1.u.constant.value.str.val, opline->op1.u.constant.value.str.len+1, (void **) &ce)==FAILURE) { - zend_error(E_ERROR, "Undefined class name '%s'", opline->op1.u.constant.value.str.val); - } - active_function_table = &ce->function_table; - if (zend_hash_find(EG(active_symbol_table), "this", sizeof("this"), (void **) &object_ptr_ptr)==FAILURE) { - object.ptr=NULL; - } else { - object.ptr = *object_ptr_ptr; - object.ptr_ptr = object_ptr_ptr; - } - } else { /* used for member function calls */ - object.ptr = _get_object_zval_ptr(&opline->op1, Ts, &EG(free_op1), &object.ptr_ptr ELS_CC); - - if (!object.ptr - || ((object.ptr->type==IS_OBJECT) && (object.ptr->value.obj.ce->handle_function_call))) { /* overloaded function call */ - zend_overloaded_element overloaded_element; - zend_property_reference *property_reference; - - overloaded_element.element = *function_name; - overloaded_element.type = IS_METHOD; - - if (object.ptr) { - zend_property_reference property_reference; - - property_reference.object = object.ptr; - property_reference.type = BP_VAR_NA; - zend_llist_init(&property_reference.elements_list, sizeof(zend_overloaded_element), NULL, 0); - zend_stack_push(&EG(overloaded_objects_stack), &property_reference, sizeof(zend_property_reference)); - } - zend_stack_top(&EG(overloaded_objects_stack), (void **) &property_reference); - zend_llist_add_element(&property_reference->elements_list, &overloaded_element); - function_being_called = (zend_function *) emalloc(sizeof(zend_function)); - function_being_called->type = ZEND_OVERLOADED_FUNCTION; - function_being_called->common.arg_types = NULL; - goto overloaded_function_call_cont; - } - - if (object.ptr->type != IS_OBJECT) { - zend_error(E_ERROR, "Call to a member function on a non-object"); - } - active_function_table = &(object.ptr->value.obj.ce->function_table); - } - } else { /* function pointer */ - object.ptr = NULL; - active_function_table = EG(function_table); - } - if (zend_hash_find(active_function_table, function_name->value.str.val, function_name->value.str.len+1, (void **) &function)==FAILURE) { - zend_error(E_ERROR, "Call to undefined function: %s()", function_name->value.str.val); - } - zval_dtor(&tmp); - function_being_called = function; -overloaded_function_call_cont: - FREE_OP(&opline->op2, EG(free_op2)); - } - break; - case ZEND_DO_FCALL_BY_NAME: - function_state.function = function_being_called; - goto do_fcall_common; - case ZEND_DO_FCALL: { - zval *fname = get_zval_ptr(&opline->op1, Ts, &EG(free_op1), BP_VAR_R); - - if (zend_hash_find(EG(function_table), fname->value.str.val, fname->value.str.len+1, (void **) &function_state.function)==FAILURE) { - zend_error(E_ERROR, "Unknown function: %s()\n", fname->value.str.val); - } - FREE_OP(&opline->op1, EG(free_op1)); - goto do_fcall_common; - } -do_fcall_common: - { - zval *original_return_value; - - zend_ptr_stack_push(&EG(argument_stack), (void *) opline->extended_value); - if (function_state.function->type==ZEND_INTERNAL_FUNCTION) { - var_uninit(&Ts[opline->result.u.var].tmp_var); - ((zend_internal_function *) function_state.function)->handler(opline->extended_value, &Ts[opline->result.u.var].tmp_var, &EG(regular_list), &EG(persistent_list), (object.ptr?object.ptr:NULL)); - } else if (function_state.function->type==ZEND_USER_FUNCTION) { - HashTable *calling_symbol_table; - - if (EG(symtable_cache_ptr)>=EG(symtable_cache)) { - /*printf("Cache hit! Reusing %x\n", symtable_cache[symtable_cache_ptr]);*/ - function_state.function_symbol_table = *(EG(symtable_cache_ptr)--); - } else { - function_state.function_symbol_table = (HashTable *) emalloc(sizeof(HashTable)); - zend_hash_init(function_state.function_symbol_table, 0, NULL, PVAL_PTR_DTOR, 0); - /*printf("Cache miss! Initialized %x\n", function_state.function_symbol_table);*/ - } - calling_symbol_table = EG(active_symbol_table); - EG(active_symbol_table) = function_state.function_symbol_table; - if (opline->opcode==ZEND_DO_FCALL_BY_NAME - && object.ptr - && function_being_called->type!=ZEND_OVERLOADED_FUNCTION) { - zval **this_ptr; - zval *tmp; - - zend_hash_update_ptr(function_state.function_symbol_table, "this", sizeof("this"), NULL, sizeof(zval *), (void **) &this_ptr); - if (!PZVAL_IS_REF(object.ptr)) { - /* break it away */ - object.ptr->refcount--; - if (object.ptr->refcount>0) { - tmp = (zval *) emalloc(sizeof(zval)); - *tmp = *object.ptr; - zendi_zval_copy_ctor(*tmp); - object.ptr = tmp; - *object.ptr_ptr = tmp; - } - object.ptr->refcount = 1; - object.ptr->EA.is_ref = 1; - object.ptr->EA.locks = 0; - } - *this_ptr = object.ptr; - object.ptr->refcount++; - object.ptr = NULL; - } - original_return_value = EG(return_value); - EG(return_value) = &Ts[opline->result.u.var].tmp_var; - var_uninit(EG(return_value)); - EG(active_op_array) = (zend_op_array *) function_state.function; - zend_execute(EG(active_op_array) ELS_CC); - EG(opline_ptr) = &opline; - EG(active_op_array) = op_array; - EG(return_value)=original_return_value; - EG(destroying_function_symbol_table) = 1; - if (EG(symtable_cache_ptr)>=EG(symtable_cache_limit)) { - zend_hash_destroy(function_state.function_symbol_table); - efree(function_state.function_symbol_table); - } else { - *(++EG(symtable_cache_ptr)) = function_state.function_symbol_table; - zend_hash_clean(*EG(symtable_cache_ptr)); - } - EG(destroying_function_symbol_table) = 0; - EG(active_symbol_table) = calling_symbol_table; - } else { /* ZEND_OVERLOADED_FUNCTION */ - call_overloaded_function(opline->extended_value, &Ts[opline->result.u.var].tmp_var, &EG(regular_list), &EG(persistent_list) ELS_CC); - efree(function_being_called); - } - if (opline->opcode == ZEND_DO_FCALL_BY_NAME) { - zend_ptr_stack_n_pop(&EG(arg_types_stack), 3, &object.ptr_ptr, &object.ptr, &function_being_called); - /* - object.ptr_ptr = zend_ptr_stack_pop(&EG(arg_types_stack)); - object.ptr = zend_ptr_stack_pop(&EG(arg_types_stack)); - function_being_called = zend_ptr_stack_pop(&EG(arg_types_stack)); - */ - } - function_state.function = (zend_function *) op_array; - EG(function_state_ptr) = &function_state; - zend_ptr_stack_clear_multiple(ELS_C); - } - break; - case ZEND_RETURN: { - zval *retval = get_zval_ptr(&opline->op1, Ts, &EG(free_op1), BP_VAR_R); - - *EG(return_value) = *retval; - if (!EG(free_op1)) { - zendi_zval_copy_ctor(*EG(return_value)); - } -#if SUPPORT_INTERACTIVE - op_array->last_executed_op_number = opline-op_array->opcodes; -#endif - free_alloca(Ts); - return; - } - break; - case ZEND_SEND_VAL: - if (opline->extended_value==ZEND_DO_FCALL_BY_NAME - && function_being_called - && function_being_called->common.arg_types - && opline->op2.u.opline_num<=function_being_called->common.arg_types[0] - && function_being_called->common.arg_types[opline->op2.u.opline_num]==BYREF_FORCE) { - zend_error(E_ERROR, "Cannot pass parameter %d by reference", opline->op2.u.opline_num); - } - { - zval *valptr = (zval *) emalloc(sizeof(zval)); - - *valptr = Ts[opline->op1.u.var].tmp_var; - INIT_PZVAL(valptr); - zend_ptr_stack_push(&EG(argument_stack), valptr); - } - break; - case ZEND_SEND_VAR: - if (opline->extended_value==ZEND_DO_FCALL_BY_NAME - && function_being_called - && function_being_called->common.arg_types - && opline->op2.u.opline_num<=function_being_called->common.arg_types[0] - && function_being_called->common.arg_types[opline->op2.u.opline_num]==BYREF_FORCE) { - goto send_by_ref; - } - { - zval *varptr = get_zval_ptr(&opline->op1, Ts, &EG(free_op1), BP_VAR_R); - - if (varptr == &EG(uninitialized_zval)) { - varptr = (zval *) emalloc(sizeof(zval)); - var_uninit(varptr); - varptr->refcount=0; - varptr->EA.is_ref=0; - varptr->EA.locks = 0; - } else if (PZVAL_IS_REF(varptr)) { - zval *original_var = varptr; - - varptr = (zval *) emalloc(sizeof(zval)); - *varptr = *original_var; - varptr->EA.is_ref = 0; - varptr->EA.locks = 0; - varptr->refcount = 0; - zval_copy_ctor(varptr); - } - varptr->refcount++; - zend_ptr_stack_push(&EG(argument_stack), varptr); - FREE_OP(&opline->op1, EG(free_op1)); /* for string offsets */ - } - break; -send_by_ref: - case ZEND_SEND_REF: { - zval **varptr_ptr = get_zval_ptr_ptr(&opline->op1, Ts, BP_VAR_W); - zval *varptr = *varptr_ptr; - - if (!PZVAL_IS_REF(varptr)) { - /* code to break away this variable */ - if (varptr->refcount>1) { - varptr->refcount--; - *varptr_ptr = (zval *) emalloc(sizeof(zval)); - **varptr_ptr = *varptr; - varptr = *varptr_ptr; - varptr->refcount = 1; - zval_copy_ctor(varptr); - } - varptr->EA.is_ref = 1; - varptr->EA.locks = 0; - /* at the end of this code refcount is always 1 */ - } - varptr->refcount++; - zend_ptr_stack_push(&EG(argument_stack), varptr); - } - break; - case ZEND_RECV: { - zval **param; - - if (zend_ptr_stack_get_arg(opline->op1.u.constant.value.lval, (void **) ¶m ELS_CC)==FAILURE) { - zend_error(E_NOTICE, "Missing argument %d for %s()\n", opline->op1.u.constant.value.lval, get_active_function_name()); - if (opline->result.op_type == IS_VAR) { - PZVAL_UNLOCK(*Ts[opline->result.u.var].var.ptr_ptr); - } - } else if (PZVAL_IS_REF(*param)) { - zend_assign_to_variable_reference(NULL, get_zval_ptr_ptr(&opline->result, Ts, BP_VAR_W), param, NULL ELS_CC); - } else { - zend_assign_to_variable(NULL, &opline->result, NULL, *param, IS_VAR, Ts ELS_CC); - } - } - break; - case ZEND_RECV_INIT: { - zval **param, *assignment_value; - - if (zend_ptr_stack_get_arg(opline->op1.u.constant.value.lval, (void **) ¶m ELS_CC)==FAILURE) { - if (opline->op2.op_type == IS_UNUSED) { - if (opline->result.op_type == IS_VAR) { - PZVAL_UNLOCK(*Ts[opline->result.u.var].var.ptr_ptr); - } - break; - } - if (opline->op2.u.constant.type == IS_CONSTANT) { - zval *default_value = (zval *) emalloc(sizeof(zval)); - zval tmp; - - *default_value = opline->op2.u.constant; - if (!zend_get_constant(default_value->value.str.val, default_value->value.str.len, &tmp)) { - default_value->type = IS_STRING; - zval_copy_ctor(default_value); - } else { - *default_value = tmp; - } - default_value->refcount=0; - default_value->EA.is_ref=0; - default_value->EA.locks = 0; - param = &default_value; - assignment_value = default_value; - } else { - param = NULL; - assignment_value = &opline->op2.u.constant; - } - } else { - assignment_value = *param; - } - - if (PZVAL_IS_REF(assignment_value)) { - zend_assign_to_variable_reference(NULL, get_zval_ptr_ptr(&opline->result, Ts, BP_VAR_W), param, NULL ELS_CC); - } else { - zend_assign_to_variable(NULL, &opline->result, NULL, assignment_value, IS_VAR, Ts ELS_CC); - } - } - break; - case ZEND_BOOL: - /* PHP 3.0 returned "" for false and 1 for true, here we use 0 and 1 for now */ - Ts[opline->result.u.var].tmp_var.value.lval = zend_is_true(get_zval_ptr(&opline->op1, Ts, &EG(free_op1), BP_VAR_R)); - Ts[opline->result.u.var].tmp_var.type = IS_LONG; - FREE_OP(&opline->op1, EG(free_op1)); - break; - case ZEND_BRK: - case ZEND_CONT: { - zval *nest_levels_zval = get_zval_ptr(&opline->op2, Ts, &EG(free_op2), BP_VAR_R); - zval tmp; - int array_offset, nest_levels, original_nest_levels; - zend_brk_cont_element *jmp_to; - - if (nest_levels_zval->type != IS_LONG) { - tmp = *nest_levels_zval; - zval_copy_ctor(&tmp); - convert_to_long(&tmp); - nest_levels = tmp.value.lval; - } else { - nest_levels = nest_levels_zval->value.lval; - } - original_nest_levels = nest_levels; - array_offset = opline->op1.u.opline_num; - do { - if (array_offset==-1) { - zend_error(E_ERROR, "Cannot break/continue %d levels\n", original_nest_levels); - } - jmp_to = &op_array->brk_cont_array[array_offset]; - array_offset = jmp_to->parent; - } while (--nest_levels > 0); - - if (opline->opcode == ZEND_BRK) { - opline = op_array->opcodes+jmp_to->brk; - } else { - opline = op_array->opcodes+jmp_to->cont; - } - FREE_OP(&opline->op2, EG(free_op2)); - continue; - } - break; - case ZEND_CASE: { - int switch_expr_is_overloaded=0; - - if (opline->op1.op_type==IS_VAR) { - if (Ts[opline->op1.u.var].var.ptr_ptr) { - PZVAL_LOCK(*Ts[opline->op1.u.var].var.ptr_ptr); - } else { - switch_expr_is_overloaded = 1; - if (Ts[opline->op1.u.var].EA.type==IS_STRING_OFFSET) { - Ts[opline->op1.u.var].EA.str->refcount++; - } - } - } - is_equal_function(&Ts[opline->result.u.var].tmp_var, - get_zval_ptr(&opline->op1, Ts, &EG(free_op1), BP_VAR_R), - get_zval_ptr(&opline->op2, Ts, &EG(free_op2), BP_VAR_R)); - - FREE_OP(&opline->op2, EG(free_op2)); - if (switch_expr_is_overloaded) { - /* We only free op1 if this is a string offset, - * Since if it is a TMP_VAR, it'll be reused by - * other CASE opcodes (whereas string offsets - * are allocated at each get_zval_ptr()) - */ - FREE_OP(&opline->op1, EG(free_op1)); - Ts[opline->op1.u.var].var.ptr_ptr = NULL; - } - } - break; - case ZEND_SWITCH_FREE: - switch (opline->op1.op_type) { - case IS_VAR: - if (!Ts[opline->op1.u.var].var.ptr_ptr) { - get_zval_ptr(&opline->op1, Ts, &EG(free_op1), BP_VAR_R); - FREE_OP(&opline->op1, EG(free_op1)); - } - break; - case IS_TMP_VAR: - zendi_zval_dtor(Ts[opline->op1.u.var].tmp_var); - break; - } - break; - case ZEND_NEW: { - zval *tmp = get_zval_ptr(&opline->op1, Ts, &EG(free_op1), BP_VAR_R); - zval class_name; - zend_class_entry *ce; - - class_name = *tmp; - zval_copy_ctor(&class_name); - convert_to_string(&class_name); - zend_str_tolower(class_name.value.str.val, class_name.value.str.len); - - if (zend_hash_find(EG(class_table), class_name.value.str.val, class_name.value.str.len+1, (void **) &ce)==FAILURE) { - zend_error(E_ERROR, "Cannot instanciate non-existant class: %s", class_name.value.str.val); - } - object_init_ex(&Ts[opline->result.u.var].tmp_var, ce); - Ts[opline->result.u.var].tmp_var.refcount=1; - Ts[opline->result.u.var].tmp_var.EA.is_ref=1; - Ts[opline->result.u.var].tmp_var.EA.locks=0; - - zval_dtor(&class_name); - FREE_OP(&opline->op1, EG(free_op1)); - } - break; - case ZEND_FETCH_CONSTANT: - if (!zend_get_constant(opline->op1.u.constant.value.str.val, opline->op1.u.constant.value.str.len, &Ts[opline->result.u.var].tmp_var)) { - zend_error(E_NOTICE, "Use of undefined constant %s - assumed '%s'", - opline->op1.u.constant.value.str.val, - opline->op1.u.constant.value.str.val); - Ts[opline->result.u.var].tmp_var = opline->op1.u.constant; - zval_copy_ctor(&Ts[opline->result.u.var].tmp_var); - } - break; - case ZEND_INIT_ARRAY: - case ZEND_ADD_ARRAY_ELEMENT: { - zval *array_ptr = &Ts[opline->result.u.var].tmp_var; - zval *expr=get_zval_ptr(&opline->op1, Ts, &EG(free_op1), BP_VAR_R); - zval *offset=get_zval_ptr(&opline->op2, Ts, &EG(free_op2), BP_VAR_R); - - if (opline->opcode==ZEND_INIT_ARRAY) { - array_init(array_ptr); - if (!expr) { - break; - } - } - if (EG(free_op1)) { /* temporary variable */ - zval *new_expr = (zval *) emalloc(sizeof(zval)); - - *new_expr = *expr; - expr = new_expr; - INIT_PZVAL(expr); - } else { - if (PZVAL_IS_REF(expr)) { - zval *new_expr = (zval *) emalloc(sizeof(zval)); - - *new_expr = *expr; - expr = new_expr; - zendi_zval_copy_ctor(*expr); - INIT_PZVAL(expr); - } else { - expr->refcount++; - } - } - if (offset) { - switch(offset->type) { - case IS_DOUBLE: - zend_hash_index_update(array_ptr->value.ht, (long) offset->value.lval, &expr, sizeof(zval *), NULL); - break; - case IS_LONG: - zend_hash_index_update(array_ptr->value.ht, offset->value.lval, &expr, sizeof(zval *), NULL); - break; - case IS_STRING: - zend_hash_update(array_ptr->value.ht, offset->value.str.val, offset->value.str.len+1, &expr, sizeof(zval *), NULL); - break; - default: - /* do nothing */ - break; - } - FREE_OP(&opline->op2, EG(free_op2)); - } else { - zend_hash_next_index_insert(array_ptr->value.ht, &expr, sizeof(zval *), NULL); - } - } - break; - case ZEND_CAST: { - zval *expr = get_zval_ptr(&opline->op1, Ts, &EG(free_op1), BP_VAR_R); - zval *result = &Ts[opline->result.u.var].tmp_var; - - *result = *expr; - if (!EG(free_op1)) { - zendi_zval_copy_ctor(*result); - } - switch (opline->op2.u.constant.type) { - case IS_BOOL: - convert_to_boolean(result); - break; - case IS_LONG: - convert_to_long(result); - break; - case IS_DOUBLE: - convert_to_double(result); - break; - case IS_STRING: - convert_to_string(result); - break; - case IS_ARRAY: - convert_to_array(result); - break; - case IS_OBJECT: - convert_to_object(result); - break; - } - } - break; - case ZEND_INCLUDE_OR_EVAL: { - zend_op_array *new_op_array=NULL; - zval *original_return_value = EG(return_value); - CLS_FETCH(); - - switch (opline->op2.u.constant.value.lval) { - case ZEND_INCLUDE: - new_op_array = compile_filename(get_zval_ptr(&opline->op1, Ts, &EG(free_op1), BP_VAR_R) CLS_CC); - break; - case ZEND_EVAL: - new_op_array = compile_string(get_zval_ptr(&opline->op1, Ts, &EG(free_op1), BP_VAR_R) CLS_CC); - break; - } - FREE_OP(&opline->op1, EG(free_op1)); - if (new_op_array) { - Ts[opline->result.u.var].tmp_var.value.lval = 1; - Ts[opline->result.u.var].tmp_var.type = IS_LONG; - EG(return_value) = &Ts[opline->result.u.var].tmp_var; - EG(active_op_array) = new_op_array; - zend_execute(new_op_array ELS_CC); - - EG(opline_ptr) = &opline; - EG(active_op_array) = op_array; - EG(function_state_ptr) = &function_state; - destroy_op_array(new_op_array); - efree(new_op_array); - } else { - var_uninit(&Ts[opline->result.u.var].tmp_var); - } - EG(return_value) = original_return_value; - } - break; - case ZEND_UNSET_VAR: { - zval tmp, *variable = get_zval_ptr(&opline->op1, Ts, &EG(free_op1), BP_VAR_R); - - if (variable->type != IS_STRING) { - tmp = *variable; - zval_copy_ctor(&tmp); - convert_to_string(&tmp); - variable = &tmp; - } - - zend_hash_del(EG(active_symbol_table), variable->value.str.val, variable->value.str.len+1); - - if (variable == &tmp) { - zval_dtor(&tmp); - } - FREE_OP(&opline->op1, EG(free_op1)); - } - break; - case ZEND_UNSET_DIM_OBJ: { - zval **container = get_zval_ptr_ptr(&opline->op1, Ts, BP_VAR_R); - zval *offset = get_zval_ptr(&opline->op2, Ts, &EG(free_op2), BP_VAR_R); - - if (container) { - HashTable *ht; - - switch ((*container)->type) { - case IS_ARRAY: - ht = (*container)->value.ht; - break; - case IS_OBJECT: - ht = (*container)->value.obj.properties; - break; - default: - ht = NULL; - break; - } - if (ht) { - switch (offset->type) { - case IS_LONG: - zend_hash_index_del(ht, offset->value.lval); - break; - case IS_STRING: - zend_hash_del(ht, offset->value.str.val, offset->value.str.len+1); - break; - } - } - } else { - /* overloaded element */ - } - FREE_OP(&opline->op2, EG(free_op2)); - } - break; - case ZEND_FE_RESET: { - zval *array = get_zval_ptr(&opline->op1, Ts, &EG(free_op1), BP_VAR_R); - - Ts[opline->result.u.var].tmp_var = *array; - array = &Ts[opline->result.u.var].tmp_var; - if (!EG(free_op1)) { - zval_copy_ctor(array); - } - if (array->type == IS_ARRAY) { - /* probably redundant */ - zend_hash_internal_pointer_reset(array->value.ht); - } else { - /* JMP to the end of foreach - TBD */ - } - } - break; - case ZEND_FE_FETCH: { - zval *array = get_zval_ptr(&opline->op1, Ts, &EG(free_op1), BP_VAR_R); - zval *result = &Ts[opline->result.u.var].tmp_var; - zval **value, *key; - char *str_key; - ulong int_key; - - if (array->type != IS_ARRAY) { - zend_error(E_WARNING, "Non array argument supplied for foreach()"); - opline = op_array->opcodes+opline->op2.u.opline_num; - continue; - } else if (zend_hash_get_current_data(array->value.ht, (void **) &value)==FAILURE) { - opline = op_array->opcodes+opline->op2.u.opline_num; - continue; - } - array_init(result); - - - (*value)->refcount++; - zend_hash_index_update(result->value.ht, 0, value, sizeof(zval *), NULL); - - key = (zval *) emalloc(sizeof(zval)); - INIT_PZVAL(key); - switch (zend_hash_get_current_key(array->value.ht, &str_key, &int_key)) { - case HASH_KEY_IS_STRING: - key->value.str.val = str_key; - key->value.str.len = strlen(str_key); - key->type = IS_STRING; - break; - case HASH_KEY_IS_LONG: - key->value.lval = int_key; - key->type = IS_LONG; - break; - } - zend_hash_index_update(result->value.ht, 1, &key, sizeof(zval *), NULL); - zend_hash_move_forward(array->value.ht); - } - break; - case ZEND_JMP_NO_CTOR: { - zval *object; - - if (opline->op1.op_type == IS_VAR) { - PZVAL_LOCK(*Ts[opline->op1.u.var].var.ptr_ptr); - } - - object = get_zval_ptr(&opline->op1, Ts, &EG(free_op1), BP_VAR_R); - if (!object->value.obj.ce->handle_function_call - && !zend_hash_exists(&object->value.obj.ce->function_table, object->value.obj.ce->name, object->value.obj.ce->name_length+1)) { - opline = op_array->opcodes + opline->op2.u.opline_num; - continue; - } - } - break; - case ZEND_ISSET_ISEMPTY: { - zval **var = get_zval_ptr_ptr(&opline->op1, Ts, BP_VAR_IS); - int isset; - - if (!var) { - if (Ts[opline->op1.u.var].EA.type==IS_STRING_OFFSET) { - if (Ts[opline->op1.u.var].EA.offset>=0 - && Ts[opline->op1.u.var].EA.offset<Ts[opline->op1.u.var].EA.str->value.str.len) { - isset = 1; - } else { - isset = 0; - } - } else { - isset = 1; - } - } else if (var==&EG(uninitialized_zval_ptr) - || ((*var)->type == IS_STRING && (*var)->value.str.val == undefined_variable_string)) { - isset = 0; - } else { - isset = 1; - } - - switch (opline->op2.u.constant.value.lval) { - case ZEND_ISSET: - Ts[opline->result.u.var].tmp_var.value.lval = isset; - break; - case ZEND_ISEMPTY: - if (!var) { - if (!isset - || Ts[opline->op1.u.var].EA.str->value.str.val[Ts[opline->op1.u.var].EA.offset]=='0') { - Ts[opline->result.u.var].tmp_var.value.lval = 1; - } else { - Ts[opline->result.u.var].tmp_var.value.lval = 0; - } - } else if (!isset || !zend_is_true(*var)) { - Ts[opline->result.u.var].tmp_var.value.lval = 1; - } else { - Ts[opline->result.u.var].tmp_var.value.lval = 0; - } - break; - } - Ts[opline->result.u.var].tmp_var.type = IS_BOOL; - } - break; - case ZEND_EXIT: - if (opline->op1.op_type != IS_UNUSED) { - zend_print_variable(get_zval_ptr(&opline->op1, Ts, &EG(free_op1), BP_VAR_R)); - FREE_OP(&opline->op1, EG(free_op1)); - } - zend_bailout(); - break; - case ZEND_BEGIN_SILENCE: - Ts[opline->result.u.var].tmp_var.value.lval = EG(error_reporting); - Ts[opline->result.u.var].tmp_var.type = IS_LONG; /* shouldn't be necessary */ - EG(error_reporting) = 0; - break; - case ZEND_END_SILENCE: - EG(error_reporting) = Ts[opline->op1.u.var].tmp_var.value.lval; - break; - case ZEND_QM_ASSIGN: { - zval *value = get_zval_ptr(&opline->op1, Ts, &EG(free_op1), BP_VAR_R); - - Ts[opline->result.u.var].tmp_var = *value; - if (!EG(free_op1)) { - zval_copy_ctor(&Ts[opline->result.u.var].tmp_var); - } - } - break; - case ZEND_EXT_STMT: - if (!EG(no_extensions)) { - zend_llist_apply_with_argument(&zend_extensions, (void (*)(void *, void *)) zend_extension_statement_handler, op_array); - } - break; - case ZEND_EXT_FCALL_BEGIN: - if (!EG(no_extensions)) { - zend_llist_apply_with_argument(&zend_extensions, (void (*)(void *, void *)) zend_extension_fcall_begin_handler, op_array); - } - break; - case ZEND_EXT_FCALL_END: - if (!EG(no_extensions)) { - zend_llist_apply_with_argument(&zend_extensions, (void (*)(void *, void *)) zend_extension_fcall_end_handler, op_array); - } - break; - case ZEND_DECLARE_FUNCTION_OR_CLASS: - do_bind_function_or_class(opline, EG(function_table), EG(class_table), 0); - break; - case ZEND_EXT_NOP: - case ZEND_NOP: - break; - default: - break; - } - opline++; - } -#if SUPPORT_INTERACTIVE - op_array->last_executed_op_number = opline-op_array->opcodes; -#endif - free_alloca(Ts); -} diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h deleted file mode 100644 index d192ed1f5d..0000000000 --- a/Zend/zend_execute.h +++ /dev/null @@ -1,77 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | Zend Engine | - +----------------------------------------------------------------------+ - | Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski | - +----------------------------------------------------------------------+ - | This source file is subject to version 0.91 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at | - | http://www.zend.com/license/0_91.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Andi Gutmans <andi@zend.com> | - | Zeev Suraski <zeev@zend.com> | - +----------------------------------------------------------------------+ -*/ - - -#ifndef _EXECUTE_H -#define _EXECUTE_H - -#include "zend_compile.h" -#include "zend_hash.h" - -typedef union _temp_variable { - zval tmp_var; - struct { - zval **ptr_ptr; - } var; - struct { - zval tmp_var; /* a dummy */ - - zval *str; - int offset; - unsigned char type; - } EA; -} temp_variable; - - -ZEND_API extern void (*zend_execute)(zend_op_array *op_array ELS_DC); - -void init_executor(CLS_D ELS_DC); -void shutdown_executor(ELS_D); -void execute(zend_op_array *op_array ELS_DC); -ZEND_API int zend_is_true(zval *op); -ZEND_API inline void safe_free_zval_ptr(zval *p); -ZEND_API void zend_eval_string(char *str, zval *retval CLS_DC ELS_DC); -ZEND_API inline int i_zend_is_true(zval *op); -ZEND_API void zval_update_constant(zval *p); -ZEND_API inline void zend_assign_to_variable_reference(znode *result, zval **variable_ptr_ptr, zval **value_ptr_ptr, temp_variable *Ts ELS_DC); - -/* dedicated Zend executor functions - do not use! */ -ZEND_API inline void zend_ptr_stack_clear_multiple(ELS_D); -ZEND_API inline int zend_ptr_stack_get_arg(int requested_arg, void **data ELS_DC); - -#if SUPPORT_INTERACTIVE -void execute_new_code(CLS_D); -#endif - - -/* services */ -ZEND_API char *get_active_function_name(); -ZEND_API char *zend_get_executed_filename(ELS_D); -ZEND_API uint zend_get_executed_lineno(ELS_D); - -#define zendi_zval_copy_ctor(p) zval_copy_ctor(&(p)) -#define zendi_zval_dtor(p) zval_dtor(&(p)) - -#define active_opline (*EG(opline_ptr)) - - -#define IS_OVERLOADED_OBJECT 1 -#define IS_STRING_OFFSET 2 - -#endif /* _EXECUTE_H */ diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c deleted file mode 100644 index 30e69815c7..0000000000 --- a/Zend/zend_execute_API.c +++ /dev/null @@ -1,556 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | Zend Engine | - +----------------------------------------------------------------------+ - | Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski | - +----------------------------------------------------------------------+ - | This source file is subject to version 0.91 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at | - | http://www.zend.com/license/0_91.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Andi Gutmans <andi@zend.com> | - | Zeev Suraski <zeev@zend.com> | - +----------------------------------------------------------------------+ -*/ - - -#include <stdio.h> -#include <signal.h> - -#include "zend.h" -#include "zend_compile.h" -#include "zend_execute.h" -#include "zend_API.h" -#include "zend_ptr_stack.h" -#include "zend_variables.h" -#include "zend_operators.h" -#include "zend_constants.h" -#include "zend_extensions.h" - - -ZEND_API void (*zend_execute)(zend_op_array *op_array ELS_DC); - - -#if ZEND_DEBUG -static void (*original_sigsegv_handler)(int); -static void zend_handle_sigsegv(int dummy) -{ - fflush(stdout); - fflush(stderr); - if (original_sigsegv_handler==zend_handle_sigsegv) { - signal(SIGSEGV, original_sigsegv_handler); - } else { - signal(SIGSEGV, SIG_DFL); - } - { - ELS_FETCH(); - - fprintf(stderr, "SIGSEGV caught on opcode %d on opline %d of %s() at %s:%d\n\n", - active_opline->opcode, - active_opline-EG(active_op_array)->opcodes, - get_active_function_name(), - zend_get_executed_filename(ELS_C), - zend_get_executed_lineno(ELS_C)); - } - if (original_sigsegv_handler!=zend_handle_sigsegv) { - original_sigsegv_handler(dummy); - } -} -#endif - - -static void zend_extension_activator(zend_extension *extension) -{ - if (extension->activate) { - extension->activate(); - } -} - - -static void zend_extension_deactivator(zend_extension *extension) -{ - if (extension->deactivate) { - extension->deactivate(); - } -} - - -void init_executor(CLS_D ELS_DC) -{ - var_uninit(&EG(uninitialized_zval)); - var_uninit(&EG(error_zval)); - EG(uninitialized_zval).refcount = 1; - EG(uninitialized_zval).EA.is_ref=0; - EG(uninitialized_zval).EA.locks = 0; - EG(uninitialized_zval_ptr)=&EG(uninitialized_zval); - EG(error_zval).refcount = 1; - EG(error_zval).EA.is_ref=0; - EG(error_zval).EA.locks = 0; - EG(error_zval_ptr)=&EG(error_zval); - EG(destroying_function_symbol_table) = 0; - zend_ptr_stack_init(&EG(arg_types_stack)); - zend_stack_init(&EG(overloaded_objects_stack)); -/* destroys stack frame, therefore makes core dumps worthless */ -#if 0 -#if ZEND_DEBUG - original_sigsegv_handler = signal(SIGSEGV, zend_handle_sigsegv); -#endif -#endif - EG(return_value) = &EG(global_return_value); - var_reset(EG(return_value)); - EG(symtable_cache_ptr) = EG(symtable_cache)-1; - EG(symtable_cache_limit)=EG(symtable_cache)+SYMTABLE_CACHE_SIZE-1; - EG(no_extensions)=0; - - EG(function_table) = CG(function_table); - EG(class_table) = CG(class_table); - - zend_ptr_stack_init(&EG(argument_stack)); - - EG(main_op_array) = NULL; - zend_hash_init(&EG(symbol_table), 50, NULL, PVAL_PTR_DTOR, 0); - EG(active_symbol_table) = &EG(symbol_table); - - zend_llist_apply(&zend_extensions, (void (*)(void *)) zend_extension_activator); - EG(opline_ptr) = NULL; -} - - -void shutdown_executor(ELS_D) -{ - zval_dtor(&EG(global_return_value)); - zend_ptr_stack_destroy(&EG(arg_types_stack)); - zend_stack_destroy(&EG(overloaded_objects_stack)); - - while (EG(symtable_cache_ptr)>=EG(symtable_cache)) { - zend_hash_destroy(*EG(symtable_cache_ptr)); - efree(*EG(symtable_cache_ptr)); - EG(symtable_cache_ptr)--; - } - zend_llist_apply(&zend_extensions, (void (*)(void *)) zend_extension_deactivator); - - zend_hash_destroy(&EG(symbol_table)); - - destroy_resource_list(); /* must be destroyed after the main symbol table is destroyed */ - - zend_ptr_stack_destroy(&EG(argument_stack)); - if (EG(main_op_array)) { - destroy_op_array(EG(main_op_array)); - efree(EG(main_op_array)); - } - clean_non_persistent_constants(); -#if ZEND_DEBUG - signal(SIGSEGV, original_sigsegv_handler); -#endif -} - - -ZEND_API char *get_active_function_name() -{ - ELS_FETCH(); - - switch(EG(function_state_ptr)->function->type) { - case ZEND_USER_FUNCTION: { - char *function_name = ((zend_op_array *) EG(function_state_ptr)->function)->function_name; - - if (function_name) { - return function_name; - } else { - return "main"; - } - } - break; - case ZEND_INTERNAL_FUNCTION: - return ((zend_internal_function *) EG(function_state_ptr)->function)->function_name; - break; - default: - return NULL; - } -} - - -ZEND_API char *zend_get_executed_filename(ELS_D) -{ - if (EG(opline_ptr)) { - return active_opline->filename; - } else { - return "[no active file]"; - } -} - - -ZEND_API uint zend_get_executed_lineno(ELS_D) -{ - if (EG(opline_ptr)) { - return active_opline->lineno; - } else { - return 0; - } -} - - -ZEND_API inline void safe_free_zval_ptr(zval *p) -{ - ELS_FETCH(); - - if (p!=EG(uninitialized_zval_ptr)) { - efree(p); - } -} - - -ZEND_API int _zval_ptr_dtor(zval **zval_ptr ZEND_FILE_LINE_DC) -{ - int locked = (*zval_ptr)->EA.locks; - -#if DEBUG_ZEND>=2 - printf("Reducing refcount for %x (%x): %d->%d\n", *zval_ptr, zval_ptr, (*zval_ptr)->refcount, (*zval_ptr)->refcount-1); -#endif - (*zval_ptr)->refcount--; - if ((*zval_ptr)->refcount==0) { - zval_dtor(*zval_ptr); - safe_free_zval_ptr(*zval_ptr); - } - if (locked) { - ELS_FETCH(); - - if (EG(destroying_function_symbol_table)) { - return 1; - } else { - return 0; /* don't kill the container bucket */ - } - } else { - return 1; - } -} - - -ZEND_API inline int i_zend_is_true(zval *op) -{ - int result; - - switch (op->type) { - case IS_LONG: - case IS_BOOL: - case IS_RESOURCE: - result = (op->value.lval?1:0); - break; - case IS_DOUBLE: - result = (op->value.dval ? 1 : 0); - break; - case IS_STRING: - if (op->value.str.len == 0 - || (op->value.str.len==1 && op->value.str.val[0]=='0')) { - result = 0; - } else { - result = 1; - } - break; - case IS_ARRAY: - result = (zend_hash_num_elements(op->value.ht)?1:0); - break; - case IS_OBJECT: - result = (zend_hash_num_elements(op->value.obj.properties)?1:0); - break; - default: - result = 0; - break; - } - return result; -} - - -ZEND_API int zend_is_true(zval *op) -{ - return i_zend_is_true(op); -} - - -ZEND_API void zval_update_constant(zval *p) -{ - if (p->type == IS_CONSTANT) { - zval c; - int refcount = p->refcount; - - if (!zend_get_constant(p->value.str.val, p->value.str.len, &c)) { - zend_error(E_NOTICE, "Use of undefined constant %s - assumed '%s'", - p->value.str.val, - p->value.str.val); - p->type = IS_STRING; - } else { - STR_FREE(p->value.str.val); - *p = c; - } - INIT_PZVAL(p); - p->refcount = refcount; - } -} - - -int call_user_function(HashTable *function_table, zval *object, zval *function_name, zval *retval, int param_count, zval *params[]) -{ - zval ***params_array = (zval ***) emalloc(sizeof(zval **)*param_count); - int i; - int ex_retval; - - for (i=0; i<param_count; i++) { - params_array[i] = ¶ms[i]; - } - ex_retval = call_user_function_ex(function_table, object, function_name, retval, param_count, params_array, 1); - efree(params_array); - return ex_retval; -} - - -int call_user_function_ex(HashTable *function_table, zval *object, zval *function_name, zval *retval, int param_count, zval **params[], int no_separation) -{ - int i; - zval *original_return_value; - HashTable *calling_symbol_table; - zend_function_state function_state; - zend_function_state *original_function_state_ptr; - zend_op_array *original_op_array; - zend_op **original_opline_ptr; - CLS_FETCH(); - ELS_FETCH(); - - if (object) { - if (object->type != IS_OBJECT) { - return FAILURE; - } - function_table = &object->value.obj.ce->function_table; - } - original_function_state_ptr = EG(function_state_ptr); - zend_str_tolower(function_name->value.str.val, function_name->value.str.len); - if (zend_hash_find(function_table, function_name->value.str.val, function_name->value.str.len+1, (void **) &function_state.function)==FAILURE) { - return FAILURE; - } - - for (i=0; i<param_count; i++) { - zval *param; - - if (function_state.function->common.arg_types - && i<function_state.function->common.arg_types[0] - && function_state.function->common.arg_types[i+1]==BYREF_FORCE - && !PZVAL_IS_REF(*params[i])) { - if ((*params[i])->refcount>1) { - zval *new_zval; - - if (no_separation) { - return FAILURE; - } - new_zval = (zval *) emalloc(sizeof(zval)); - *new_zval = **params[i]; - zval_copy_ctor(new_zval); - new_zval->refcount = 1; - new_zval->EA.locks = 0; - (*params[i])->refcount--; - *params[i] = new_zval; - } - (*params[i])->refcount++; - (*params[i])->EA.is_ref = 1; - param = *params[i]; - } else if (*params[i] != &EG(uninitialized_zval)) { - (*params[i])->refcount++; - param = *params[i]; - } else { - param = (zval *) emalloc(sizeof(zval)); - *param = **(params[i]); - INIT_PZVAL(param); - } - zend_ptr_stack_push(&EG(argument_stack), param); - } - - zend_ptr_stack_push(&EG(argument_stack), (void *) (long) param_count); - - var_uninit(retval); - if (function_state.function->type == ZEND_USER_FUNCTION) { - calling_symbol_table = EG(active_symbol_table); - EG(active_symbol_table) = (HashTable *) emalloc(sizeof(HashTable)); - zend_hash_init(EG(active_symbol_table), 0, NULL, PVAL_PTR_DTOR, 0); - if (object) { - zval *dummy = (zval *) emalloc(sizeof(zval)), **this_ptr; - - var_uninit(dummy); - INIT_PZVAL(dummy); - zend_hash_update_ptr(EG(active_symbol_table), "this", sizeof("this"), dummy, sizeof(zval *), (void **) &this_ptr); - zend_assign_to_variable_reference(NULL, this_ptr, &object, NULL ELS_CC); - } - original_return_value = EG(return_value); - original_op_array = EG(active_op_array); - EG(return_value) = retval; - EG(active_op_array) = (zend_op_array *) function_state.function; - original_opline_ptr = EG(opline_ptr); - zend_execute(EG(active_op_array) ELS_CC); - zend_hash_destroy(EG(active_symbol_table)); - efree(EG(active_symbol_table)); - EG(active_symbol_table) = calling_symbol_table; - EG(active_op_array) = original_op_array; - EG(return_value)=original_return_value; - EG(opline_ptr) = original_opline_ptr; - } else { - ((zend_internal_function *) function_state.function)->handler(param_count, retval, &EG(regular_list), &EG(persistent_list), object); - } - zend_ptr_stack_clear_multiple(ELS_C); - EG(function_state_ptr) = original_function_state_ptr; - - return SUCCESS; -} - - -ZEND_API void zend_eval_string(char *str, zval *retval CLS_DC ELS_DC) -{ - zval pv; - zend_op_array *new_op_array; - zend_op_array *original_active_op_array = EG(active_op_array); - zend_function_state *original_function_state_ptr = EG(function_state_ptr); - int original_handle_op_arrays; - - if (retval) { - pv.value.str.len = strlen(str)+sizeof("return ;")-1; - pv.value.str.val = emalloc(pv.value.str.len+1); - strcpy(pv.value.str.val, "return "); - strcat(pv.value.str.val, str); - strcat(pv.value.str.val, " ;"); - } else { - pv.value.str.len = strlen(str); - pv.value.str.val = estrndup(str, pv.value.str.len); - } - pv.type = IS_STRING; - - /*printf("Evaluating '%s'\n", pv.value.str.val);*/ - - original_handle_op_arrays = CG(handle_op_arrays); - CG(handle_op_arrays) = 0; - new_op_array = compile_string(&pv CLS_CC); - CG(handle_op_arrays) = original_handle_op_arrays; - - if (new_op_array) { - zval dummy_retval; - zval *original_return_value = EG(return_value); - zend_op **original_opline_ptr = EG(opline_ptr); - - EG(return_value) = (retval?retval:&dummy_retval); - var_reset(EG(return_value)); - EG(active_op_array) = new_op_array; - EG(no_extensions)=1; - zend_execute(new_op_array ELS_CC); - EG(no_extensions)=0; - EG(opline_ptr) = original_opline_ptr; - EG(active_op_array) = original_active_op_array; - EG(function_state_ptr) = original_function_state_ptr; - destroy_op_array(new_op_array); - efree(new_op_array); - EG(return_value) = original_return_value; - if (!retval) { - zval_dtor(&dummy_retval); - } - } else { - printf("Failed executing:\n%s\n", str); - } - zval_dtor(&pv); -} - - -ZEND_API inline void zend_assign_to_variable_reference(znode *result, zval **variable_ptr_ptr, zval **value_ptr_ptr, temp_variable *Ts ELS_DC) -{ - zval *variable_ptr = *variable_ptr_ptr; - zval *value_ptr; - - - if (!value_ptr_ptr) { - zend_error(E_ERROR, "Cannot create references to string offsets nor overloaded objects"); - return; - } - - value_ptr = *value_ptr_ptr; - if (variable_ptr == EG(error_zval_ptr) || value_ptr==EG(error_zval_ptr)) { - variable_ptr_ptr = &EG(uninitialized_zval_ptr); -/* } else if (variable_ptr==&EG(uninitialized_zval) || variable_ptr!=value_ptr) { */ - } else if (variable_ptr_ptr != value_ptr_ptr) { - variable_ptr->refcount--; - if (variable_ptr->refcount==0) { - zendi_zval_dtor(*variable_ptr); - efree(variable_ptr); - } - - if (!PZVAL_IS_REF(value_ptr)) { - /* break it away */ - value_ptr->refcount--; - if (value_ptr->refcount>0) { - *value_ptr_ptr = (zval *) emalloc(sizeof(zval)); - **value_ptr_ptr = *value_ptr; - value_ptr = *value_ptr_ptr; - zendi_zval_copy_ctor(*value_ptr); - } - value_ptr->refcount = 1; - value_ptr->EA.is_ref = 1; - value_ptr->EA.locks = 0; - } - - *variable_ptr_ptr = value_ptr; - value_ptr->refcount++; - } else { - /* nothing to do */ - } - - if (result && (result->op_type != IS_UNUSED)) { - Ts[result->u.var].var.ptr_ptr = variable_ptr_ptr; - SELECTIVE_PZVAL_LOCK(*variable_ptr_ptr, result); - } -} - - -#if SUPPORT_INTERACTIVE -void execute_new_code(CLS_D) -{ - ELS_FETCH(); - - if (!EG(interactive) - || CG(active_op_array)->backpatch_count>0 - || CG(active_op_array)->function_name - || CG(active_op_array)->type!=ZEND_USER_FUNCTION) { - return; - } - CG(active_op_array)->start_op_number = CG(active_op_array)->last_executed_op_number; - CG(active_op_array)->end_op_number = CG(active_op_array)->last; - EG(active_op_array) = CG(active_op_array); - zend_execute(CG(active_op_array) ELS_CC); - CG(active_op_array)->start_op_number = CG(active_op_array)->last_executed_op_number; -} -#endif - - -/* these are a dedicated, optimized, function, and shouldn't be used for any purpose - * other than by Zend's executor - */ -ZEND_API inline void zend_ptr_stack_clear_multiple(ELS_D) -{ - void **p = EG(argument_stack).top_element-1; - int delete_count = (ulong) *p; - - EG(argument_stack).top -= (delete_count+1); - while (--delete_count>=0) { - zval_ptr_dtor((zval **) --p); - } - EG(argument_stack).top_element = p; -} - - - -ZEND_API int zend_ptr_stack_get_arg(int requested_arg, void **data ELS_DC) -{ - void **p = EG(argument_stack).top_element-1; - int arg_count = (ulong) *p; - - if (requested_arg>arg_count) { - return FAILURE; - } - *data = (p-arg_count+requested_arg-1); - return SUCCESS; -} - diff --git a/Zend/zend_extensions.c b/Zend/zend_extensions.c deleted file mode 100644 index c08e0c086a..0000000000 --- a/Zend/zend_extensions.c +++ /dev/null @@ -1,157 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | Zend Engine | - +----------------------------------------------------------------------+ - | Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski | - +----------------------------------------------------------------------+ - | This source file is subject to version 0.91 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at | - | http://www.zend.com/license/0_91.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Andi Gutmans <andi@zend.com> | - | Zeev Suraski <zeev@zend.com> | - +----------------------------------------------------------------------+ -*/ - - -#include "zend_extensions.h" - -ZEND_API zend_llist zend_extensions; -static int last_resource_number; - -int zend_load_extensions(char **extension_paths) -{ - char **p = extension_paths; - - if (!p) { - return SUCCESS; - } - while (*p) { - if (zend_load_extension(*p)==FAILURE) { - return FAILURE; - } - p++; - } - return SUCCESS; -} - - -int zend_load_extension(char *path) -{ -#if ZEND_EXTENSIONS_SUPPORT - DL_HANDLE handle; - zend_extension extension, *new_extension; - zend_extension_version_info *extension_version_info; - - handle = DL_LOAD(path); - if (!handle) { -#if !(WIN32||WINNT) - fprintf(stderr, "Failed loading %s: %s\n", path, dlerror()); -#else - fprintf(stderr, "Failed loading %s\n", path); -#endif - return FAILURE; - } - - extension_version_info = (zend_extension_version_info *) DL_FETCH_SYMBOL(handle, "extension_version_info"); - new_extension = (zend_extension *) DL_FETCH_SYMBOL(handle, "zend_extension_entry"); - if (!extension_version_info || !new_extension) { - fprintf(stderr, "%s doesn't appear to be a valid Zend extension\n", path); - return FAILURE; - } - - if (extension_version_info->zend_extension_api_no > ZEND_EXTENSION_API_NO) { - fprintf(stderr, "%s requires Zend version %s or later\n" - "Current version %s, API version %d\n", - new_extension->name, - extension_version_info->required_zend_version, - ZEND_VERSION, - ZEND_EXTENSION_API_NO); - DL_UNLOAD(handle); - return FAILURE; - } else if (extension_version_info->zend_extension_api_no < ZEND_EXTENSION_API_NO) { - /* we may be able to allow for downwards compatability in some harmless cases. */ - fprintf(stderr, "%s is outdated (API version %d, current version %d)\n" - "Contact %s at %s for a later version of this module.\n", - new_extension->name, - extension_version_info->zend_extension_api_no, - ZEND_EXTENSION_API_NO, - new_extension->author, - new_extension->URL); - DL_UNLOAD(handle); - return FAILURE; - } else if (ZTS_V!=extension_version_info->thread_safe) { - fprintf(stderr, "Cannot load %s - it %s thread safe, whereas Zend %s\n", - new_extension->name, - (extension_version_info->thread_safe?"is":"isn't"), - (ZTS_V?"is":"isn't")); - DL_UNLOAD(handle); - return FAILURE; - } else if (ZEND_DEBUG!=extension_version_info->debug) { - fprintf(stderr, "Cannot load %s - it %s debug information, whereas Zend %s\n", - new_extension->name, - (extension_version_info->debug?"contains":"does not contain"), - (ZEND_DEBUG?"does":"does not")); - DL_UNLOAD(handle); - return FAILURE; - } - - if (new_extension->startup) { - if (new_extension->startup(new_extension)!=SUCCESS) { - DL_UNLOAD(handle); - return FAILURE; - } - } - extension = *new_extension; - extension.handle = handle; - - zend_llist_add_element(&zend_extensions, &extension); - - /*fprintf(stderr, "Loaded %s, version %s\n", extension.name, extension.version);*/ - - zend_append_version_info(&extension); - return SUCCESS; -#else - fprintf(stderr, "Extensions are not supported on this platform.\n"); - return FAILURE; -#endif -} - -static void zend_extension_shutdown(zend_extension *extension) -{ -#if ZEND_EXTENSIONS_SUPPORT - if (extension->shutdown) { - extension->shutdown(extension); - } -#endif -} - - -void zend_shutdown_extensions() -{ - zend_llist_apply(&zend_extensions, (void (*)(void *)) zend_extension_shutdown); - zend_llist_destroy(&zend_extensions); -} - - -void zend_extension_dtor(zend_extension *extension) -{ -#if ZEND_EXTENSIONS_SUPPORT - DL_UNLOAD(extension->handle); -#endif -} - - -ZEND_API int zend_get_resource_handle(zend_extension *extension) -{ - if (last_resource_number<4) { - extension->resource_number = last_resource_number; - return last_resource_number; - } else { - return -1; - } -} diff --git a/Zend/zend_extensions.h b/Zend/zend_extensions.h deleted file mode 100644 index a6b9ff7c5b..0000000000 --- a/Zend/zend_extensions.h +++ /dev/null @@ -1,96 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | Zend Engine | - +----------------------------------------------------------------------+ - | Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski | - +----------------------------------------------------------------------+ - | This source file is subject to version 0.91 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at | - | http://www.zend.com/license/0_91.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Andi Gutmans <andi@zend.com> | - | Zeev Suraski <zeev@zend.com> | - +----------------------------------------------------------------------+ -*/ - - -#ifndef _ZEND_EXTENSIONS_H -#define _ZEND_EXTENSIONS_H - -#include "zend_compile.h" - -#define ZEND_EXTENSION_API_NO 19990619 - -typedef struct _zend_extension_version_info { - int zend_extension_api_no; - char *required_zend_version; - unsigned char thread_safe; - unsigned char debug; -} zend_extension_version_info; - - -typedef struct _zend_extension zend_extension; - -struct _zend_extension { - char *name; - char *version; - char *author; - char *URL; - char *copyright; - - int (*startup)(zend_extension *extension); - void (*shutdown)(zend_extension *extension); - void (*activate)(); - void (*deactivate)(); - - void (*op_array_handler)(zend_op_array *op_array); - - void (*statement_handler)(zend_op_array *op_array); - void (*fcall_begin_handler)(zend_op_array *op_array); - void (*fcall_end_handler)(zend_op_array *op_array); - - void (*op_array_ctor)(void **resource); - void (*op_array_dtor)(void **resource); - - void *reserved1; - void *reserved2; - void *reserved3; - void *reserved4; - void *reserved5; - void *reserved6; - void *reserved7; - void *reserved8; - - DL_HANDLE handle; - int resource_number; -}; - - -ZEND_API int zend_get_resource_handle(); - -#ifdef ZTS -#define ZTS_V 1 -#else -#define ZTS_V 0 -#endif - - -#define ZEND_EXTENSION() \ - ZEND_EXT_API zend_extension_version_info extension_version_info = { ZEND_EXTENSION_API_NO, "0.90", ZTS_V, ZEND_DEBUG } - -#define STANDARD_ZEND_EXTENSION_PROPERTIES NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, -1 - - -ZEND_API extern zend_llist zend_extensions; - -void zend_extension_dtor(zend_extension *extension); -int zend_load_extension(char *path); -int zend_load_extensions(char **extension_paths); -void zend_append_version_info(zend_extension *extension); -void zend_shutdown_extensions(); - -#endif /* _ZEND_EXTENSIONS_H */ diff --git a/Zend/zend_globals.h b/Zend/zend_globals.h deleted file mode 100644 index 5e9d1f4d81..0000000000 --- a/Zend/zend_globals.h +++ /dev/null @@ -1,176 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | Zend Engine | - +----------------------------------------------------------------------+ - | Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski | - +----------------------------------------------------------------------+ - | This source file is subject to version 0.91 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at | - | http://www.zend.com/license/0_91.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Andi Gutmans <andi@zend.com> | - | Zeev Suraski <zeev@zend.com> | - +----------------------------------------------------------------------+ -*/ - - -#ifndef _T_GLOBALS_H -#define _T_GLOBALS_H - - -#include <setjmp.h> - -#include "zend_globals_macros.h" - -#include "zend_stack.h" -#include "zend_ptr_stack.h" -#include "zend_hash.h" -#include "zend_llist.h" - -/* Define ZTS if you want a thread-safe Zend */ -/*#undef ZTS*/ - -#ifdef ZTS -#include "../TSRM/TSRM.h" - -#ifdef __cplusplus -class ZendFlexLexer; -#endif - -BEGIN_EXTERN_C() -ZEND_API extern int compiler_globals_id; -ZEND_API extern int executor_globals_id; -extern int alloc_globals_id; -END_EXTERN_C() - -#endif - -#define SYMTABLE_CACHE_SIZE 32 - - -#include "zend_compile.h" -#include "zend_execute.h" - -struct _zend_compiler_globals { - zend_stack bp_stack; - zend_stack switch_cond_stack; - zend_stack foreach_copy_stack; - zend_stack object_stack; - - zend_class_entry class_entry, *active_class_entry; - - /* variables for list() compilation */ - zend_llist list_llist; - zend_llist dimension_llist; - - zend_stack function_call_stack; - - char *compiled_filename; - - int zend_lineno; - char *heredoc; - int heredoc_len; - - zend_op_array *active_op_array; - - HashTable *function_table; /* function symbol table */ - HashTable *class_table; /* class table */ - - zend_llist filenames_list; - - zend_bool short_tags; - zend_bool asp_tags; - - /* For extensions support */ - zend_bool extended_info; /* generate extension information for debugger/profiler */ - zend_bool handle_op_arrays; /* run op_arrays through op_array handlers */ - - zend_bool unclean_shutdown; - - zend_llist open_files; -#ifdef ZTS -#ifdef __cplusplus - ZendFlexLexer *ZFL; -#else - void *ZFL; -#endif -#endif -}; - - -struct _zend_executor_globals { - zval *return_value; - - zval uninitialized_zval; - zval *uninitialized_zval_ptr; - - zval error_zval; - zval *error_zval_ptr; - - zend_function_state *function_state_ptr; - zend_ptr_stack arg_types_stack; - zend_stack overloaded_objects_stack; - zval global_return_value; - - /* symbol table cache */ - HashTable *symtable_cache[SYMTABLE_CACHE_SIZE]; - HashTable **symtable_cache_limit; - HashTable **symtable_cache_ptr; - - zend_op **opline_ptr; - - HashTable *active_symbol_table; - HashTable symbol_table; /* main symbol table */ - - jmp_buf bailout; - - int error_reporting; - - zend_op_array *active_op_array; - zend_op_array *main_op_array; - - HashTable *function_table; /* function symbol table */ - HashTable *class_table; /* class table */ - HashTable *zend_constants; /* constants table */ - - long precision; - zend_bool destroying_function_symbol_table; - - /* for extended information support */ - zend_bool no_extensions; - - HashTable regular_list; - HashTable persistent_list; - - zend_ptr_stack argument_stack; - int free_op1, free_op2; - int (*unary_op)(zval *result, zval *op1); - int (*binary_op)(zval *result, zval *op1, zval *op2); - - void *reserved[ZEND_MAX_RESERVED_RESOURCES]; -#if SUPPORT_INTERACTIVE - int interactive; -#endif -}; - - - -struct _zend_alloc_globals { - mem_header *head; /* standard list */ - mem_header *phead; /* persistent list */ - void *cache[MAX_CACHED_MEMORY][MAX_CACHED_ENTRIES]; - unsigned char cache_count[MAX_CACHED_MEMORY]; - -#if MEMORY_LIMIT - unsigned int memory_limit; - unsigned int allocated_memory; - unsigned char memory_exhausted; -#endif -}; - - -#endif /* _T_GLOBALS_H */ diff --git a/Zend/zend_globals_macros.h b/Zend/zend_globals_macros.h deleted file mode 100644 index f6dea7f589..0000000000 --- a/Zend/zend_globals_macros.h +++ /dev/null @@ -1,90 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | Zend Engine | - +----------------------------------------------------------------------+ - | Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski | - +----------------------------------------------------------------------+ - | This source file is subject to version 0.91 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at | - | http://www.zend.com/license/0_91.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Andi Gutmans <andi@zend.com> | - | Zeev Suraski <zeev@zend.com> | - +----------------------------------------------------------------------+ -*/ - - -#ifndef _ZEND_GLOBALS_MACROS_H -#define _ZEND_GLOBALS_MACROS_H - -typedef struct _zend_compiler_globals zend_compiler_globals; -typedef struct _zend_executor_globals zend_executor_globals; -typedef struct _zend_alloc_globals zend_alloc_globals; - -/* Compiler */ -#ifdef ZTS -# define CLS_D zend_compiler_globals *compiler_globals -# define CLS_DC , CLS_D -# define CLS_C compiler_globals -# define CLS_CC , CLS_C -# define CG(v) (((zend_compiler_globals *) compiler_globals)->v) -# define CLS_FETCH() zend_compiler_globals *compiler_globals = (zend_compiler_globals *) ts_resource(compiler_globals_id) -# define YYPARSE_PARAM compiler_globals -# define YYLEX_PARAM compiler_globals -BEGIN_EXTERN_C() -int zendparse(void *compiler_globals); -END_EXTERN_C() -#else -# define CLS_D -# define CLS_DC -# define CLS_C -# define CLS_CC -# define CG(v) (compiler_globals.v) -# define CLS_FETCH() -extern ZEND_API struct _zend_compiler_globals compiler_globals; -int zendparse(); -#endif - - -/* Executor */ -#ifdef ZTS -# define ELS_D zend_executor_globals *executor_globals -# define ELS_DC , ELS_D -# define ELS_C executor_globals -# define ELS_CC , ELS_C -# define EG(v) (executor_globals->v) -# define ELS_FETCH() zend_executor_globals *executor_globals = (zend_executor_globals *) ts_resource(executor_globals_id) -#else -# define ELS_D -# define ELS_DC -# define ELS_C -# define ELS_CC -# define EG(v) (executor_globals.v) -# define ELS_FETCH() -extern ZEND_API zend_executor_globals executor_globals; -#endif - - -/* Memory Manager */ -#ifdef ZTS -# define ALS_D zend_alloc_globals *alloc_globals -# define ALS_DC , ALS_D -# define ALS_C alloc_globals -# define ALS_CC , ALS_C -# define AG(v) (((zend_alloc_globals *) alloc_globals)->v) -# define ALS_FETCH() zend_alloc_globals *alloc_globals = (zend_alloc_globals *) ts_resource(alloc_globals_id) -#else -# define ALS_D -# define ALS_DC -# define ALS_C -# define ALS_CC -# define AG(v) (alloc_globals.v) -# define ALS_FETCH() -#endif - -#endif /* _ZEND_GLOBALS_MACROS_H */ - diff --git a/Zend/zend_hash.c b/Zend/zend_hash.c deleted file mode 100644 index 19e45a47ef..0000000000 --- a/Zend/zend_hash.c +++ /dev/null @@ -1,1224 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | Zend Engine | - +----------------------------------------------------------------------+ - | Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski | - +----------------------------------------------------------------------+ - | This source file is subject to version 0.91 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at | - | http://www.zend.com/license/0_91.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Andi Gutmans <andi@zend.com> | - | Zeev Suraski <zeev@zend.com> | - +----------------------------------------------------------------------+ -*/ - - -#include "zend.h" - -#include <stdio.h> - -#ifdef HAVE_STDLIB_H -# include <stdlib.h> -#endif - -#ifdef HAVE_LIMITS_H -# include <limits.h> -#endif - -#define HANDLE_NUMERIC(key,length,func) { \ - register char *tmp=key; \ -\ - if ((*tmp>='0' && *tmp<='9')) do { /* possibly a numeric index */ \ - char *end=tmp+length-1; \ - ulong idx; \ - \ - if (*tmp++=='0' && length>2) { /* don't accept numbers with leading zeros */ \ - break; \ - } \ - while (tmp<end) { \ - if (!(*tmp>='0' && *tmp<='9')) { \ - break; \ - } \ - tmp++; \ - } \ - if (tmp==end && *tmp=='\0') { /* a numeric index */ \ - idx = strtol(key,NULL,10); \ - if (idx!=LONG_MAX) { \ - return func; \ - } \ - } \ - } while(0); \ -} - -/* Generated on an Octa-ALPHA 300MHz CPU & 2.5GB RAM monster */ -static uint PrimeNumbers[] = -{5, 11, 19, 53, 107, 223, 463, 983, 1979, 3907, 7963, 16229, 32531, 65407, 130987, 262237, 524521, 1048793, 2097397, 4194103, 8388857, 16777447, 33554201, 67108961, 134217487, 268435697, 536870683, 1073741621, 2147483399}; - -static int if_full_do_resize(HashTable *ht); -static int zend_hash_rehash(HashTable *ht); - -static uint nNumPrimeNumbers = sizeof(PrimeNumbers) / sizeof(ulong); - -ZEND_API ulong hashpjw(char *arKey, uint nKeyLength) -{ - ulong h = 0, g; - char *arEnd=arKey+nKeyLength; - - while (arKey < arEnd) { - h = (h << 4) + *arKey++; - if ((g = (h & 0xF0000000))) { - h = h ^ (g >> 24); - h = h ^ g; - } - } - return h; -} - - -ZEND_API int zend_hash_init(HashTable *ht, uint nSize, ulong(*pHashFunction) (char *arKey, uint nKeyLength), int (*pDestructor) (void *pData),int persistent) -{ - uint i; - - for (i = 0; i < nNumPrimeNumbers; i++) { - if (nSize <= PrimeNumbers[i]) { - nSize = PrimeNumbers[i]; - ht->nHashSizeIndex = i; - break; - } - } - if (i == nNumPrimeNumbers) { /* This shouldn't really happen unless the ask for a ridiculous size */ - nSize = PrimeNumbers[i - 1]; - ht->nHashSizeIndex = i - 1; - } - - /* Uses ecalloc() so that Bucket* == NULL */ - ht->arBuckets = (Bucket **) pecalloc(nSize, sizeof(Bucket *), persistent); - - if (!ht->arBuckets) { - return FAILURE; - } - if (pHashFunction == NULL) { - ht->pHashFunction = hashpjw; - } else { - ht->pHashFunction = pHashFunction; - } - ht->pDestructor = pDestructor; - ht->nTableSize = nSize; - ht->pListHead = NULL; - ht->pListTail = NULL; - ht->nNumOfElements = 0; - ht->nNextFreeElement = 0; - ht->pInternalPointer = NULL; - ht->persistent = persistent; - return SUCCESS; -} - -ZEND_API int zend_hash_add_or_update(HashTable *ht, char *arKey, uint nKeyLength, void *pData, uint nDataSize, void **pDest, int flag) -{ - ulong h; - uint nIndex; - Bucket *p; - - if (nKeyLength <= 0) { -#if ZEND_DEBUG - ZEND_PUTS("zend_hash_update: Can't put in empty key\n"); -#endif - return FAILURE; - } - - HANDLE_NUMERIC(arKey,nKeyLength,zend_hash_index_update_or_next_insert(ht,idx,pData,nDataSize,pDest,flag)); - - h = ht->pHashFunction(arKey, nKeyLength); - nIndex = h % ht->nTableSize; - - p = ht->arBuckets[nIndex]; - while (p != NULL) { - if ((p->h == h) && (p->nKeyLength == nKeyLength)) { - if (!memcmp(p->arKey, arKey, nKeyLength)) { - if (flag & HASH_ADD) { - return FAILURE; - } - HANDLE_BLOCK_INTERRUPTIONS(); -#if ZEND_DEBUG - if (p->pData == pData) { - ZEND_PUTS("Fatal error in zend_hash_update: p->pData == pData\n"); - HANDLE_UNBLOCK_INTERRUPTIONS(); - return FAILURE; - } -#endif - if (ht->pDestructor) { - ht->pDestructor(p->pData); - } - if (flag & HASH_ADD_PTR) { - if (!p->pDataPtr) { - efree(p->pData); - } - p->pDataPtr = pData; - p->pData = &p->pDataPtr; - } else { - if (p->pDataPtr) { - p->pData = (void *) emalloc(nDataSize); - p->pDataPtr=NULL; - } - memcpy(p->pData, pData, nDataSize); - } - if (pDest) { - *pDest = p->pData; - } - HANDLE_UNBLOCK_INTERRUPTIONS(); - return SUCCESS; - } - } - p = p->pNext; - } - - p = (Bucket *) pemalloc(sizeof(Bucket)-1+nKeyLength,ht->persistent); - if (!p) { - return FAILURE; - } - memcpy(p->arKey, arKey, nKeyLength); - p->nKeyLength = nKeyLength; - if (flag & HASH_ADD_PTR) { - p->pDataPtr = pData; - p->pData = &p->pDataPtr; - } else { - p->pData = (void *) pemalloc(nDataSize,ht->persistent); - if (!p->pData) { - pefree(p,ht->persistent); - pefree(p->arKey,ht->persistent); - return FAILURE; - } - memcpy(p->pData, pData, nDataSize); - p->pDataPtr=NULL; - } - p->h = h; - p->bIsPointer = 0; - p->pNext = ht->arBuckets[nIndex]; - if (pDest) { - *pDest = p->pData; - } - - HANDLE_BLOCK_INTERRUPTIONS(); - if (ht->pInternalPointer == NULL) { - ht->pInternalPointer = p; - } - ht->arBuckets[nIndex] = p; - - /* Setup the double linked list */ - p->pListLast = ht->pListTail; - ht->pListTail = p; - p->pListNext = NULL; - if (p->pListLast != NULL) { - p->pListLast->pListNext = p; - } - if (!ht->pListHead) { - ht->pListHead = p; - } - HANDLE_UNBLOCK_INTERRUPTIONS(); - ht->nNumOfElements++; - if_full_do_resize(ht); /* If the Hash table is full, resize it */ - return SUCCESS; -} - -ZEND_API int zend_hash_quick_add_or_update(HashTable *ht, char *arKey, uint nKeyLength, ulong h, void *pData, uint nDataSize, void **pDest, int flag) -{ - uint nIndex; - Bucket *p; - - if (nKeyLength <= 0) { -#if ZEND_DEBUG - ZEND_PUTS("zend_hash_update: Can't put in empty key\n"); -#endif - return FAILURE; - } - - nIndex = h % ht->nTableSize; - - p = ht->arBuckets[nIndex]; - while (p != NULL) { - if ((p->h == h) && (p->nKeyLength == nKeyLength)) { - if (!memcmp(p->arKey, arKey, nKeyLength)) { - if (flag & HASH_ADD) { - return FAILURE; - } - HANDLE_BLOCK_INTERRUPTIONS(); -#if ZEND_DEBUG - if (p->pData == pData) { - ZEND_PUTS("Fatal error in zend_hash_update: p->pData == pData\n"); - HANDLE_UNBLOCK_INTERRUPTIONS(); - return FAILURE; - } -#endif - if (ht->pDestructor) { - ht->pDestructor(p->pData); - } - if (flag & HASH_ADD_PTR) { - if (!p->pDataPtr) { - efree(p->pData); - } - p->pDataPtr = pData; - p->pData = &p->pDataPtr; - } else { - if (p->pDataPtr) { - p->pData = (void *) emalloc(nDataSize); - p->pDataPtr=NULL; - } - memcpy(p->pData, pData, nDataSize); - } - if (pDest) { - *pDest = p->pData; - } - HANDLE_UNBLOCK_INTERRUPTIONS(); - return SUCCESS; - } - } - p = p->pNext; - } - - p = (Bucket *) pemalloc(sizeof(Bucket)-1+nKeyLength,ht->persistent); - if (!p) { - return FAILURE; - } - - memcpy(p->arKey, arKey, nKeyLength); - p->nKeyLength = nKeyLength; - if (flag & HASH_ADD_PTR) { - p->pDataPtr = pData; - p->pData = &p->pDataPtr; - } else { - p->pData = (void *) pemalloc(nDataSize,ht->persistent); - if (!p->pData) { - pefree(p,ht->persistent); - pefree(p->arKey,ht->persistent); - return FAILURE; - } - - memcpy(p->pData, pData, nDataSize); - p->pDataPtr=NULL; - } - p->h = h; - p->bIsPointer = 0; - p->pNext = ht->arBuckets[nIndex]; - if (pDest) { - *pDest = p->pData; - } - - HANDLE_BLOCK_INTERRUPTIONS(); - if (ht->pInternalPointer == NULL) { - ht->pInternalPointer = p; - } - ht->arBuckets[nIndex] = p; - - /* Setup the double linked list */ - p->pListLast = ht->pListTail; - ht->pListTail = p; - p->pListNext = NULL; - if (p->pListLast != NULL) { - p->pListLast->pListNext = p; - } - if (!ht->pListHead) { - ht->pListHead = p; - } - HANDLE_UNBLOCK_INTERRUPTIONS(); - ht->nNumOfElements++; - if_full_do_resize(ht); /* If the Hash table is full, resize it */ - return SUCCESS; -} - - -ZEND_API int zend_hash_index_update_or_next_insert(HashTable *ht, ulong h, void *pData, uint nDataSize, void **pDest, int flag) -{ - uint nIndex; - Bucket *p; - - if (flag & HASH_NEXT_INSERT) { - h = ht->nNextFreeElement; - } - nIndex = h % ht->nTableSize; - - p = ht->arBuckets[nIndex]; - while (p != NULL) { - if ((p->nKeyLength == 0) && (p->h == h)) { - if (flag & HASH_NEXT_INSERT || flag & HASH_ADD) { - return FAILURE; - } - HANDLE_BLOCK_INTERRUPTIONS(); -#if ZEND_DEBUG - if (p->pData == pData) { - ZEND_PUTS("Fatal error in zend_hash_index_update: p->pData == pData\n"); - HANDLE_UNBLOCK_INTERRUPTIONS(); - return FAILURE; - } -#endif - if (ht->pDestructor) { - ht->pDestructor(p->pData); - } - if (flag & HASH_ADD_PTR) { - if (!p->pDataPtr) { - efree(p->pData); - } - p->pDataPtr = pData; - p->pData = &p->pDataPtr; - } else { - if (p->pDataPtr) { - p->pData = (void *) emalloc(nDataSize); - p->pDataPtr=NULL; - } - memcpy(p->pData, pData, nDataSize); - } - HANDLE_UNBLOCK_INTERRUPTIONS(); - if (h >= ht->nNextFreeElement) { - ht->nNextFreeElement = h + 1; - } - if (pDest) { - *pDest = p->pData; - } - return SUCCESS; - } - p = p->pNext; - } - p = (Bucket *) pemalloc(sizeof(Bucket)-1,ht->persistent); - if (!p) { - return FAILURE; - } - p->nKeyLength = 0; /* Numeric indices are marked by making the nKeyLength == 0 */ - p->h = h; - - if (flag & HASH_ADD_PTR) { - p->pDataPtr = pData; - p->pData = &p->pDataPtr; - } else { - p->pData = (void *) pemalloc(nDataSize,ht->persistent); - if (!p->pData) { - pefree(p,ht->persistent); - return FAILURE; - } - memcpy(p->pData, pData, nDataSize); - p->pDataPtr=NULL; - } - p->bIsPointer = 0; - if (pDest) { - *pDest = p->pData; - } - - p->pNext = ht->arBuckets[nIndex]; - HANDLE_BLOCK_INTERRUPTIONS(); - if (ht->pInternalPointer == NULL) { - ht->pInternalPointer = p; - } - ht->arBuckets[nIndex] = p; - - /* Setup the double linked list */ - p->pListLast = ht->pListTail; - ht->pListTail = p; - p->pListNext = NULL; - if (p->pListLast != NULL) { - p->pListLast->pListNext = p; - } - if (!ht->pListHead) { - ht->pListHead = p; - } - HANDLE_UNBLOCK_INTERRUPTIONS(); - if (h >= ht->nNextFreeElement) { - ht->nNextFreeElement = h + 1; - } - ht->nNumOfElements++; - if_full_do_resize(ht); - return SUCCESS; -} - -ZEND_API int zend_hash_pointer_update(HashTable *ht, char *arKey, uint nKeyLength, void *pData) -{ - ulong h; - uint nIndex; - Bucket *p; - - - if (nKeyLength <= 0) { -#if ZEND_DEBUG - ZEND_PUTS("zend_hash_update: Can't put in empty key\n"); -#endif - return FAILURE; - } - - HANDLE_NUMERIC(arKey,nKeyLength,zend_hash_pointer_index_update_or_next_insert(ht,idx,pData,HASH_UPDATE)); - - h = ht->pHashFunction(arKey, nKeyLength); - nIndex = h % ht->nTableSize; - - - p = ht->arBuckets[nIndex]; - while (p != NULL) { - if ((p->h == h) && (p->nKeyLength == nKeyLength)) { - if (!memcmp(p->arKey, arKey, nKeyLength)) { -#if ZEND_DEBUG - if (p->pData == pData) { - ZEND_PUTS("Fatal error in zend_hash_pointer_update: p->pData == pData\n"); - return FAILURE; - } -#endif - HANDLE_BLOCK_INTERRUPTIONS(); - if (!p->bIsPointer && ht->pDestructor) { - ht->pDestructor(p->pData); - pefree(p->pData,ht->persistent); - } - p->pData = pData; - p->bIsPointer = 1; - HANDLE_UNBLOCK_INTERRUPTIONS(); - return SUCCESS; - } - } - p = p->pNext; - } - p = (Bucket *) pemalloc(sizeof(Bucket)-1+nKeyLength,ht->persistent); - if (!p) { - return FAILURE; - } - p->nKeyLength = nKeyLength; - p->pData = pData; - p->h = h; - p->bIsPointer = 1; - memcpy(p->arKey, arKey, nKeyLength); - - p->pNext = ht->arBuckets[nIndex]; - - HANDLE_BLOCK_INTERRUPTIONS(); - if (ht->pInternalPointer == NULL) { - ht->pInternalPointer = p; - } - ht->arBuckets[nIndex] = p; - - /* Setup the double linked list */ - p->pListLast = ht->pListTail; - ht->pListTail = p; - p->pListNext = NULL; - if (p->pListLast != NULL) { - p->pListLast->pListNext = p; - } - if (!ht->pListHead) { - ht->pListHead = p; - } - HANDLE_UNBLOCK_INTERRUPTIONS(); - - ht->nNumOfElements++; - if_full_do_resize(ht); /* If the Hash table is full, resize it */ - return SUCCESS; -} - - -ZEND_API int zend_hash_pointer_index_update_or_next_insert(HashTable *ht, ulong h, void *pData, int flag) -{ - uint nIndex; - Bucket *p; - - if (flag & HASH_NEXT_INSERT) { - h = ht->nNextFreeElement; - } - nIndex = h % ht->nTableSize; - - p = ht->arBuckets[nIndex]; - while (p != NULL) { - if ((p->nKeyLength == 0) && (p->h == h)) { - if (flag & HASH_NEXT_INSERT) { - return FAILURE; - } -#if ZEND_DEBUG - if (p->pData == pData) { - ZEND_PUTS("Fatal error in zend_hash_pointer_update: p->pData == pData\n"); - return FAILURE; - } -#endif - HANDLE_BLOCK_INTERRUPTIONS(); - if (!p->bIsPointer && ht->pDestructor) { - ht->pDestructor(p->pData); - pefree(p->pData,ht->persistent); - } - p->pData = pData; - p->bIsPointer = 1; - if (h >= ht->nNextFreeElement) { - ht->nNextFreeElement = h + 1; - } - HANDLE_UNBLOCK_INTERRUPTIONS(); - return SUCCESS; - } - p = p->pNext; - } - p = (Bucket *) pemalloc(sizeof(Bucket)-1,ht->persistent); - if (!p) { - return FAILURE; - } - p->nKeyLength = 0; - p->pData = pData; - p->h = h; - p->bIsPointer = 1; - - p->pNext = ht->arBuckets[nIndex]; - - HANDLE_BLOCK_INTERRUPTIONS(); - if (ht->pInternalPointer == NULL) { - ht->pInternalPointer = p; - } - ht->arBuckets[nIndex] = p; - - /* Setup the double linked list */ - p->pListLast = ht->pListTail; - ht->pListTail = p; - p->pListNext = NULL; - if (p->pListLast != NULL) { - p->pListLast->pListNext = p; - } - if (!ht->pListHead) { - ht->pListHead = p; - } - HANDLE_UNBLOCK_INTERRUPTIONS(); - - ht->nNumOfElements++; - if (h >= ht->nNextFreeElement) { - ht->nNextFreeElement = h + 1; - } - if_full_do_resize(ht); /* If the Hash table is full, resize it */ - return SUCCESS; -} - - -ZEND_API int zend_hash_is_pointer(HashTable *ht, char *arKey, uint nKeyLength) -{ - ulong h; - uint nIndex; - Bucket *p; - - if (nKeyLength <= 0) { -#if ZEND_DEBUG - ZEND_PUTS("zend_hash_update: Can't check for empty key\n"); -#endif - return FAILURE; - } - - HANDLE_NUMERIC(arKey,nKeyLength,zend_hash_index_is_pointer(ht, idx)); - - h = ht->pHashFunction(arKey, nKeyLength); - nIndex = h % ht->nTableSize; - - p = ht->arBuckets[nIndex]; - while (p != NULL) { - if ((p->h == h) && (p->nKeyLength == nKeyLength)) { - if (!memcmp(p->arKey, arKey, nKeyLength)) { - return (p->bIsPointer); - } - } - p = p->pNext; - } - return 0; -} - -ZEND_API int zend_hash_index_is_pointer(HashTable *ht, ulong h) -{ - uint nIndex; - Bucket *p; - - nIndex = h % ht->nTableSize; - - p = ht->arBuckets[nIndex]; - while (p != NULL) { - if ((p->nKeyLength == 0) && (p->h == h)) { - return (p->bIsPointer); - } - p = p->pNext; - } - return 0; -} - - -static int if_full_do_resize(HashTable *ht) -{ - Bucket **t; - - if ((ht->nNumOfElements > ht->nTableSize) && (ht->nHashSizeIndex < nNumPrimeNumbers - 1)) { /* Let's double the table - size */ - t = (Bucket **) perealloc_recoverable(ht->arBuckets, PrimeNumbers[ht->nHashSizeIndex + 1] * sizeof(Bucket *),ht->persistent); - if (t) { - HANDLE_BLOCK_INTERRUPTIONS(); - ht->arBuckets = t; - ht->nTableSize = PrimeNumbers[ht->nHashSizeIndex + 1]; - ht->nHashSizeIndex++; - zend_hash_rehash(ht); - HANDLE_UNBLOCK_INTERRUPTIONS(); - return SUCCESS; - } - return FAILURE; - } - return SUCCESS; -} - -static int zend_hash_rehash(HashTable *ht) -{ - Bucket *p; - uint nIndex; - - memset(ht->arBuckets, 0, PrimeNumbers[ht->nHashSizeIndex] * sizeof(Bucket *)); - p = ht->pListHead; - while (p != NULL) { - nIndex = p->h % ht->nTableSize; - p->pNext = ht->arBuckets[nIndex]; - ht->arBuckets[nIndex] = p; - p = p->pListNext; - } - return SUCCESS; -} - -ZEND_API int zend_hash_del_key_or_index(HashTable *ht, char *arKey, uint nKeyLength, ulong h, int flag) -{ - uint nIndex; - Bucket *p, *t = NULL; /* initialize just to shut gcc up with -Wall */ - - if (flag == HASH_DEL_KEY) { - HANDLE_NUMERIC(arKey,nKeyLength,zend_hash_del_key_or_index(ht,arKey,nKeyLength,idx,HASH_DEL_INDEX)); - h = ht->pHashFunction(arKey, nKeyLength); - } - nIndex = h % ht->nTableSize; - - p = ht->arBuckets[nIndex]; - while (p != NULL) { - if ((p->h == h) && ((p->nKeyLength == 0) || /* Numeric index */ - ((p->nKeyLength == nKeyLength) && (!memcmp(p->arKey, arKey, nKeyLength))))) { - HANDLE_BLOCK_INTERRUPTIONS(); - if (p == ht->arBuckets[nIndex]) { - ht->arBuckets[nIndex] = p->pNext; - } else { - t->pNext = p->pNext; - } - if (p->pListLast != NULL) { - p->pListLast->pListNext = p->pListNext; - } else { - /* Deleting the head of the list */ - ht->pListHead = p->pListNext; - } - if (p->pListNext != NULL) { - p->pListNext->pListLast = p->pListLast; - } else { - ht->pListTail = p->pListLast; - } - if (!p->bIsPointer) { - if (ht->pDestructor) { - ht->pDestructor(p->pData); - } - if (!p->pDataPtr) { - pefree(p->pData,ht->persistent); - } - } - if (ht->pInternalPointer == p) { - ht->pInternalPointer = p->pListNext; - } - pefree(p,ht->persistent); - HANDLE_UNBLOCK_INTERRUPTIONS(); - ht->nNumOfElements--; - return SUCCESS; - } - t = p; - p = p->pNext; - } - return FAILURE; -} - - -ZEND_API void zend_hash_destroy(HashTable *ht) -{ - Bucket *p, *q; - int delete_bucket; - - p = ht->pListHead; - while (p != NULL) { - q = p; - p = p->pListNext; - if (!q->bIsPointer) { - if (ht->pDestructor) { - delete_bucket = ht->pDestructor(q->pData); - } else { - delete_bucket = 1; - } - if (!q->pDataPtr && q->pData && delete_bucket) { - pefree(q->pData,ht->persistent); - } - } else { - delete_bucket = 1; - } - if (delete_bucket) { - pefree(q,ht->persistent); - } - } - pefree(ht->arBuckets,ht->persistent); -} - - -ZEND_API void zend_hash_clean(HashTable *ht) -{ - Bucket *p, *q; - - p = ht->pListHead; - while (p != NULL) { - q = p; - p = p->pListNext; - if (!q->bIsPointer) { - if (ht->pDestructor) { - ht->pDestructor(q->pData); - } - if (!q->pDataPtr && q->pData) { - pefree(q->pData,ht->persistent); - } - } - pefree(q,ht->persistent); - } - memset(ht->arBuckets, 0, ht->nTableSize*sizeof(Bucket *)); - ht->pListHead = NULL; - ht->pListTail = NULL; - ht->nNumOfElements = 0; - ht->nNextFreeElement = 0; - ht->pInternalPointer = NULL; -} - - -/* This is used to selectively delete certain entries from a hashtable. - * destruct() receives the data and decides if the entry should be deleted - * or not - */ -ZEND_API void zend_hash_apply(HashTable *ht,int (*destruct) (void *)) -{ - Bucket *p, *q; - - p = ht->pListHead; - while (p != NULL) { - q = p; - p = p->pListNext; - if (destruct(q->pData)) { - if (q->nKeyLength==0) { - zend_hash_index_del(ht, q->h); - } else { - zend_hash_del(ht,q->arKey,q->nKeyLength); - } - } - } -} - - -ZEND_API void zend_hash_apply_with_argument(HashTable *ht,int (*destruct) (void *, void *), void *argument) -{ - Bucket *p, *q; - - p = ht->pListHead; - while (p != NULL) { - q = p; - p = p->pListNext; - if (destruct(q->pData, argument)) { - if (q->nKeyLength == 0) { - zend_hash_index_del(ht, q->h); - } else { - zend_hash_del(ht,q->arKey,q->nKeyLength); - } - } - } -} - - -ZEND_API void zend_hash_apply_with_arguments(HashTable *ht,int (*destruct)(void *, int, va_list, zend_hash_key *), int num_args, ...) -{ - Bucket *p, *q; - va_list args; - zend_hash_key hash_key; - - va_start(args, num_args); - - p = ht->pListHead; - while (p != NULL) { - q = p; - p = p->pListNext; - hash_key.arKey = q->arKey; - hash_key.nKeyLength = q->nKeyLength; - hash_key.h = q->h; - if (destruct(q->pData, num_args, args, &hash_key)) { - if (q->nKeyLength == 0) { - zend_hash_index_del(ht, q->h); - } else { - zend_hash_del(ht,q->arKey,q->nKeyLength); - } - } - } - - va_end(args); -} - - - -ZEND_API void zend_hash_copy(HashTable *target, HashTable *source, void (*pCopyConstructor) (void *pData), void *tmp, uint size) -{ - Bucket *p; - - p = source->pListHead; - while (p) { - memcpy(tmp, p->pData, size); - if (pCopyConstructor) { - pCopyConstructor(tmp); - } - if (p->nKeyLength) { - zend_hash_update(target, p->arKey, p->nKeyLength, tmp, size, NULL); - } else { - zend_hash_index_update(target, p->h, tmp, size, NULL); - } - p = p->pListNext; - } - target->pInternalPointer = target->pListHead; -} - - -ZEND_API void zend_hash_merge(HashTable *target, HashTable *source, void (*pCopyConstructor) (void *pData), void *tmp, uint size, int overwrite) -{ - Bucket *p; - void *t; - int mode = (overwrite?HASH_UPDATE:HASH_ADD); - - p = source->pListHead; - while (p) { - memcpy(tmp, p->pData, size); - if (p->nKeyLength>0) { - if (zend_hash_add_or_update(target, p->arKey, p->nKeyLength, tmp, size, &t, mode)==SUCCESS && pCopyConstructor) { - pCopyConstructor(t); - } - } else { - if ((mode==HASH_UPDATE || !zend_hash_index_exists(target, p->h)) && zend_hash_index_update(target, p->h, tmp, size, &t)==SUCCESS && pCopyConstructor) { - pCopyConstructor(t); - } - } - p = p->pListNext; - } - target->pInternalPointer = target->pListHead; -} - - -ZEND_API ulong zend_get_hash_value(HashTable *ht, char *arKey, uint nKeyLength) -{ - return ht->pHashFunction(arKey, nKeyLength); -} - - -/* Returns SUCCESS if found and FAILURE if not. The pointer to the - * data is returned in pData. The reason is that there's no reason - * someone using the hash table might not want to have NULL data - */ -ZEND_API int zend_hash_find(HashTable *ht, char *arKey, uint nKeyLength, void **pData) -{ - ulong h; - uint nIndex; - Bucket *p; - - HANDLE_NUMERIC(arKey, nKeyLength, zend_hash_index_find(ht,idx,pData)); - - h = ht->pHashFunction(arKey, nKeyLength); - nIndex = h % ht->nTableSize; - - p = ht->arBuckets[nIndex]; - while (p != NULL) { - if ((p->h == h) && (p->nKeyLength == nKeyLength)) { - if (!memcmp(p->arKey, arKey, nKeyLength)) { - *pData = p->pData; - return SUCCESS; - } - } - p = p->pNext; - } - return FAILURE; -} - - -ZEND_API int zend_hash_quick_find(HashTable *ht, char *arKey, uint nKeyLength, ulong h, void **pData) -{ - uint nIndex; - Bucket *p; - - nIndex = h % ht->nTableSize; - - p = ht->arBuckets[nIndex]; - while (p != NULL) { - if ((p->h == h) && (p->nKeyLength == nKeyLength)) { - if (!memcmp(p->arKey, arKey, nKeyLength)) { - *pData = p->pData; - return SUCCESS; - } - } - p = p->pNext; - } - return FAILURE; -} - - -ZEND_API int zend_hash_exists(HashTable *ht, char *arKey, uint nKeyLength) -{ - ulong h; - uint nIndex; - Bucket *p; - - HANDLE_NUMERIC(arKey, nKeyLength, zend_hash_index_exists(ht,idx)); - - h = ht->pHashFunction(arKey, nKeyLength); - nIndex = h % ht->nTableSize; - - p = ht->arBuckets[nIndex]; - while (p != NULL) { - if ((p->h == h) && (p->nKeyLength == nKeyLength)) { - if (!memcmp(p->arKey, arKey, nKeyLength)) { - return 1; - } - } - p = p->pNext; - } - return 0; -} - - -ZEND_API int zend_hash_index_find(HashTable *ht, ulong h, void **pData) -{ - uint nIndex; - Bucket *p; - - nIndex = h % ht->nTableSize; - - p = ht->arBuckets[nIndex]; - while (p != NULL) { - if ((p->h == h) && (p->nKeyLength == 0)) { - *pData = p->pData; - return SUCCESS; - } - p = p->pNext; - } - return FAILURE; -} - - -ZEND_API int zend_hash_index_exists(HashTable *ht, ulong h) -{ - uint nIndex; - Bucket *p; - - nIndex = h % ht->nTableSize; - - p = ht->arBuckets[nIndex]; - while (p != NULL) { - if ((p->h == h) && (p->nKeyLength == 0)) { - return 1; - } - p = p->pNext; - } - return 0; -} - - -ZEND_API int zend_hash_num_elements(HashTable *ht) -{ - return ht->nNumOfElements; -} - - -ZEND_API void zend_hash_internal_pointer_reset(HashTable *ht) -{ - ht->pInternalPointer = ht->pListHead; -} - - -/* This function will be extremely optimized by remembering - * the end of the list - */ -ZEND_API void zend_hash_internal_pointer_end(HashTable *ht) -{ - ht->pInternalPointer = ht->pListTail; -} - - -ZEND_API void zend_hash_move_forward(HashTable *ht) -{ - if (ht->pInternalPointer) { - ht->pInternalPointer = ht->pInternalPointer->pListNext; - } -} - -ZEND_API void zend_hash_move_backwards(HashTable *ht) -{ - if (ht->pInternalPointer) { - ht->pInternalPointer = ht->pInternalPointer->pListLast; - } -} - - -/* This function should be made binary safe */ -ZEND_API int zend_hash_get_current_key(HashTable *ht, char **str_index, ulong *num_index) -{ - Bucket *p = ht->pInternalPointer; - - if (p) { - if (p->nKeyLength) { - *str_index = (char *) pemalloc(p->nKeyLength,ht->persistent); - memcpy(*str_index, p->arKey, p->nKeyLength); - return HASH_KEY_IS_STRING; - } else { - *num_index = p->h; - return HASH_KEY_IS_LONG; - } - } - return HASH_KEY_NON_EXISTANT; -} - - -ZEND_API int zend_hash_get_current_key_type(HashTable *ht) -{ - Bucket *p = ht->pInternalPointer; - - if (p) { - if (p->nKeyLength) { - return HASH_KEY_IS_STRING; - } else { - return HASH_KEY_IS_LONG; - } - } - return HASH_KEY_NON_EXISTANT; -} - - -ZEND_API int zend_hash_get_current_data(HashTable *ht, void **pData) -{ - Bucket *p = ht->pInternalPointer; - - if (p) { - *pData = p->pData; - return SUCCESS; - } else { - return FAILURE; - } -} - - -ZEND_API int zend_hash_sort(HashTable *ht, int (*compar) (const void *, const void *), int renumber) -{ - Bucket **arTmp; - Bucket *p; - int i, j; - - if (ht->nNumOfElements <= 1) { /* Doesn't require sorting */ - return SUCCESS; - } - arTmp = (Bucket **) pemalloc(ht->nNumOfElements * sizeof(Bucket *),ht->persistent); - if (!arTmp) { - return FAILURE; - } - p = ht->pListHead; - i = 0; - while (p) { - arTmp[i] = p; - p = p->pListNext; - i++; - } - - qsort((void *) arTmp, i, sizeof(Bucket *), compar); - - HANDLE_BLOCK_INTERRUPTIONS(); - ht->pListHead = arTmp[0]; - ht->pListTail = NULL; - ht->pInternalPointer = ht->pListHead; - - for (j = 0; j < i; j++) { - if (ht->pListTail) { - ht->pListTail->pListNext = arTmp[j]; - } - arTmp[j]->pListLast = ht->pListTail; - arTmp[j]->pListNext = NULL; - ht->pListTail = arTmp[j]; - } - pefree(arTmp,ht->persistent); - HANDLE_UNBLOCK_INTERRUPTIONS(); - - if (renumber) { - p = ht->pListHead; - i=0; - while (p != NULL) { - p->nKeyLength = 0; - p->h = i++; - p = p->pListNext; - } - ht->nNextFreeElement = i; - zend_hash_rehash(ht); - } - return SUCCESS; -} - - -ZEND_API int zend_hash_minmax(HashTable *ht, int (*compar) (const void *, const void *), int flag, void **pData) -{ - Bucket *p,*res; - - if (ht->nNumOfElements == 0 ) { - *pData=NULL; - return FAILURE; - } - - res = p = ht->pListHead; - while ((p = p->pListNext)) { - if (flag) { - if (compar(&res,&p) < 0) { /* max */ - res = p; - } - } else { - if (compar(&res,&p) > 0) { /* min */ - res = p; - } - } - } - *pData = res->pData; - return SUCCESS; -} - -ZEND_API ulong zend_hash_next_free_element(HashTable *ht) -{ - return ht->nNextFreeElement; - -} - -#if ZEND_DEBUG -void zend_hash_display_pListTail(HashTable *ht) -{ - Bucket *p; - - p = ht->pListTail; - while (p != NULL) { - zend_printf("pListTail has key %s\n", p->arKey); - p = p->pListLast; - } -} - -void zend_hash_display(HashTable *ht) -{ - Bucket *p; - uint i; - - for (i = 0; i < ht->nTableSize; i++) { - p = ht->arBuckets[i]; - while (p != NULL) { - zend_printf("%s <==> 0x%X\n", p->arKey, p->h); - p = p->pNext; - } - } - - p = ht->pListTail; - while (p != NULL) { - zend_printf("%s <==> 0x%X\n", p->arKey, p->h); - p = p->pListLast; - } -} -#endif - -/* - * Local variables: - * tab-width: 4 - * c-basic-offset: 4 - * End: - */ diff --git a/Zend/zend_hash.h b/Zend/zend_hash.h deleted file mode 100644 index be643772f0..0000000000 --- a/Zend/zend_hash.h +++ /dev/null @@ -1,173 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | Zend Engine | - +----------------------------------------------------------------------+ - | Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski | - +----------------------------------------------------------------------+ - | This source file is subject to version 0.91 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at | - | http://www.zend.com/license/0_91.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Andi Gutmans <andi@zend.com> | - | Zeev Suraski <zeev@zend.com> | - +----------------------------------------------------------------------+ -*/ - -#ifndef _HASH_ -#define _HASH_ - -#include <sys/types.h> - -#define HASH_KEY_IS_STRING 1 -#define HASH_KEY_IS_LONG 2 -#define HASH_KEY_NON_EXISTANT 3 - -#define HASH_UPDATE (1<<0) -#define HASH_ADD (1<<1) -#define HASH_NEXT_INSERT (1<<2) -#define HASH_ADD_PTR (1<<3) - -#define HASH_DEL_KEY 0 -#define HASH_DEL_INDEX 1 - -struct hashtable; - -typedef struct bucket { - ulong h; /* Used for numeric indexing */ - uint nKeyLength; - void *pData; - void *pDataPtr; - char bIsPointer; - struct bucket *pListNext; - struct bucket *pListLast; - struct bucket *pNext; - char arKey[1]; /* Must be last element */ -} Bucket; - -typedef struct hashtable { - uint nTableSize; - uint nHashSizeIndex; - uint nNumOfElements; - ulong nNextFreeElement; - ulong(*pHashFunction) (char *arKey, uint nKeyLength); - Bucket *pInternalPointer; /* Used for element traversal */ - Bucket *pListHead; - Bucket *pListTail; - Bucket **arBuckets; - int (*pDestructor) (void *pData); - unsigned char persistent; -} HashTable; - - -BEGIN_EXTERN_C() - -/* startup/shutdown */ -ZEND_API int zend_hash_init(HashTable *ht, uint nSize, ulong(*pHashFunction) (char *arKey, uint nKeyLength), int (*pDestructor) (void *pData), int persistent); -ZEND_API void zend_hash_destroy(HashTable *ht); - -ZEND_API void zend_hash_clean(HashTable *ht); - -/* additions/updates/changes */ -ZEND_API int zend_hash_add_or_update(HashTable *ht, char *arKey, uint nKeyLength, void *pData, uint nDataSize, void **pDest,int flag); -#define zend_hash_update(ht,arKey,nKeyLength,pData,nDataSize,pDest) \ - zend_hash_add_or_update(ht,arKey,nKeyLength,pData,nDataSize,pDest,HASH_UPDATE) -#define zend_hash_add(ht,arKey,nKeyLength,pData,nDataSize,pDest) \ - zend_hash_add_or_update(ht,arKey,nKeyLength,pData,nDataSize,pDest,HASH_ADD) -#define zend_hash_update_ptr(ht,arKey,nKeyLength,pData,nDataSize,pDest) \ - zend_hash_add_or_update(ht,arKey,nKeyLength,pData,0,pDest,(HASH_UPDATE|HASH_ADD_PTR)) - -ZEND_API int zend_hash_quick_add_or_update(HashTable *ht, char *arKey, uint nKeyLength, ulong h, void *pData, uint nDataSize, void **pDest,int flag); -#define zend_hash_quick_update(ht,arKey,nKeyLength,h,pData,nDataSize,pDest) \ - zend_hash_quick_add_or_update(ht,arKey,nKeyLength,h,pData,nDataSize,pDest,HASH_UPDATE) -#define zend_hash_quick_add(ht,arKey,nKeyLength,h,pData,nDataSize,pDest) \ - zend_hash_quick_add_or_update(ht,arKey,nKeyLength,h,pData,nDataSize,pDest,HASH_ADD) -#define zend_hash_quick_update_ptr(ht,arKey,nKeyLength,h,pData,nDataSize,pDest) \ - zend_hash_quick_add_or_update(ht,arKey,nKeyLength,h,pData,0,pDest,HASH_UPDATE|HASH_ADD_PTR) - -ZEND_API int zend_hash_index_update_or_next_insert(HashTable *ht, ulong h, void *pData, uint nDataSize, void **pDest, int flag); -#define zend_hash_index_update(ht,h,pData,nDataSize,pDest) \ - zend_hash_index_update_or_next_insert(ht,h,pData,nDataSize,pDest,HASH_UPDATE) -#define zend_hash_next_index_insert(ht,pData,nDataSize,pDest) \ - zend_hash_index_update_or_next_insert(ht,0,pData,nDataSize,pDest,HASH_NEXT_INSERT) -#define zend_hash_next_index_insert_ptr(ht,pData,nDataSize,pDest) \ - zend_hash_index_update_or_next_insert(ht,0,pData,nDataSize,pDest,HASH_NEXT_INSERT|HASH_ADD_PTR) - -ZEND_API int zend_hash_pointer_update(HashTable *ht, char *arKey, uint nKeyLength, void *pData); - - -typedef struct _zend_hash_key { - char *arKey; - uint nKeyLength; - ulong h; -} zend_hash_key; - - -#define ZEND_STD_HASH_APPLIER \ - int (*)(void *element, int num_args, va_list args, zend_hash_key *hash_key) - -ZEND_API int zend_hash_pointer_index_update_or_next_insert(HashTable *ht, ulong h, void *pData, int flag); -#define zend_hash_pointer_index_update(ht,h,pData) \ - zend_hash_pointer_index_update_or_next_insert(ht,h,pData,HASH_UPDATE) -#define zend_hash_next_index_pointer_insert(ht,pData) \ - zend_hash_pointer_index_update_or_next_insert(ht,0,pData,HASH_NEXT_INSERT) -ZEND_API void zend_hash_apply(HashTable *ht,int (*destruct)(void *)); -ZEND_API void zend_hash_apply_with_argument(HashTable *ht,int (*destruct)(void *, void *), void *); -ZEND_API void zend_hash_apply_with_arguments(HashTable *ht, ZEND_STD_HASH_APPLIER, int, ...); - - - - -/* Deletes */ -ZEND_API int zend_hash_del_key_or_index(HashTable *ht, char *arKey, uint nKeyLength, ulong h, int flag); -#define zend_hash_del(ht,arKey,nKeyLength) \ - zend_hash_del_key_or_index(ht,arKey,nKeyLength,0,HASH_DEL_KEY) -#define zend_hash_index_del(ht,h) \ - zend_hash_del_key_or_index(ht,NULL,0,h,HASH_DEL_INDEX) - -ZEND_API ulong zend_get_hash_value(HashTable *ht, char *arKey, uint nKeyLength); - -/* Data retreival */ -ZEND_API int zend_hash_find(HashTable *ht, char *arKey, uint nKeyLength, void **pData); -ZEND_API int zend_hash_quick_find(HashTable *ht, char *arKey, uint nKeyLength, ulong h, void **pData); -ZEND_API int zend_hash_index_find(HashTable *ht, ulong h, void **pData); - -/* Misc */ -ZEND_API int zend_hash_exists(HashTable *ht, char *arKey, uint nKeyLength); -ZEND_API int zend_hash_index_exists(HashTable *ht, ulong h); -ZEND_API int zend_hash_is_pointer(HashTable *ht, char *arKey, uint nKeyLength); -ZEND_API int zend_hash_index_is_pointer(HashTable *ht, ulong h); -ZEND_API ulong zend_hash_next_free_element(HashTable *ht); - -/* traversing */ -ZEND_API void zend_hash_move_forward(HashTable *ht); -ZEND_API void zend_hash_move_backwards(HashTable *ht); -ZEND_API int zend_hash_get_current_key(HashTable *ht, char **str_index, ulong *num_index); -ZEND_API int zend_hash_get_current_key_type(HashTable *ht); -ZEND_API int zend_hash_get_current_data(HashTable *ht, void **pData); -ZEND_API void zend_hash_internal_pointer_reset(HashTable *ht); -ZEND_API void zend_hash_internal_pointer_end(HashTable *ht); - -/* Copying, merging and sorting */ -ZEND_API void zend_hash_copy(HashTable *target, HashTable *source, void (*pCopyConstructor) (void *pData), void *tmp, uint size); -ZEND_API void zend_hash_merge(HashTable *target, HashTable *source, void (*pCopyConstructor) (void *pData), void *tmp, uint size, int overwrite); -ZEND_API int zend_hash_sort(HashTable *ht, int (*compar) (const void *, const void *), int renumber); -ZEND_API int zend_hash_minmax(HashTable *ht, int (*compar) (const void *, const void *), int flag, void **pData); - -ZEND_API int zend_hash_num_elements(HashTable *ht); - - -ZEND_API ulong hashpjw(char *arKey, uint nKeyLength); - -#if DEBUG -/* debug */ -void zend_hash_display_pListTail(HashTable *ht); -void zend_hash_display(HashTable *ht); -#endif - -END_EXTERN_C() - -#endif /* _HASH_ */ diff --git a/Zend/zend_highlight.c b/Zend/zend_highlight.c deleted file mode 100644 index a2621ae272..0000000000 --- a/Zend/zend_highlight.c +++ /dev/null @@ -1,167 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | Zend Engine | - +----------------------------------------------------------------------+ - | Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski | - +----------------------------------------------------------------------+ - | This source file is subject to version 0.91 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at | - | http://www.zend.com/license/0_91.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Andi Gutmans <andi@zend.com> | - | Zeev Suraski <zeev@zend.com> | - +----------------------------------------------------------------------+ -*/ - - -#include "zend.h" -#include "zend_compile.h" -#include "zend_highlight.h" -#include "zend_ptr_stack.h" -#include "zend_globals.h" - -#ifndef ZTS -extern char *zendtext; -extern int zendleng; -#else -#define zendtext ((char *) zend_get_zendtext(CLS_C)) -#define zendleng zend_get_zendleng(CLS_C) -#endif - -static void html_putc(char c) -{ - switch (c) { - case '\n': - ZEND_PUTS("<br>"); - break; - case '<': - ZEND_PUTS("<"); - break; - case '>': - ZEND_PUTS(">"); - break; - case '&': - ZEND_PUTS("&"); - break; - case ' ': - ZEND_PUTS(" "); - break; - case '\t': - ZEND_PUTS(" "); - break; - default: - ZEND_PUTC(c); - break; - } -} - - -static void html_puts(char *s, uint len) -{ - register char *ptr=s, *end=s+len; - - while (ptr<end) { - html_putc(*ptr++); - } -} - - - -ZEND_API void zend_highlight(zend_syntax_highlighter_ini *syntax_highlighter_ini) -{ - zval token; - int token_type; - char *last_color = syntax_highlighter_ini->highlight_html; - char *next_color; - int in_string=0; - CLS_FETCH(); - - zend_printf("<font color=\"%s\">\n", last_color); - /* highlight stuff coming back from zendlex() */ - token.type = 0; - while ((token_type=lex_scan(&token CLS_CC))) { - switch (token_type) { - case T_INLINE_HTML: - next_color = syntax_highlighter_ini->highlight_html; - break; - case T_COMMENT: - next_color = syntax_highlighter_ini->highlight_comment; - break; - case T_OPEN_TAG: - next_color = syntax_highlighter_ini->highlight_default; - break; - case T_CLOSE_TAG: - next_color = syntax_highlighter_ini->highlight_default; - break; - case T_CONSTANT_ENCAPSED_STRING: - next_color = syntax_highlighter_ini->highlight_string; - break; - case '"': - next_color = syntax_highlighter_ini->highlight_string; - in_string = !in_string; - break; - case T_WHITESPACE: - html_puts(zendtext, zendleng); /* no color needed */ - token.type = 0; - continue; - break; - default: - if (token.type==0) { - next_color = syntax_highlighter_ini->highlight_keyword; - } else { - if (in_string) { - next_color = syntax_highlighter_ini->highlight_string; - } else { - next_color = syntax_highlighter_ini->highlight_default; - } - } - break; - } - - if (last_color != next_color) { - if (last_color != syntax_highlighter_ini->highlight_html) { - zend_printf("</font>"); - } - last_color = next_color; - if (last_color != syntax_highlighter_ini->highlight_html) { - zend_printf("<font color=\"%s\">", last_color); - } - } - switch (token_type) { - case T_DOLLAR_OPEN_CURLY_BRACES: - html_puts("{", 1); - break; - default: - html_puts(zendtext, zendleng); - break; - } - - if (token.type == IS_STRING) { - switch (token_type) { - case T_OPEN_TAG: - case T_CLOSE_TAG: - case T_WHITESPACE: - break; - default: - efree(token.value.str.val); - break; - } - } - token.type = 0; - } - if (last_color != syntax_highlighter_ini->highlight_html) { - zend_printf("</font>\n"); - } - zend_printf("</font>\n"); -} - -/* - * Local variables: - * tab-width: 4 - * c-basic-offset: 4 - * End: - */ diff --git a/Zend/zend_highlight.h b/Zend/zend_highlight.h deleted file mode 100644 index 61b75ebab9..0000000000 --- a/Zend/zend_highlight.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | Zend Engine | - +----------------------------------------------------------------------+ - | Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski | - +----------------------------------------------------------------------+ - | This source file is subject to version 0.91 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at | - | http://www.zend.com/license/0_91.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Andi Gutmans <andi@zend.com> | - | Zeev Suraski <zeev@zend.com> | - +----------------------------------------------------------------------+ -*/ - - -#ifndef _HIGHLIGHT_H -#define _HIGHLIGHT_H - -#define HL_COMMENT_COLOR "#FF8000" /* orange */ -#define HL_DEFAULT_COLOR "#0000BB" /* blue */ -#define HL_HTML_COLOR "#000000" /* black */ -#define HL_STRING_COLOR "#DD0000" /* red */ -#define HL_BG_COLOR "#FFFFFF" /* white */ -#define HL_KEYWORD_COLOR "#007700" /* green */ - - -typedef struct _zend_syntax_highlighter_ini { - char *highlight_html; - char *highlight_comment; - char *highlight_default; - char *highlight_string; - char *highlight_keyword; -} zend_syntax_highlighter_ini; - - -BEGIN_EXTERN_C() -ZEND_API void zend_highlight(zend_syntax_highlighter_ini *syntax_highlighter_ini); -int highlight_file(char *filename, zend_syntax_highlighter_ini *syntax_highlighter_ini); -int highlight_string(zval *str, zend_syntax_highlighter_ini *syntax_highlighter_ini); -END_EXTERN_C() - -extern zend_syntax_highlighter_ini syntax_highlighter_ini; - -#endif diff --git a/Zend/zend_indent.c b/Zend/zend_indent.c deleted file mode 100644 index dcb48a9558..0000000000 --- a/Zend/zend_indent.c +++ /dev/null @@ -1,151 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | Zend Engine | - +----------------------------------------------------------------------+ - | Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski | - +----------------------------------------------------------------------+ - | This source file is subject to version 0.91 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at | - | http://www.zend.com/license/0_91.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Andi Gutmans <andi@zend.com> | - | Zeev Suraski <zeev@zend.com> | - +----------------------------------------------------------------------+ -*/ - - -/* This indenter doesn't really work, it's here for no particular reason. */ - - -#include "zend.h" -#include "zend_compile.h" -#include "zend_indent.h" - -#ifndef ZTS -extern char *zendtext; -extern int zendleng; -#else -#define zendtext ((char *) zend_get_zendtext(CLS_C)) -#define zendleng zend_get_zendleng(CLS_C) -#endif - - -static void handle_whitespace(int *emit_whitespace) -{ - unsigned char c; - int i; - - for (c=0; c<128; c++) { - if (emit_whitespace[c]>0) { - for (i=0; i<emit_whitespace[c]; i++) { - zend_write((char *) &c, 1); - } - } - } - memset(emit_whitespace, 0, sizeof(int)*256); -} - - -ZEND_API void zend_indent() -{ - zval token; - int token_type; - int in_string=0; - int nest_level=0; - int emit_whitespace[256]; - int i; - CLS_FETCH(); - - memset(emit_whitespace, 0, sizeof(int)*256); - - /* highlight stuff coming back from zendlex() */ - token.type = 0; - while ((token_type=lex_scan(&token CLS_CC))) { - switch (token_type) { - case T_INLINE_HTML: - zend_write(zendtext, zendleng); - break; - case T_WHITESPACE: { - token.type = 0; - /* eat whitespace, emit newlines */ - for (i=0; i<zendleng; i++) { - emit_whitespace[(unsigned char) zendtext[i]]++; - } - continue; - } - break; - case '"': - in_string = !in_string; - /* break missing intentionally */ - default: - if (token.type==0) { - /* keyword */ - switch(token_type) { - case ',': - ZEND_PUTS(", "); - goto dflt_printout; - break; - case '{': - nest_level++; - if (emit_whitespace['\n']>0) { - ZEND_PUTS(" {\n"); - memset(emit_whitespace, 0, sizeof(int)*256); - } else { - ZEND_PUTS("{"); - } - break; - case '}': - nest_level--; - if (emit_whitespace['\n']==0) { - ZEND_PUTS("\n"); - } - for (i=0; i<nest_level; i++) { - ZEND_PUTS(" "); - } - goto dflt_printout; - break; -dflt_printout: - default: - if (emit_whitespace['\n']>0) { - for (i=0; i<emit_whitespace['\n']; i++) { - ZEND_PUTS("\n"); - } - memset(emit_whitespace, 0, sizeof(int)*256); - for (i=0; i<nest_level; i++) { - ZEND_PUTS(" "); - } - } else { - handle_whitespace(emit_whitespace); - } - zend_write(zendtext, zendleng); - break; - } - } else { - handle_whitespace(emit_whitespace); - if (in_string) { - zend_write(zendtext, zendleng); - /* a part of a string */ - } else { - zend_write(zendtext, zendleng); - } - } - break; - } - if (token.type == IS_STRING) { - switch (token_type) { - case T_OPEN_TAG: - case T_CLOSE_TAG: - case T_WHITESPACE: - break; - default: - efree(token.value.str.val); - break; - } - } - token.type = 0; - } -} diff --git a/Zend/zend_indent.h b/Zend/zend_indent.h deleted file mode 100644 index aefc26464b..0000000000 --- a/Zend/zend_indent.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | Zend Engine | - +----------------------------------------------------------------------+ - | Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski | - +----------------------------------------------------------------------+ - | This source file is subject to version 0.91 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at | - | http://www.zend.com/license/0_91.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Andi Gutmans <andi@zend.com> | - | Zeev Suraski <zeev@zend.com> | - +----------------------------------------------------------------------+ -*/ - - -#ifndef _ZEND_INDENT_H -#define _ZEND_INDENT_H - -ZEND_API void zend_indent(); - -#endif /* _ZEND_INDENT_H */ diff --git a/Zend/zend_list.c b/Zend/zend_list.c deleted file mode 100644 index 88784b10cd..0000000000 --- a/Zend/zend_list.c +++ /dev/null @@ -1,279 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | Zend Engine | - +----------------------------------------------------------------------+ - | Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski | - +----------------------------------------------------------------------+ - | This source file is subject to version 0.91 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at | - | http://www.zend.com/license/0_91.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Andi Gutmans <andi@zend.com> | - | Zeev Suraski <zeev@zend.com> | - +----------------------------------------------------------------------+ -*/ - - -/* resource lists */ - -#include "zend.h" -#include "zend_list.h" -#include "zend_API.h" -#include "zend_globals.h" - -ZEND_API int le_index_ptr; - -static inline int zend_list_do_insert(HashTable *list,void *ptr, int type) -{ - int index; - list_entry le; - - index = zend_hash_next_free_element(list); - - if (index==0) index++; - - le.ptr=ptr; - le.type=type; - le.refcount=1; - zend_hash_index_update(list, index, (void *) &le, sizeof(list_entry), NULL); - return index; -} - -static inline int zend_list_do_delete(HashTable *list,int id) -{ - list_entry *le; - ELS_FETCH(); - - if (zend_hash_index_find(&EG(regular_list), id, (void **) &le)==SUCCESS) { -/* printf("del(%d): %d->%d\n", id, le->refcount, le->refcount-1); */ - if (--le->refcount<=0) { - return zend_hash_index_del(&EG(regular_list), id); - } else { - return SUCCESS; - } - } else { - return FAILURE; - } -} - - -static inline void *zend_list_do_find(HashTable *list,int id, int *type) -{ - list_entry *le; - - if (zend_hash_index_find(list, id, (void **) &le)==SUCCESS) { - *type = le->type; - return le->ptr; - } else { - *type = -1; - return NULL; - } -} - - -ZEND_API int zend_list_insert(void *ptr, int type) -{ - ELS_FETCH(); - - return zend_list_do_insert(&EG(regular_list), ptr, type); -} - - -ZEND_API int zend_plist_insert(void *ptr, int type) -{ - ELS_FETCH(); - - return zend_list_do_insert(&EG(persistent_list), ptr, type); -} - - -ZEND_API int zend_list_addref(int id) -{ - list_entry *le; - ELS_FETCH(); - - if (zend_hash_index_find(&EG(regular_list), id, (void **) &le)==SUCCESS) { -/* printf("add(%d): %d->%d\n", id, le->refcount, le->refcount+1); */ - le->refcount++; - return SUCCESS; - } else { - return FAILURE; - } -} - - -ZEND_API int zend_list_delete(int id) -{ - ELS_FETCH(); - - return zend_list_do_delete(&EG(regular_list), id); -} - - -ZEND_API int zend_plist_delete(int id) -{ - ELS_FETCH(); - - return zend_list_do_delete(&EG(persistent_list), id); -} - - -ZEND_API void *zend_list_find(int id, int *type) -{ - ELS_FETCH(); - - return zend_list_do_find(&EG(regular_list), id, type); -} - - -ZEND_API void *zend_plist_find(int id, int *type) -{ - ELS_FETCH(); - - return zend_list_do_find(&EG(persistent_list), id, type); -} - - -ZEND_API void *zend_fetch_resource(zval **passed_id, int default_id, char *resource_type_name, int resource_type) -{ - return zend_fetch_resource_ex(passed_id, default_id, resource_type_name, 1, resource_type); -} - - -ZEND_API void *zend_fetch_resource_ex(zval **passed_id, int default_id, char *resource_type_name, int num_resource_types, ...) -{ - int id; - int actual_resource_type; - void *resource; - va_list resource_types; - int i; - - if (default_id==-1) { /* use id */ - if (!passed_id) { - if (resource_type_name) { - zend_error(E_WARNING, "No %s resource supplied", resource_type_name); - } - return NULL; - } else if ((*passed_id)->type != IS_RESOURCE) { - if (resource_type_name) { - zend_error(E_WARNING, "Supplied argument is not a valid %s resource", resource_type_name); - } - return NULL; - } - id = (*passed_id)->value.lval; - } else { - id = default_id; - } - - resource = zend_list_find(id, &actual_resource_type); - if (!resource) { - if (resource_type_name) - zend_error(E_WARNING, "%d is not a valid %s resource", id, resource_type_name); - return NULL; - } - - va_start(resource_types, num_resource_types); - for (i=0; i<num_resource_types; i++) { - if (actual_resource_type == va_arg(resource_types, int)) { - va_end(resource_types); - return resource; - } - } - va_end(resource_types); - return NULL; -} - - -int list_entry_destructor(void *ptr) -{ - list_entry *le = (list_entry *) ptr; - list_destructors_entry *ld; - - if (zend_hash_index_find(&list_destructors,le->type,(void **) &ld)==SUCCESS) { - if (ld->list_destructor) { - (ld->list_destructor)(le->ptr); - } - } else { - zend_error(E_WARNING,"Unknown list entry type in request shutdown (%d)",le->type); - } - return 1; -} - - -int plist_entry_destructor(void *ptr) -{ - list_entry *le = (list_entry *) ptr; - list_destructors_entry *ld; - - if (zend_hash_index_find(&list_destructors,le->type,(void **) &ld)==SUCCESS) { - if (ld->plist_destructor) { - (ld->plist_destructor)(le->ptr); - } - } else { - zend_error(E_WARNING,"Unknown persistent list entry type in module shutdown (%d)",le->type); - } - return 1; -} - - -int init_resource_list(ELS_D) -{ - return zend_hash_init(&EG(regular_list), 0, NULL, list_entry_destructor, 0); -} - - -int init_resource_plist(ELS_D) -{ - return zend_hash_init(&EG(persistent_list), 0, NULL, plist_entry_destructor, 1); -} - - -void destroy_resource_list(void) -{ - ELS_FETCH(); - - zend_hash_destroy(&EG(regular_list)); -} - - -void destroy_resource_plist(void) -{ - ELS_FETCH(); - - zend_hash_destroy(&EG(persistent_list)); -} - - -static int clean_module_resource(list_entry *le, int *resource_id) -{ - if (le->type == *resource_id) { - return 1; - } else { - return 0; - } -} - - -int clean_module_resource_destructors(list_destructors_entry *ld, int *module_number) -{ - if (ld->module_number == *module_number) { - ELS_FETCH(); - - zend_hash_apply_with_argument(&EG(persistent_list), (int (*)(void *,void *)) clean_module_resource, (void *) &(ld->resource_id)); - return 1; - } else { - return 0; - } -} - - -/* - * Local variables: - * tab-width: 4 - * c-basic-offset: 4 - * End: - */ diff --git a/Zend/zend_list.h b/Zend/zend_list.h deleted file mode 100644 index 04ae0c9dac..0000000000 --- a/Zend/zend_list.h +++ /dev/null @@ -1,85 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | Zend Engine | - +----------------------------------------------------------------------+ - | Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski | - +----------------------------------------------------------------------+ - | This source file is subject to version 0.91 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at | - | http://www.zend.com/license/0_91.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Andi Gutmans <andi@zend.com> | - | Zeev Suraski <zeev@zend.com> | - +----------------------------------------------------------------------+ -*/ - - -#ifndef _LIST_H -#define _LIST_H - -#include "zend_hash.h" -#include "zend_globals.h" - -extern HashTable list_destructors; - -typedef struct _list_entry { - void *ptr; - int type; - int refcount; -} list_entry; - -typedef struct _list_destructors_entry { - void (*list_destructor)(void *); - void (*plist_destructor)(void *); - int module_number; - int resource_id; -} list_destructors_entry; - -#define register_list_destructors(ld,pld) _register_list_destructors((void (*)(void *))ld, (void (*)(void *))pld, module_number); -ZEND_API int _register_list_destructors(void (*ld)(void *), void (*pld)(void *), int module_number); - -enum list_entry_type { - LE_DB=1000 -}; - -int list_entry_destructor(void *ptr); -int plist_entry_destructor(void *ptr); - -int clean_module_resource_destructors(list_destructors_entry *ld, int *module_number); -int init_resource_list(ELS_D); -int init_resource_plist(ELS_D); -void destroy_resource_list(void); -void destroy_resource_plist(void); - -ZEND_API int zend_list_insert(void *ptr, int type); -ZEND_API int zend_plist_insert(void *ptr, int type); -ZEND_API int zend_list_addref(int id); -ZEND_API int zend_list_delete(int id); -ZEND_API int zend_plist_delete(int id); -ZEND_API void *zend_list_find(int id, int *type); -ZEND_API void *zend_plist_find(int id, int *type); -ZEND_API void *zend_fetch_resource(zval **passed_id, int default_id, char *resource_type_name, int resource_type); -ZEND_API void *zend_fetch_resource_ex(zval **passed_id, int default_id, char *resource_type_name, int num_resource_types, ...); - -extern ZEND_API int le_index_ptr; /* list entry type for index pointers */ - -#define ZEND_VERIFY_RESOURCE(rsrc) \ - if (!rsrc) { \ - RETURN_FALSE; \ - } - - -#define ZEND_FETCH_RESOURCE(rsrc, rsrc_type, passed_id, default_id, resource_type_name, resource_type) \ - rsrc = (rsrc_type) zend_fetch_resource(passed_id, default_id, resource_type_name, resource_type); \ - ZEND_VERIFY_RESOURCE(rsrc); - - -#define ZEND_REGISTER_RESOURCE(rsrc_result, rsrc_pointer, rsrc_type) \ - rsrc_result->value.lval = zend_list_insert(rsrc_pointer, rsrc_type); \ - rsrc_result->type = IS_RESOURCE - -#endif diff --git a/Zend/zend_llist.c b/Zend/zend_llist.c deleted file mode 100644 index e7f69c546c..0000000000 --- a/Zend/zend_llist.c +++ /dev/null @@ -1,217 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | Zend Engine | - +----------------------------------------------------------------------+ - | Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski | - +----------------------------------------------------------------------+ - | This source file is subject to version 0.91 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at | - | http://www.zend.com/license/0_91.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Andi Gutmans <andi@zend.com> | - | Zeev Suraski <zeev@zend.com> | - +----------------------------------------------------------------------+ -*/ - - -#include "zend.h" -#include "zend_llist.h" - -ZEND_API void zend_llist_init(zend_llist *l, size_t size, void (*dtor)(void *data), unsigned char persistent) -{ - l->head = NULL; - l->tail = NULL; - l->size = size; - l->dtor = dtor; - l->persistent = persistent; -} - - -ZEND_API void zend_llist_add_element(zend_llist *l, void *element) -{ - zend_llist_element *tmp = pemalloc(sizeof(zend_llist_element)+l->size-1, l->persistent); - - tmp->prev = l->tail; - tmp->next = NULL; - if (l->tail) { - l->tail->next = tmp; - } else { - l->head = tmp; - } - l->tail = tmp; - memcpy(tmp->data, element, l->size); -} - - -ZEND_API void zend_llist_prepend_element(zend_llist *l, void *element) -{ - zend_llist_element *tmp = pemalloc(sizeof(zend_llist_element)+l->size-1, l->persistent); - - tmp->next = l->head; - tmp->prev = NULL; - if (l->head) { - l->head->prev = tmp; - } else { - l->tail = tmp; - } - l->head = tmp; - memcpy(tmp->data, element, l->size); -} - - -ZEND_API void zend_llist_del_element(zend_llist *l, void *element) -{ - zend_llist_element *current=l->head; - - while (current) { - if (!memcmp(current->data, element, l->size)) { - if (current->prev) { - current->prev->next = current->next; - } else { - l->head = current->next; - } - if (current->next) { - current->next->prev = current->prev; - } else { - l->tail = current->prev; - } - if (l->dtor) { - l->dtor(current->data); - efree(current); - } - break; - } - current = current->next; - } -} - - -ZEND_API void zend_llist_destroy(zend_llist *l) -{ - zend_llist_element *current=l->head, *next; - - while (current) { - next = current->next; - if (l->dtor) { - l->dtor(current->data); - } - pefree(current, l->persistent); - current = next; - } -} - - -ZEND_API void zend_llist_clean(zend_llist *l) -{ - zend_llist_destroy(l); - l->head = l->tail = NULL; -} - - -ZEND_API void zend_llist_remove_tail(zend_llist *l) -{ - zend_llist_element *old_tail; - - if ((old_tail = l->tail)) { - if (l->tail->prev) { - l->tail->prev->next = NULL; - } - l->tail = l->tail->prev; - efree(old_tail); - } -} - - -ZEND_API void zend_llist_copy(zend_llist *dst, zend_llist *src) -{ - zend_llist_element *ptr; - - zend_llist_init(dst, src->size, src->dtor, src->persistent); - ptr = src->head; - while (ptr) { - zend_llist_add_element(dst, ptr->data); - ptr = ptr->next; - } -} - - -ZEND_API void zend_llist_apply(zend_llist *l, void (*func)(void *data)) -{ - zend_llist_element *element; - - for (element=l->head; element; element=element->next) { - func(element->data); - } -} - - -ZEND_API void zend_llist_apply_with_argument(zend_llist *l, void (*func)(void *data, void *arg), void *arg) -{ - zend_llist_element *element; - - for (element=l->head; element; element=element->next) { - func(element->data, arg); - } -} - - -ZEND_API int zend_llist_count(zend_llist *l) -{ - zend_llist_element *element; - int element_count=0; - - for (element=l->head; element; element=element->next) { - element_count++; - } - return element_count; -} - - -ZEND_API void *zend_llist_get_first(zend_llist *l) -{ - l->traverse_ptr = l->head; - if (l->traverse_ptr) { - return l->traverse_ptr->data; - } else { - return NULL; - } -} - - -ZEND_API void *zend_llist_get_last(zend_llist *l) -{ - l->traverse_ptr = l->tail; - if (l->traverse_ptr) { - return l->traverse_ptr->data; - } else { - return NULL; - } -} - - -ZEND_API void *zend_llist_get_next(zend_llist *l) -{ - if (l->traverse_ptr) { - l->traverse_ptr = l->traverse_ptr->next; - if (l->traverse_ptr) { - return l->traverse_ptr->data; - } - } - return NULL; -} - - -ZEND_API void *zend_llist_get_prev(zend_llist *l) -{ - if (l->traverse_ptr) { - l->traverse_ptr = l->traverse_ptr->prev; - if (l->traverse_ptr) { - return l->traverse_ptr->data; - } - } - return NULL; -} diff --git a/Zend/zend_llist.h b/Zend/zend_llist.h deleted file mode 100644 index f2767c1d59..0000000000 --- a/Zend/zend_llist.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | Zend Engine | - +----------------------------------------------------------------------+ - | Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski | - +----------------------------------------------------------------------+ - | This source file is subject to version 0.91 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at | - | http://www.zend.com/license/0_91.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Andi Gutmans <andi@zend.com> | - | Zeev Suraski <zeev@zend.com> | - +----------------------------------------------------------------------+ -*/ - - -#ifndef _ZEND_LLIST_H -#define _ZEND_LLIST_H - -#include <stdlib.h> - -typedef struct _zend_llist_element { - struct _zend_llist_element *next; - struct _zend_llist_element *prev; - char data[1]; /* Needs to always be last in the struct */ -} zend_llist_element; - -typedef struct _zend_llist { - zend_llist_element *head; - zend_llist_element *tail; - size_t size; - void (*dtor)(void *data); - unsigned char persistent; - zend_llist_element *traverse_ptr; -} zend_llist; - -BEGIN_EXTERN_C() -ZEND_API void zend_llist_init(zend_llist *l, size_t size, void (*dtor)(void *data), unsigned char persistent); -ZEND_API void zend_llist_add_element(zend_llist *l, void *element); -ZEND_API void zend_llist_prepend_element(zend_llist *l, void *element); -ZEND_API void zend_llist_del_element(zend_llist *l, void *element); -ZEND_API void zend_llist_destroy(zend_llist *l); -ZEND_API void zend_llist_clean(zend_llist *l); -ZEND_API void zend_llist_remove_tail(zend_llist *l); -ZEND_API void zend_llist_copy(zend_llist *dst, zend_llist *src); -ZEND_API void zend_llist_apply(zend_llist *l, void (*func)(void *data)); -ZEND_API void zend_llist_apply_with_argument(zend_llist *l, void (*func)(void *data, void *arg), void *arg); -ZEND_API int zend_llist_count(zend_llist *l); - -/* traversal */ -ZEND_API void *zend_llist_get_first(zend_llist *l); -ZEND_API void *zend_llist_get_last(zend_llist *l); -ZEND_API void *zend_llist_get_next(zend_llist *l); -ZEND_API void *zend_llist_get_prev(zend_llist *l); -END_EXTERN_C() - -#endif /* _ZEND_LLIST_H */ diff --git a/Zend/zend_modules.h b/Zend/zend_modules.h deleted file mode 100644 index 71f7400cf2..0000000000 --- a/Zend/zend_modules.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | Zend Engine | - +----------------------------------------------------------------------+ - | Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski | - +----------------------------------------------------------------------+ - | This source file is subject to version 0.91 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at | - | http://www.zend.com/license/0_91.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Andi Gutmans <andi@zend.com> | - | Zeev Suraski <zeev@zend.com> | - +----------------------------------------------------------------------+ -*/ - - -#ifndef _MODULES_H -#define _MODULES_H - -#define INIT_FUNC_ARGS int type, int module_number -#define INIT_FUNC_ARGS_PASSTHRU type, module_number -#define SHUTDOWN_FUNC_ARGS int type, int module_number -#define SHUTDOWN_FUNC_ARGS_PASSTHRU type, module_number -#define ZEND_MODULE_INFO_FUNC_ARGS zend_module_entry *zend_module - -#define STANDARD_MODULE_PROPERTIES_EX 0, 0, 0, NULL, 0 - -#define STANDARD_MODULE_PROPERTIES \ - NULL, NULL, STANDARD_MODULE_PROPERTIES_EX - -#define MODULE_PERSISTENT 1 -#define MODULE_TEMPORARY 2 - -typedef struct _zend_module_entry zend_module_entry; - -struct _zend_module_entry { - char *name; - zend_function_entry *functions; - int (*module_startup_func)(INIT_FUNC_ARGS); - int (*module_shutdown_func)(SHUTDOWN_FUNC_ARGS); - int (*request_startup_func)(INIT_FUNC_ARGS); - int (*request_shutdown_func)(SHUTDOWN_FUNC_ARGS); - void (*info_func)(ZEND_MODULE_INFO_FUNC_ARGS); - int (*global_startup_func)(void); - int (*global_shutdown_func)(void); - int request_started, module_started; - unsigned char type; - void *handle; - int module_number; -}; - - -extern HashTable module_registry; - -void module_destructor(zend_module_entry *module); -int module_registry_cleanup(zend_module_entry *module); -int module_registry_request_startup(zend_module_entry *module); - -#define ZEND_MODULE_DTOR (int (*)(void *)) module_destructor -#endif diff --git a/Zend/zend_opcode.c b/Zend/zend_opcode.c deleted file mode 100644 index 4ab5abc055..0000000000 --- a/Zend/zend_opcode.c +++ /dev/null @@ -1,411 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | Zend Engine | - +----------------------------------------------------------------------+ - | Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski | - +----------------------------------------------------------------------+ - | This source file is subject to version 0.91 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at | - | http://www.zend.com/license/0_91.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Andi Gutmans <andi@zend.com> | - | Zeev Suraski <zeev@zend.com> | - +----------------------------------------------------------------------+ -*/ - - -#include <stdio.h> - -#include "zend.h" -#include "zend_alloc.h" -#include "zend_compile.h" -#include "zend_variables.h" -#include "zend_operators.h" -#include "zend_extensions.h" -#include "zend_API.h" - - -static void zend_extension_op_array_ctor_handler(zend_extension *extension, zend_op_array *op_array) -{ - if (extension->op_array_ctor) { - if (extension->resource_number>=0) { - extension->op_array_ctor(&op_array->reserved[extension->resource_number]); - } else { - extension->op_array_ctor(NULL); - } - } -} - - -static void zend_extension_op_array_dtor_handler(zend_extension *extension, zend_op_array *op_array) -{ - if (extension->op_array_dtor) { - if (extension->resource_number>=0) { - extension->op_array_dtor(&op_array->reserved[extension->resource_number]); - } else { - extension->op_array_dtor(NULL); - } - } -} - - -static void op_array_alloc_ops(zend_op_array *op_array) -{ - op_array->opcodes = erealloc(op_array->opcodes, (op_array->size)*sizeof(zend_op)); -} - - - -void init_op_array(zend_op_array *op_array, int initial_ops_size) -{ - op_array->type = ZEND_USER_FUNCTION; -#if SUPPORT_INTERACTIVE - { - ELS_FETCH(); - - op_array->start_op_number = op_array->end_op_number = op_array->last_executed_op_number = 0; - op_array->backpatch_count = 0; - if (EG(interactive)) { - /* We must avoid a realloc() on the op_array in interactive mode, since pointers to constants - * will become invalid - */ - initial_ops_size = 8192; - } - } -#endif - - op_array->refcount = (int *) emalloc(sizeof(int)); - *op_array->refcount = 1; - op_array->size = initial_ops_size; - op_array->last = 0; - op_array->opcodes = NULL; - op_array_alloc_ops(op_array); - - op_array->T = 0; - - op_array->function_name = NULL; - - op_array->arg_types = NULL; - - op_array->brk_cont_array = NULL; - op_array->last_brk_cont = 0; - op_array->current_brk_cont = -1; - - op_array->static_variables = NULL; - - op_array->uses_globals = 0; - - zend_llist_apply_with_argument(&zend_extensions, (void (*)(void *, void *)) zend_extension_op_array_ctor_handler, op_array); -} - - -ZEND_API int destroy_zend_function(zend_function *function) -{ - switch (function->type) { - case ZEND_USER_FUNCTION: - destroy_op_array((zend_op_array *) function); - break; - case ZEND_INTERNAL_FUNCTION: - /* do nothing */ - break; - } - return 1; -} - - -ZEND_API int destroy_zend_class(zend_class_entry *ce) -{ - if (--(*ce->refcount)>0) { - return 1; - } - switch (ce->type) { - case ZEND_USER_CLASS: - efree(ce->name); - efree(ce->refcount); - zend_hash_destroy(&ce->function_table); - zend_hash_destroy(&ce->default_properties); - break; - case ZEND_INTERNAL_CLASS: - free(ce->name); - free(ce->refcount); - zend_hash_destroy(&ce->function_table); - zend_hash_destroy(&ce->default_properties); - break; - } - return 1; -} - - -void zend_class_add_ref(zend_class_entry *ce) -{ - (*ce->refcount)++; -} - - -ZEND_API void destroy_op_array(zend_op_array *op_array) -{ - zend_op *opline = op_array->opcodes; - zend_op *end = op_array->opcodes+op_array->last; - - if (--(*op_array->refcount)>0) { - return; - } - - efree(op_array->refcount); - - while (opline<end) { - if (opline->op1.op_type==IS_CONST) { -#if DEBUG_ZEND>2 - printf("Reducing refcount for %x 1=>0 (destroying)\n", &opline->op1.u.constant); -#endif - zval_dtor(&opline->op1.u.constant); - } - if (opline->op2.op_type==IS_CONST) { -#if DEBUG_ZEND>2 - printf("Reducing refcount for %x 1=>0 (destroying)\n", &opline->op2.u.constant); -#endif - zval_dtor(&opline->op2.u.constant); - } - opline++; - } - efree(op_array->opcodes); - if (op_array->function_name) { - efree(op_array->function_name); - } - if (op_array->arg_types) { - efree(op_array->arg_types); - } - if (op_array->brk_cont_array) { - efree(op_array->brk_cont_array); - } - if (op_array->static_variables) { - zend_hash_destroy(op_array->static_variables); - efree(op_array->static_variables); - } - zend_llist_apply_with_argument(&zend_extensions, (void (*)(void *, void *)) zend_extension_op_array_dtor_handler, op_array); -} - - -void init_op(zend_op *op CLS_DC) -{ - op->lineno = CG(zend_lineno); - op->filename = zend_get_compiled_filename(); - op->result.op_type = IS_UNUSED; - op->extended_value = 0; - op->op1.u.EA.var = 0; - op->op1.u.EA.type = 0; - op->op2.u.EA.var = 0; - op->op2.u.EA.type = 0; - op->result.u.EA.var = 0; - op->result.u.EA.type = 0; -} - -zend_op *get_next_op(zend_op_array *op_array CLS_DC) -{ - int next_op_num = op_array->last++; - zend_op *next_op; - - if (next_op_num >= op_array->size) { -#if SUPPORT_INTERACTIVE - ELS_FETCH(); - - if (EG(interactive)) { - /* we messed up */ - zend_printf("Ran out of opcode space!\n" - "You should probably consider writing this huge script into a file!\n"); - zend_bailout(); - } -#endif - op_array->size *= 2; - op_array_alloc_ops(op_array); - } - - next_op = &(op_array->opcodes[next_op_num]); - - init_op(next_op CLS_CC); - - return next_op; -} - - -int get_next_op_number(zend_op_array *op_array) -{ - return op_array->last; -} - - - - -zend_brk_cont_element *get_next_brk_cont_element(zend_op_array *op_array) -{ - op_array->last_brk_cont++; - op_array->brk_cont_array = erealloc(op_array->brk_cont_array, sizeof(zend_brk_cont_element)*op_array->last_brk_cont); - return &op_array->brk_cont_array[op_array->last_brk_cont-1]; -} - - -static void zend_update_extended_info(zend_op_array *op_array CLS_DC) -{ - zend_op *opline = op_array->opcodes, *end=opline+op_array->last; - - while (opline<end) { - if (opline->opcode == ZEND_EXT_STMT) { - if (opline+1<end) { - if ((opline+1)->opcode == ZEND_EXT_STMT) { - opline->opcode = ZEND_NOP; - opline++; - continue; - } - opline->lineno = (opline+1)->lineno; - opline->filename = (opline+1)->filename; - } else { - opline->opcode = ZEND_NOP; - } - } - opline++; - } - opline = get_next_op(op_array CLS_CC); - opline->opcode = ZEND_EXT_STMT; - opline->op1.op_type = IS_UNUSED; - opline->op2.op_type = IS_UNUSED; - if (op_array->last>0) { - opline->filename = op_array->opcodes[op_array->last-2].filename; - opline->lineno= op_array->opcodes[op_array->last-2].lineno; - } -} - - - -static void zend_extension_op_array_handler(zend_extension *extension, zend_op_array *op_array) -{ - if (extension->op_array_handler) { - extension->op_array_handler(op_array); - } -} - - -int pass_two(zend_op_array *op_array) -{ - CLS_FETCH(); - - if (op_array->type!=ZEND_USER_FUNCTION && op_array->type!=ZEND_EVAL_CODE) { - return 0; - } - if (CG(extended_info)) { - zend_update_extended_info(op_array CLS_CC); - } - if (CG(handle_op_arrays)) { - zend_llist_apply_with_argument(&zend_extensions, (void (*)(void *, void *)) zend_extension_op_array_handler, op_array); - } - return 0; -} - - -void pass_include_eval(zend_op_array *op_array) -{ - zend_op *opline=op_array->opcodes, *end=opline+op_array->last; - - while (opline<end) { - if (opline->op1.op_type==IS_CONST) { - opline->op1.u.constant.EA.is_ref = 1; - } - if (opline->op2.op_type==IS_CONST) { - opline->op2.u.constant.EA.is_ref = 1; - } - opline++; - } -} - - -int print_class(zend_class_entry *class_entry) -{ - printf("Class %s:\n", class_entry->name); - zend_hash_apply(&class_entry->function_table, (int (*)(void *)) pass_two); - printf("End of class %s.\n\n", class_entry->name); - return 0; -} - -ZEND_API unary_op_type get_unary_op(int opcode) -{ - switch(opcode) { - case ZEND_BW_NOT: - return (unary_op_type) bitwise_not_function; - break; - case ZEND_BOOL_NOT: - return (unary_op_type) boolean_not_function; - break; - default: - return (unary_op_type) NULL; - break; - } -} - - -ZEND_API void *get_binary_op(int opcode) -{ - switch (opcode) { - case ZEND_ADD: - case ZEND_ASSIGN_ADD: - return (void *) add_function; - break; - case ZEND_SUB: - case ZEND_ASSIGN_SUB: - return (void *) sub_function; - break; - case ZEND_MUL: - case ZEND_ASSIGN_MUL: - return (void *) mul_function; - break; - case ZEND_DIV: - case ZEND_ASSIGN_DIV: - return (void *) div_function; - break; - case ZEND_MOD: - case ZEND_ASSIGN_MOD: - return (void *) mod_function; - break; - case ZEND_SL: - case ZEND_ASSIGN_SL: - return (void *) shift_left_function; - break; - case ZEND_SR: - case ZEND_ASSIGN_SR: - return (void *) shift_right_function; - break; - case ZEND_CONCAT: - case ZEND_ASSIGN_CONCAT: - return (void *) concat_function; - break; - case ZEND_IS_EQUAL: - return (void *) is_equal_function; - break; - case ZEND_IS_NOT_EQUAL: - return (void *) is_not_equal_function; - break; - case ZEND_IS_SMALLER: - return (void *) is_smaller_function; - break; - case ZEND_IS_SMALLER_OR_EQUAL: - return (void *) is_smaller_or_equal_function; - break; - case ZEND_BW_OR: - case ZEND_ASSIGN_BW_OR: - return (void *) bitwise_or_function; - break; - case ZEND_BW_AND: - case ZEND_ASSIGN_BW_AND: - return (void *) bitwise_and_function; - break; - case ZEND_BW_XOR: - case ZEND_ASSIGN_BW_XOR: - return (void *) bitwise_xor_function; - break; - default: - return (void *) NULL; - break; - } -} diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c deleted file mode 100644 index ec1b755ed7..0000000000 --- a/Zend/zend_operators.c +++ /dev/null @@ -1,1354 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | Zend Engine | - +----------------------------------------------------------------------+ - | Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski | - +----------------------------------------------------------------------+ - | This source file is subject to version 0.91 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at | - | http://www.zend.com/license/0_91.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Andi Gutmans <andi@zend.com> | - | Zeev Suraski <zeev@zend.com> | - +----------------------------------------------------------------------+ -*/ - - -#include <stdio.h> -#include <errno.h> -#include <stdlib.h> -#include <limits.h> -#include <ctype.h> - -#include "zend.h" -#include "zend_operators.h" -#include "zend_variables.h" -#include "zend_globals.h" -#include "zend_list.h" - -#if WITH_BCMATH -#include "functions/number.h" -#endif - -static inline int is_numeric_string(char *str, int length, long *lval, double *dval); - -ZEND_API void convert_scalar_to_number(zval *op) -{ - char *strval; - - if (op->type == IS_STRING) { - strval = op->value.str.val; - switch ((op->type=is_numeric_string(strval, op->value.str.len, &op->value.lval, &op->value.dval))) { - case IS_DOUBLE: - case IS_LONG: - break; - case IS_BOOL: - op->type = IS_LONG; - break; -#if WITH_BCMATH - case IS_BC: - op->type = IS_DOUBLE; /* may have lost significant digits */ - break; -#endif - default: - op->value.lval = strtol(op->value.str.val, NULL, 10); - op->type = IS_LONG; - break; - } - STR_FREE(strval); - } else if (op->type==IS_BOOL || op->type==IS_RESOURCE) { - op->type = IS_LONG; - } -} - -#define zendi_convert_scalar_to_number(op, holder, result) \ - if (op==result) { \ - convert_scalar_to_number(op); \ - } else if ((op)->type == IS_STRING) { \ - switch (((holder).type=is_numeric_string((op)->value.str.val, (op)->value.str.len, &(holder).value.lval, &(holder).value.dval))) { \ - case IS_DOUBLE: \ - case IS_LONG: \ - break; \ - case IS_BC: \ - (holder).type = IS_DOUBLE; /* may have lost significant digits */ \ - break; \ - default: \ - (holder).value.lval = strtol((op)->value.str.val, NULL, 10); \ - (holder).type = IS_LONG; \ - break; \ - } \ - (op) = &(holder); \ - } else if ((op)->type==IS_BOOL || (op)->type==IS_RESOURCE) { \ - (holder).value.lval = (op)->value.lval; \ - (holder).type = IS_LONG; \ - (op) = &(holder); \ - } - - - -#define zendi_convert_to_long(op, holder, result) \ - if (op==result) { \ - convert_to_long(op); \ - } else if ((op)->type==IS_BOOL || (op)->type==IS_RESOURCE) { \ - (holder).value.lval = (op)->value.lval; \ - (holder).type = IS_LONG; \ - (op) = &(holder); \ - } else if ((op)->type != IS_LONG) { \ - switch ((op)->type) { \ - case IS_DOUBLE: \ - (holder).value.lval = (long) (op)->value.dval; \ - break; \ - case IS_STRING: \ - (holder).value.lval = strtol((op)->value.str.val, NULL, 10); \ - break; \ - case IS_ARRAY: \ - (holder).value.lval = (zend_hash_num_elements((op)->value.ht)?1:0); \ - break; \ - case IS_OBJECT: \ - (holder).value.lval = (zend_hash_num_elements((op)->value.obj.properties)?1:0); \ - break; \ - default: \ - zend_error(E_WARNING, "Cannot convert to ordinal value"); \ - (holder).value.lval = 0; \ - break; \ - } \ - (holder).type = IS_LONG; \ - (op) = &(holder); \ - } - - -#define zendi_convert_to_boolean(op, holder, result) \ - if (op==result) { \ - convert_to_boolean(op); \ - } else if ((op)->type != IS_BOOL) { \ - switch ((op)->type) { \ - case IS_RESOURCE: \ - case IS_LONG: \ - (holder).value.lval = ((op)->value.lval ? 1 : 0); \ - break; \ - case IS_DOUBLE: \ - (holder).value.lval = ((op)->value.dval ? 1 : 0); \ - break; \ - case IS_STRING: \ - if ((op)->value.str.len == 0 \ - || ((op)->value.str.len==1 && (op)->value.str.val[0]=='0')) { \ - (holder).value.lval = 0; \ - } else { \ - (holder).value.lval = 1; \ - } \ - break; \ - case IS_ARRAY: \ - (holder).value.lval = (zend_hash_num_elements((op)->value.ht)?1:0); \ - break; \ - case IS_OBJECT: \ - (holder).value.lval = (zend_hash_num_elements((op)->value.obj.properties)?1:0); \ - break; \ - default: \ - (holder).value.lval = 0; \ - break; \ - } \ - (holder).type = IS_BOOL; \ - (op) = &(holder); \ - } - - -ZEND_API void convert_to_long(zval *op) -{ - convert_to_long_base(op, 10); -} - - -ZEND_API void convert_to_long_base(zval *op, int base) -{ - char *strval; - long tmp; - - switch (op->type) { - case IS_RESOURCE: - case IS_BOOL: - case IS_LONG: - break; - case IS_DOUBLE: - op->value.lval = (long) op->value.dval; - break; - case IS_STRING: - strval = op->value.str.val; - op->value.lval = strtol(strval, NULL, base); - STR_FREE(strval); - break; - case IS_ARRAY: - tmp = (zend_hash_num_elements(op->value.ht)?1:0); - zval_dtor(op); - op->value.lval = tmp; - break; - case IS_OBJECT: - tmp = (zend_hash_num_elements(op->value.obj.properties)?1:0); - zval_dtor(op); - op->value.lval = tmp; - break; - default: - zend_error(E_WARNING, "Cannot convert to ordinal value"); - zval_dtor(op); - op->value.lval = 0; - break; - } - - op->type = IS_LONG; -} - - -ZEND_API void convert_to_double(zval *op) -{ - char *strval; - double tmp; - - switch (op->type) { - case IS_RESOURCE: - case IS_BOOL: - case IS_LONG: - op->value.dval = (double) op->value.lval; - op->type = IS_DOUBLE; - break; - case IS_DOUBLE: - break; - case IS_STRING: - strval = op->value.str.val; - - op->value.dval = strtod(strval, NULL); - op->type = IS_DOUBLE; - STR_FREE(strval); - break; - case IS_ARRAY: - tmp = (zend_hash_num_elements(op->value.ht)?1:0); - zval_dtor(op); - op->value.dval = tmp; - op->type = IS_DOUBLE; - break; - case IS_OBJECT: - tmp = (zend_hash_num_elements(op->value.obj.properties)?1:0); - zval_dtor(op); - op->value.dval = tmp; - op->type = IS_DOUBLE; - break; - default: - zend_error(E_WARNING, "Cannot convert to real value (type=%d)", op->type); - zval_dtor(op); - op->value.dval = 0; - op->type = IS_DOUBLE; - break; - } -} - - -ZEND_API void convert_to_boolean(zval *op) -{ - char *strval; - int tmp; - - switch (op->type) { - case IS_BOOL: - break; - case IS_RESOURCE: - case IS_LONG: - op->value.lval = (op->value.lval ? 1 : 0); - break; - case IS_DOUBLE: - op->value.lval = (op->value.dval ? 1 : 0); - break; - case IS_STRING: - strval = op->value.str.val; - - if (op->value.str.len == 0 - || (op->value.str.len==1 && op->value.str.val[0]=='0')) { - op->value.lval = 0; - } else { - op->value.lval = 1; - } - STR_FREE(strval); - break; - case IS_ARRAY: - tmp = (zend_hash_num_elements(op->value.ht)?1:0); - zval_dtor(op); - op->value.lval = tmp; - break; - case IS_OBJECT: - tmp = (zend_hash_num_elements(op->value.obj.properties)?1:0); - zval_dtor(op); - op->value.lval = tmp; - break; - default: - zval_dtor(op); - op->value.lval = 0; - break; - } - op->type = IS_BOOL; -} - - -ZEND_API void convert_to_string(zval *op) -{ - long lval; - double dval; - ELS_FETCH(); - - switch (op->type) { - case IS_STRING: - break; - case IS_BOOL: - if (op->value.lval) { - op->value.str.val = estrndup("1", 1); - op->value.str.len = 1; - } else { - op->value.str.val = empty_string; - op->value.str.len = 0; - } - break; - case IS_LONG: - lval = op->value.lval; - - op->value.str.val = (char *) emalloc(MAX_LENGTH_OF_LONG + 1); - op->value.str.len = zend_sprintf(op->value.str.val, "%ld", lval); /* SAFE */ - break; - case IS_DOUBLE: { - dval = op->value.dval; - op->value.str.val = (char *) emalloc(MAX_LENGTH_OF_DOUBLE + EG(precision) + 1); - op->value.str.len = zend_sprintf(op->value.str.val, "%.*G", (int) EG(precision), dval); /* SAFE */ - /* %G already handles removing trailing zeros from the fractional part, yay */ - break; - } - case IS_ARRAY: - zval_dtor(op); - op->value.str.val = estrndup("Array",sizeof("Array")-1); - op->value.str.len = sizeof("Array")-1; - break; - case IS_OBJECT: - zval_dtor(op); - op->value.str.val = estrndup("Object",sizeof("Object")-1); - op->value.str.len = sizeof("Object")-1; - break; - default: - zval_dtor(op); - var_reset(op); - break; - } - op->type = IS_STRING; -} - - -static void convert_scalar_to_array(zval *op, int type) -{ - zval *entry = (zval *) emalloc(sizeof(zval)); - - *entry = *op; - INIT_PZVAL(entry); - - switch (type) { - case IS_ARRAY: - op->value.ht = (HashTable *) emalloc(sizeof(HashTable)); - zend_hash_init(op->value.ht, 0, NULL, PVAL_PTR_DTOR, 0); - zend_hash_index_update(op->value.ht, 0, (void *) &entry, sizeof(zval *), NULL); - op->type = IS_ARRAY; - break; - case IS_OBJECT: - op->value.obj.properties = (HashTable *) emalloc(sizeof(HashTable)); - zend_hash_init(op->value.obj.properties, 0, NULL, PVAL_PTR_DTOR, 0); - zend_hash_update(op->value.obj.properties, "scalar", sizeof("scalar"), (void *) &entry, sizeof(zval *), NULL); - op->value.obj.ce = &zend_standard_class_def; - op->type = IS_OBJECT; - break; - } -} - - -ZEND_API void convert_to_array(zval *op) -{ - switch(op->type) { - case IS_ARRAY: - return; - break; - case IS_OBJECT: - op->type = IS_ARRAY; - op->value.ht = op->value.obj.properties; - return; - break; - default: - convert_scalar_to_array(op, IS_ARRAY); - break; - } -} - - -ZEND_API void convert_to_object(zval *op) -{ - switch(op->type) { - case IS_ARRAY: - op->type = IS_OBJECT; - op->value.obj.properties = op->value.ht; - op->value.obj.ce = &zend_standard_class_def; - return; - break; - case IS_OBJECT: - return; - break; - default: - convert_scalar_to_array(op, IS_OBJECT); - break; - } -} - - -ZEND_API int add_function(zval *result, zval *op1, zval *op2) -{ - zval op1_copy, op2_copy; - - if (op1->type == IS_ARRAY && op2->type == IS_ARRAY) { - zval *tmp; - - *result = *op1; - zval_copy_ctor(result); - zend_hash_merge(result->value.ht, op2->value.ht, (void (*)(void *pData)) zval_add_ref, (void *) &tmp, sizeof(zval *), 0); - return SUCCESS; - } - zendi_convert_scalar_to_number(op1, op1_copy, result); - zendi_convert_scalar_to_number(op2, op2_copy, result); - - - if (op1->type == IS_LONG && op2->type == IS_LONG) { - double dval = (double) op1->value.lval + (double) op2->value.lval; - - if (dval > (double) LONG_MAX) { - result->value.dval = dval; - result->type = IS_DOUBLE; - } else { - result->value.lval = op1->value.lval + op2->value.lval; - result->type = IS_LONG; - } - return SUCCESS; - } - if ((op1->type == IS_DOUBLE && op2->type == IS_LONG) - || (op1->type == IS_LONG && op2->type == IS_DOUBLE)) { - result->value.dval = (op1->type == IS_LONG ? - (((double) op1->value.lval) + op2->value.dval) : - (op1->value.dval + ((double) op2->value.lval))); - result->type = IS_DOUBLE; - return SUCCESS; - } - if (op1->type == IS_DOUBLE && op2->type == IS_DOUBLE) { - result->type = IS_DOUBLE; - result->value.dval = op1->value.dval + op2->value.dval; - return SUCCESS; - } - zend_error(E_ERROR, "Unsupported operand types"); - return FAILURE; /* unknown datatype */ -} - - -ZEND_API int sub_function(zval *result, zval *op1, zval *op2) -{ - zval op1_copy, op2_copy; - - zendi_convert_scalar_to_number(op1, op1_copy, result); - zendi_convert_scalar_to_number(op2, op2_copy, result); - - if (op1->type == IS_LONG && op2->type == IS_LONG) { - double dval = (double) op1->value.lval - (double) op2->value.lval; - - if (dval < (double) LONG_MIN) { - result->value.dval = dval; - result->type = IS_DOUBLE; - } else { - result->value.lval = op1->value.lval - op2->value.lval; - result->type = IS_LONG; - } - return SUCCESS; - } - if ((op1->type == IS_DOUBLE && op2->type == IS_LONG) - || (op1->type == IS_LONG && op2->type == IS_DOUBLE)) { - result->value.dval = (op1->type == IS_LONG ? - (((double) op1->value.lval) - op2->value.dval) : - (op1->value.dval - ((double) op2->value.lval))); - result->type = IS_DOUBLE; - return SUCCESS; - } - if (op1->type == IS_DOUBLE && op2->type == IS_DOUBLE) { - result->type = IS_DOUBLE; - result->value.dval = op1->value.dval - op2->value.dval; - return SUCCESS; - } - zend_error(E_ERROR, "Unsupported operand types"); - return FAILURE; /* unknown datatype */ -} - - -ZEND_API int mul_function(zval *result, zval *op1, zval *op2) -{ - zval op1_copy, op2_copy; - - zendi_convert_scalar_to_number(op1, op1_copy, result); - zendi_convert_scalar_to_number(op2, op2_copy, result); - - if (op1->type == IS_LONG && op2->type == IS_LONG) { - double dval = (double) op1->value.lval * (double) op2->value.lval; - - if (dval > (double) LONG_MAX) { - result->value.dval = dval; - result->type = IS_DOUBLE; - } else { - result->value.lval = op1->value.lval * op2->value.lval; - result->type = IS_LONG; - } - return SUCCESS; - } - if ((op1->type == IS_DOUBLE && op2->type == IS_LONG) - || (op1->type == IS_LONG && op2->type == IS_DOUBLE)) { - result->value.dval = (op1->type == IS_LONG ? - (((double) op1->value.lval) * op2->value.dval) : - (op1->value.dval * ((double) op2->value.lval))); - result->type = IS_DOUBLE; - return SUCCESS; - } - if (op1->type == IS_DOUBLE && op2->type == IS_DOUBLE) { - result->type = IS_DOUBLE; - result->value.dval = op1->value.dval * op2->value.dval; - return SUCCESS; - } - zend_error(E_ERROR, "Unsupported operand types"); - return FAILURE; /* unknown datatype */ -} - -ZEND_API int div_function(zval *result, zval *op1, zval *op2) -{ - zval op1_copy, op2_copy; - - zendi_convert_scalar_to_number(op1, op1_copy, result); - zendi_convert_scalar_to_number(op2, op2_copy, result); - - if ((op2->type == IS_LONG && op2->value.lval == 0) || (op2->type == IS_DOUBLE && op2->value.dval == 0.0)) { - zend_error(E_WARNING, "Division by zero"); - var_reset(result); - return FAILURE; /* division by zero */ - } - if (op1->type == IS_LONG && op2->type == IS_LONG) { - if (op1->value.lval % op2->value.lval == 0) { /* integer */ - result->type = IS_LONG; - result->value.lval = op1->value.lval / op2->value.lval; - } else { - result->type = IS_DOUBLE; - result->value.dval = ((double) op1->value.lval) / op2->value.lval; - } - return SUCCESS; - } - if ((op1->type == IS_DOUBLE && op2->type == IS_LONG) - || (op1->type == IS_LONG && op2->type == IS_DOUBLE)) { - result->value.dval = (op1->type == IS_LONG ? - (((double) op1->value.lval) / op2->value.dval) : - (op1->value.dval / ((double) op2->value.lval))); - result->type = IS_DOUBLE; - return SUCCESS; - } - if (op1->type == IS_DOUBLE && op2->type == IS_DOUBLE) { - result->type = IS_DOUBLE; - result->value.dval = op1->value.dval / op2->value.dval; - return SUCCESS; - } - zend_error(E_ERROR, "Unsupported operand types"); - return FAILURE; /* unknown datatype */ -} - - -ZEND_API int mod_function(zval *result, zval *op1, zval *op2) -{ - zval op1_copy, op2_copy; - - zendi_convert_to_long(op1, op1_copy, result); - zendi_convert_to_long(op2, op2_copy, result); - - if (op2->value.lval == 0) { - var_reset(result); - return FAILURE; /* modulus by zero */ - } - - result->type = IS_LONG; - result->value.lval = op1->value.lval % op2->value.lval; - return SUCCESS; -} - - -ZEND_API int boolean_or_function(zval *result, zval *op1, zval *op2) -{ - zval op1_copy, op2_copy; - - result->type = IS_BOOL; - - zendi_convert_to_boolean(op1, op1_copy, result); - if (op1->value.lval) { - result->value.lval = 1; - return SUCCESS; - } - zendi_convert_to_boolean(op2, op2_copy, result); - if (op2->value.lval) { - result->value.lval = 1; - return SUCCESS; - } - result->value.lval = 0; - return SUCCESS; -} - - -ZEND_API int boolean_and_function(zval *result, zval *op1, zval *op2) -{ - zval op1_copy, op2_copy; - - result->type = IS_BOOL; - - zendi_convert_to_boolean(op1, op1_copy, result); - if (!op1->value.lval) { - result->value.lval = 0; - return SUCCESS; - } - zendi_convert_to_boolean(op2, op2_copy, result); - if (!op2->value.lval) { - result->value.lval = 0; - return SUCCESS; - } - result->value.lval = 1; - return SUCCESS; -} - - -ZEND_API int boolean_xor_function(zval *result, zval *op1, zval *op2) -{ - zval op1_copy, op2_copy; - - result->type = IS_BOOL; - - zendi_convert_to_boolean(op1, op1_copy, result); - zendi_convert_to_boolean(op2, op2_copy, result); - result->value.lval = op1->value.lval ^ op2->value.lval; - return SUCCESS; -} - - -ZEND_API int boolean_not_function(zval *result, zval *op1) -{ - zval op1_copy; - - zendi_convert_to_boolean(op1, op1_copy, result); - - result->type = IS_BOOL; - result->value.lval = !op1->value.lval; - return SUCCESS; -} - - -ZEND_API int bitwise_not_function(zval *result, zval *op1) -{ - zval op1_copy = *op1; - - op1 = &op1_copy; - - if (op1->type == IS_DOUBLE) { - op1->value.lval = (long) op1->value.dval; - op1->type = IS_LONG; - } - if (op1->type == IS_LONG) { - result->value.lval = ~op1->value.lval; - result->type = IS_LONG; - return SUCCESS; - } - if (op1->type == IS_STRING) { - int i; - - result->type = IS_STRING; - result->value.str.val = estrndup(op1->value.str.val, op1->value.str.len); - result->value.str.len = op1->value.str.len; - for (i = 0; i < op1->value.str.len; i++) { - result->value.str.val[i] = ~op1->value.str.val[i]; - } - return SUCCESS; - } - zend_error(E_ERROR, "Unsupported operand types"); - return FAILURE; /* unknown datatype */ -} - - -ZEND_API int bitwise_or_function(zval *result, zval *op1, zval *op2) -{ - zval op1_copy, op2_copy; - - if (op1->type == IS_STRING && op2->type == IS_STRING) { - zval *longer, *shorter; - int i; - - if (op1->value.str.len >= op2->value.str.len) { - longer = op1; - shorter = op2; - } else { - longer = op2; - shorter = op1; - } - - result->value.str.len = longer->value.str.len; - result->value.str.val = estrndup(longer->value.str.val, longer->value.str.len); - for (i = 0; i < shorter->value.str.len; i++) { - result->value.str.val[i] |= shorter->value.str.val[i]; - } - return SUCCESS; - } - zendi_convert_to_long(op1, op1_copy, result); - zendi_convert_to_long(op2, op2_copy, result); - - result->type = IS_LONG; - result->value.lval = op1->value.lval | op2->value.lval; - return SUCCESS; -} - - -ZEND_API int bitwise_and_function(zval *result, zval *op1, zval *op2) -{ - zval op1_copy, op2_copy; - - if (op1->type == IS_STRING && op2->type == IS_STRING) { - zval *longer, *shorter; - int i; - - if (op1->value.str.len >= op2->value.str.len) { - longer = op1; - shorter = op2; - } else { - longer = op2; - shorter = op1; - } - - result->value.str.len = shorter->value.str.len; - result->value.str.val = estrndup(shorter->value.str.val, shorter->value.str.len); - for (i = 0; i < shorter->value.str.len; i++) { - result->value.str.val[i] &= longer->value.str.val[i]; - } - return SUCCESS; - } - - - zendi_convert_to_long(op1, op1_copy, result); - zendi_convert_to_long(op2, op2_copy, result); - - result->type = IS_LONG; - result->value.lval = op1->value.lval & op2->value.lval; - return SUCCESS; -} - - -ZEND_API int bitwise_xor_function(zval *result, zval *op1, zval *op2) -{ - zval op1_copy, op2_copy; - - if (op1->type == IS_STRING && op2->type == IS_STRING) { - zval *longer, *shorter; - int i; - - if (op1->value.str.len >= op2->value.str.len) { - longer = op1; - shorter = op2; - } else { - longer = op2; - shorter = op1; - } - - result->value.str.len = shorter->value.str.len; - result->value.str.val = estrndup(shorter->value.str.val, shorter->value.str.len); - for (i = 0; i < shorter->value.str.len; i++) { - result->value.str.val[i] ^= longer->value.str.val[i]; - } - return SUCCESS; - } - - zendi_convert_to_long(op1, op1_copy, result); - zendi_convert_to_long(op2, op2_copy, result); - - result->type = IS_LONG; - result->value.lval = op1->value.lval ^ op2->value.lval; - return SUCCESS; -} - - -ZEND_API int shift_left_function(zval *result, zval *op1, zval *op2) -{ - zval op1_copy, op2_copy; - - zendi_convert_to_long(op1, op1_copy, result); - zendi_convert_to_long(op2, op2_copy, result); - result->value.lval = op1->value.lval << op2->value.lval; - result->type = IS_LONG; - return SUCCESS; -} - - -ZEND_API int shift_right_function(zval *result, zval *op1, zval *op2) -{ - zval op1_copy, op2_copy; - - zendi_convert_to_long(op1, op1_copy, result); - zendi_convert_to_long(op2, op2_copy, result); - result->value.lval = op1->value.lval >> op2->value.lval; - result->type = IS_LONG; - return SUCCESS; -} - - - -/* must support result==op1 */ -ZEND_API int add_char_to_string(zval *result, zval *op1, zval *op2) -{ - result->value.str.len = op1->value.str.len + 1; - result->value.str.val = (char *) erealloc(op1->value.str.val, result->value.str.len+1); - result->value.str.val[result->value.str.len - 1] = op2->value.chval; - result->value.str.val[result->value.str.len] = 0; - result->type = IS_STRING; - return SUCCESS; -} - - -/* must support result==op1 */ -ZEND_API int add_string_to_string(zval *result, zval *op1, zval *op2) -{ - int length = op1->value.str.len + op2->value.str.len; - result->value.str.val = (char *) erealloc(op1->value.str.val, length+1); - memcpy(result->value.str.val+op1->value.str.len, op2->value.str.val, op2->value.str.len); - result->value.str.val[length] = 0; - result->value.str.len = length; - result->type = IS_STRING; - return SUCCESS; -} - - -ZEND_API int concat_function(zval *result, zval *op1, zval *op2) -{ - zval op1_copy, op2_copy; - int use_copy1, use_copy2; - - - zend_make_printable_zval(op1, &op1_copy, &use_copy1); - zend_make_printable_zval(op2, &op2_copy, &use_copy2); - - if (use_copy1) { - op1 = &op1_copy; - } - if (use_copy2) { - op2 = &op2_copy; - } - if (result==op1) { /* special case, perform operations on result */ - uint res_len = op1->value.str.len + op2->value.str.len; - - if (result->value.str.len == 0) { /* handle empty_string */ - STR_FREE(result->value.str.val); - result->value.str.val = emalloc(res_len+1); - } else { - result->value.str.val = erealloc(result->value.str.val, res_len+1); - } - memcpy(result->value.str.val+result->value.str.len, op2->value.str.val, op2->value.str.len); - result->value.str.val[res_len]=0; - result->value.str.len = res_len; - } else { - result->value.str.len = op1->value.str.len + op2->value.str.len; - result->value.str.val = (char *) emalloc(result->value.str.len + 1); - memcpy(result->value.str.val, op1->value.str.val, op1->value.str.len); - memcpy(result->value.str.val+op1->value.str.len, op2->value.str.val,op2->value.str.len); - result->value.str.val[result->value.str.len] = 0; - result->type = IS_STRING; - } - if (use_copy1) { - zval_dtor(op1); - } - if (use_copy2) { - zval_dtor(op2); - } - return SUCCESS; -} - - -ZEND_API int compare_function(zval *result, zval *op1, zval *op2) -{ - zval op1_copy, op2_copy; - - if (op1->type == IS_STRING && op2->type == IS_STRING) { - zendi_smart_strcmp(result, op1, op2); - return SUCCESS; - } - - if (op1->type == IS_BOOL || op2->type == IS_BOOL) { - zendi_convert_to_boolean(op1, op1_copy, result); - zendi_convert_to_boolean(op2, op2_copy, result); - result->type = IS_LONG; - result->value.lval = op1->value.lval - op2->value.lval; - return SUCCESS; - } - zendi_convert_scalar_to_number(op1, op1_copy, result); - zendi_convert_scalar_to_number(op2, op2_copy, result); - - if (op1->type == IS_LONG && op2->type == IS_LONG) { - result->type = IS_LONG; - result->value.lval = op1->value.lval - op2->value.lval; - return SUCCESS; - } - if ((op1->type == IS_DOUBLE || op1->type == IS_LONG) - && (op2->type == IS_DOUBLE || op2->type == IS_LONG)) { - result->value.dval = (op1->type == IS_LONG ? (double) op1->value.lval : op1->value.dval) - (op2->type == IS_LONG ? (double) op2->value.lval : op2->value.dval); - result->type = IS_DOUBLE; - return SUCCESS; - } - if ((op1->type==IS_ARRAY || op1->type==IS_OBJECT) - && (op2->type==IS_ARRAY || op2->type==IS_OBJECT)) { - zend_error(E_WARNING,"Cannot compare arrays or objects"); - } - var_reset(result); - return FAILURE; -} - - -ZEND_API int is_equal_function(zval *result, zval *op1, zval *op2) -{ - if (compare_function(result, op1, op2) == FAILURE) { - return FAILURE; - } - convert_to_boolean(result); - if (result->value.lval == 0) { - result->value.lval = 1; - } else { - result->value.lval = 0; - } - return SUCCESS; -} - - -ZEND_API int is_not_equal_function(zval *result, zval *op1, zval *op2) -{ - if (compare_function(result, op1, op2) == FAILURE) { - return FAILURE; - } - convert_to_boolean(result); - if (result->value.lval) { - result->value.lval = 1; - } else { - result->value.lval = 0; - } - return SUCCESS; -} - - -ZEND_API int is_smaller_function(zval *result, zval *op1, zval *op2) -{ - if (compare_function(result, op1, op2) == FAILURE) { - return FAILURE; - } - if (result->type == IS_LONG) { - if (result->value.lval < 0) { - result->value.lval = 1; - } else { - result->value.lval = 0; - } - return SUCCESS; - } - if (result->type == IS_DOUBLE) { - result->type = IS_LONG; - if (result->value.dval < 0) { - result->value.lval = 1; - } else { - result->value.lval = 0; - } - return SUCCESS; - } - zend_error(E_ERROR, "Unsupported operand types"); - return FAILURE; -} - - -ZEND_API int is_smaller_or_equal_function(zval *result, zval *op1, zval *op2) -{ - if (compare_function(result, op1, op2) == FAILURE) { - return FAILURE; - } - if (result->type == IS_LONG) { - if (result->value.lval <= 0) { - result->value.lval = 1; - } else { - result->value.lval = 0; - } - return SUCCESS; - } - if (result->type == IS_DOUBLE) { - result->type = IS_LONG; - if (result->value.dval <= 0) { - result->value.lval = 1; - } else { - result->value.lval = 0; - } - return SUCCESS; - } - zend_error(E_ERROR, "Unsupported operand types"); - return FAILURE; -} - - -#define LOWER_CASE 1 -#define UPPER_CASE 2 -#define NUMERIC 3 - - -static void increment_string(zval *str) -{ - int carry=0; - int pos=str->value.str.len-1; - char *s=str->value.str.val; - char *t; - int last=0; /* Shut up the compiler warning */ - int ch; - - while(pos >= 0) { - ch = s[pos]; - if (ch >= 'a' && ch <= 'z') { - if (ch == 'z') { - s[pos] = 'a'; - carry=1; - } else { - s[pos]++; - carry=0; - } - last=LOWER_CASE; - } else if (ch >= 'A' && ch <= 'Z') { - if (ch == 'Z') { - s[pos] = 'A'; - carry=1; - } else { - s[pos]++; - carry=0; - } - last=UPPER_CASE; - } else if (ch >= '0' && ch <= '9') { - if (ch == '9') { - s[pos] = '0'; - carry=1; - } else { - s[pos]++; - carry=0; - } - last = NUMERIC; - } else { - carry=0; - break; - } - if (carry == 0) { - break; - } - pos--; - } - - if (carry) { - t = (char *) emalloc(str->value.str.len+1+1); - memcpy(t+1,str->value.str.val, str->value.str.len); - str->value.str.len++; - t[str->value.str.len] = '\0'; - switch (last) { - case NUMERIC: - t[0] = '1'; - break; - case UPPER_CASE: - t[0] = 'A'; - break; - case LOWER_CASE: - t[0] = 'a'; - break; - } - STR_FREE(str->value.str.val); - str->value.str.val = t; - } -} - - -ZEND_API int increment_function(zval *op1) -{ - switch (op1->type) { - case IS_LONG: - op1->value.lval++; - break; - case IS_DOUBLE: - op1->value.dval = op1->value.dval + 1; - break; - case IS_STRING: /* Perl style string increment */ - if (op1->value.str.len==0) { /* consider as 0 */ - STR_FREE(op1->value.str.val); - op1->value.lval = 1; - op1->type = IS_LONG; - } else { - increment_string(op1); - } - break; - default: - return FAILURE; - } - return SUCCESS; -} - - -ZEND_API int decrement_function(zval *op1) -{ - long lval; - - switch (op1->type) { - case IS_LONG: - op1->value.lval--; - break; - case IS_DOUBLE: - op1->value.dval = op1->value.dval - 1; - break; - case IS_STRING: /* Like perl we only support string increment */ - if (op1->value.str.len==0) { /* consider as 0 */ - STR_FREE(op1->value.str.val); - op1->value.lval = -1; - op1->type = IS_LONG; - break; - } else if (is_numeric_string(op1->value.str.val, op1->value.str.len, &lval, NULL)==IS_LONG) { /* long */ - STR_FREE(op1->value.str.val); - op1->value.lval = lval-1; - op1->type = IS_LONG; - break; - } - break; - default: - return FAILURE; - } - - return SUCCESS; -} - - -ZEND_API int zval_is_true(zval *op) -{ - convert_to_boolean(op); - return (op->value.lval ? 1 : 0); -} - - -ZEND_API void zend_str_tolower(char *str, unsigned int length) -{ - register char *p=str, *end=p+length; - - while (p<end) { - *p = tolower(*p); - p++; - } -} - - -ZEND_API int zend_binary_strcmp(zval *s1, zval *s2) -{ - int retval; - - retval = memcmp(s1->value.str.val, s2->value.str.val, MIN(s1->value.str.len,s2->value.str.len)); - if (!retval) { - return (s1->value.str.len - s2->value.str.len); - } else { - return retval; - } -} - - -ZEND_API int zend_binary_strcasecmp(zval *s1, zval *s2) -{ - const unsigned char *p1 = (const unsigned char *)s1->value.str.val; - const unsigned char *p2 = (const unsigned char *)s2->value.str.val; - unsigned char c1 = 0, c2 = 0; - int len1, len2; - - len1 = s1->value.str.len; - len2 = s2->value.str.len; - if (len1 != len2 || !len1) { - return len1 - len2; - } - - while (len1--) { - c1 = tolower(*p1++); - c2 = tolower(*p2++); - if (c1 != c2) { - break; - } - } - - return c1 - c2; -} - -ZEND_API void zendi_smart_strcmp(zval *result, zval *s1, zval *s2) -{ - int ret1,ret2; - long lval1, lval2; - double dval1, dval2; - - if ((ret1=is_numeric_string(s1->value.str.val, s1->value.str.len, &lval1, &dval1)) && - (ret2=is_numeric_string(s2->value.str.val, s2->value.str.len, &lval2, &dval2))) { -#if WITH_BCMATH - if ((ret1==IS_BC) || (ret2==IS_BC)) { - bc_num first, second; - - /* use the BC math library to compare the numbers */ - init_num(&first); - init_num(&second); - str2num(&first,s1->value.str.val,100); /* this scale should do */ - str2num(&second,s2->value.str.val,100); /* ditto */ - result->value.lval = bc_compare(first,second); - result->type = IS_LONG; - free_num(&first); - free_num(&second); - } else -#endif - if ((ret1==IS_DOUBLE) || (ret2==IS_DOUBLE)) { - if (ret1!=IS_DOUBLE) { - dval1 = strtod(s1->value.str.val, NULL); - } else if (ret2!=IS_DOUBLE) { - dval2 = strtod(s2->value.str.val, NULL); - } - result->value.dval = dval1 - dval2; - result->type = IS_DOUBLE; - } else { /* they both have to be long's */ - result->value.lval = lval1 - lval2; - result->type = IS_LONG; - } - } else { - result->value.lval = zend_binary_strcmp(s1,s2); - result->type = IS_LONG; - } - return; -} - - -/* returns 0 for non-numeric string - * returns IS_DOUBLE for floating point string, and assigns the value to *dval (if it's not NULL) - * returns IS_LONG for integer strings, and assigns the value to *lval (if it's not NULL) - * returns IS_BC if the number might lose accuracy when converted to a double - */ - -#if 1 -static inline int is_numeric_string(char *str, int length, long *lval, double *dval) -{ - long local_lval; - double local_dval; - char *end_ptr; - - if (!length) { - return 0; - } - - errno=0; - local_lval = strtol(str, &end_ptr, 10); - if (errno!=ERANGE && end_ptr == str+length) { /* integer string */ - if (lval) { - *lval = local_lval; - } - return IS_LONG; - } - - errno=0; - local_dval = strtod(str, &end_ptr); - if (errno!=ERANGE && end_ptr == str+length) { /* floating point string */ - if (dval) { - *dval = local_dval; - } -#if WITH_BCMATH - if (length>16) { - register char *ptr=str, *end=str+length; - - while(ptr<end) { - switch(*ptr++) { - case 'e': - case 'E': - /* scientific notation, not handled by the BC library */ - return IS_DOUBLE; - break; - default: - break; - } - } - return IS_BC; - } else { - return IS_DOUBLE; - } -#else - return IS_DOUBLE; -#endif - } - - return 0; -} - -#else - -static inline int is_numeric_string(char *str, int length, long *lval, double *dval) -{ - register char *p=str, *end=str+length; - unsigned char had_period=0,had_exponent=0; - char *end_ptr; - - if (!length) { - return 0; - } - switch (*p) { - case '-': - case '+': - while (*++p==' '); /* ignore spaces after the sign */ - break; - default: - break; - } - while (p<end) { - if (isdigit((int)(unsigned char)*p)) { - p++; - } else if (*p=='.') { - if (had_period) { - return 0; - } else { - had_period=1; - p++; - } - } else if (*p=='e' || *p=='E') { - p++; - if (is_numeric_string(p, length - (int) (p-str), NULL, NULL)==IS_LONG) { /* valid exponent */ - had_exponent=1; - break; - } else { - return 0; - } - } else { - return 0; - } - } - errno=0; - if (had_period || had_exponent) { /* floating point number */ - double local_dval; - - local_dval = strtod(str, &end_ptr); - if (errno==ERANGE || end_ptr != str+length) { /* overflow or bad string */ - return 0; - } else { - if (dval) { - *dval = local_dval; - } - return IS_DOUBLE; - } - } else { - long local_lval; - - local_lval = strtol(str, &end_ptr, 10); - if (errno==ERANGE || end_ptr != str+length) { /* overflow or bad string */ - return 0; - } else { - if (lval) { - *lval = local_lval; - } - return IS_LONG; - } - } -} - -#endif diff --git a/Zend/zend_operators.h b/Zend/zend_operators.h deleted file mode 100644 index ad3b69cf93..0000000000 --- a/Zend/zend_operators.h +++ /dev/null @@ -1,121 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | Zend Engine | - +----------------------------------------------------------------------+ - | Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski | - +----------------------------------------------------------------------+ - | This source file is subject to version 0.91 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at | - | http://www.zend.com/license/0_91.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Andi Gutmans <andi@zend.com> | - | Zeev Suraski <zeev@zend.com> | - +----------------------------------------------------------------------+ -*/ - - -#ifndef _OPERATORS_H -#define _OPERATORS_H - -#define MAX_LENGTH_OF_LONG 18 -#define MAX_LENGTH_OF_DOUBLE 32 - -ZEND_API int add_function(zval *result, zval *op1, zval *op2); -ZEND_API int sub_function(zval *result, zval *op1, zval *op2); -ZEND_API int mul_function(zval *result, zval *op1, zval *op2); -ZEND_API int div_function(zval *result, zval *op1, zval *op2); -ZEND_API int mod_function(zval *result, zval *op1, zval *op2); -ZEND_API int boolean_or_function(zval *result, zval *op1, zval *op2); -ZEND_API int boolean_xor_function(zval *result, zval *op1, zval *op2); -ZEND_API int boolean_and_function(zval *result, zval *op1, zval *op2); -ZEND_API int boolean_not_function(zval *result, zval *op1); -ZEND_API int bitwise_not_function(zval *result, zval *op1); -ZEND_API int bitwise_or_function(zval *result, zval *op1, zval *op2); -ZEND_API int bitwise_and_function(zval *result, zval *op1, zval *op2); -ZEND_API int bitwise_xor_function(zval *result, zval *op1, zval *op2); -ZEND_API int shift_left_function(zval *result, zval *op1, zval *op2); -ZEND_API int shift_right_function(zval *result, zval *op1, zval *op2); -ZEND_API int concat_function(zval *result, zval *op1, zval *op2); - -ZEND_API int is_equal_function(zval *result, zval *op1, zval *op2); -ZEND_API int is_not_equal_function(zval *result, zval *op1, zval *op2); -ZEND_API int is_smaller_function(zval *result, zval *op1, zval *op2); -ZEND_API int is_smaller_or_equal_function(zval *result, zval *op1, zval *op2); - -ZEND_API int increment_function(zval *op1); -ZEND_API int decrement_function(zval *op2); - -BEGIN_EXTERN_C() -ZEND_API void convert_scalar_to_number(zval *op); -ZEND_API void convert_to_string(zval *op); -ZEND_API void convert_to_long(zval *op); -ZEND_API void convert_to_long_base(zval *op, int base); -ZEND_API void convert_to_boolean(zval *op); -ZEND_API void convert_to_array(zval *op); -ZEND_API void convert_to_object(zval *op); -ZEND_API int add_char_to_string(zval *result, zval *op1, zval *op2); -ZEND_API int add_string_to_string(zval *result, zval *op1, zval *op2); -ZEND_API void convert_to_double(zval *op); -END_EXTERN_C() - -ZEND_API int zval_is_true(zval *op); -ZEND_API int compare_function(zval *result, zval *op1, zval *op2); - -ZEND_API void zend_str_tolower(char *str, unsigned int length); -ZEND_API int zend_binary_strcmp(zval *s1, zval *s2); -ZEND_API int zend_binary_strcasecmp(zval *s1, zval *s2); -ZEND_API void zendi_smart_strcmp(zval *result, zval *s1, zval *s2); - -#define convert_to_long_ex(ppzv) \ - if ((*ppzv)->type!=IS_LONG) { \ - if (!(*ppzv)->EA.is_ref) { \ - SEPARATE_ZVAL(ppzv); \ - } \ - convert_to_long(*ppzv); \ - } - -#define convert_to_double_ex(ppzv) \ - if ((*ppzv)->type!=IS_DOUBLE) { \ - if (!(*ppzv)->EA.is_ref) { \ - SEPARATE_ZVAL(ppzv); \ - } \ - convert_to_double(*ppzv); \ - } - -#define convert_to_string_ex(ppzv) \ - if ((*ppzv)->type!=IS_STRING) { \ - if (!(*ppzv)->EA.is_ref) { \ - SEPARATE_ZVAL(ppzv); \ - } \ - convert_to_string(*ppzv); \ - } - -#define convert_to_array_ex(ppzv) \ - if ((*ppzv)->type!=IS_ARRAY) { \ - if (!(*ppzv)->EA.is_ref) { \ - SEPARATE_ZVAL(ppzv); \ - } \ - convert_to_array(*ppzv); \ - } - -#define convert_to_object_ex(ppzv) \ - if ((*ppzv)->type!=IS_OBJECT) { \ - if (!(*ppzv)->EA.is_ref) { \ - SEPARATE_ZVAL(ppzv); \ - } \ - convert_to_object(*ppzv); \ - } - -#define convert_to_boolean_ex(ppzv) \ - if ((*ppzv)->type!=IS_BOOL) { \ - if (!(*ppzv)->EA.is_ref) { \ - SEPARATE_ZVAL(ppzv); \ - } \ - convert_to_boolean(*ppzv); \ - } - -#endif diff --git a/Zend/zend_ptr_stack.c b/Zend/zend_ptr_stack.c deleted file mode 100644 index 17ed0a4b1f..0000000000 --- a/Zend/zend_ptr_stack.c +++ /dev/null @@ -1,114 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | Zend Engine | - +----------------------------------------------------------------------+ - | Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski | - +----------------------------------------------------------------------+ - | This source file is subject to version 0.91 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at | - | http://www.zend.com/license/0_91.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Andi Gutmans <andi@zend.com> | - | Zeev Suraski <zeev@zend.com> | - +----------------------------------------------------------------------+ -*/ - - -#include "zend.h" -#include "zend_ptr_stack.h" -#ifdef HAVE_STDARG_H -# include <stdarg.h> -#endif - -ZEND_API void zend_ptr_stack_init(zend_ptr_stack *stack) -{ - stack->top_element = stack->elements = (void **) emalloc(sizeof(void *)*PTR_STACK_BLOCK_SIZE); - stack->max = PTR_STACK_BLOCK_SIZE; - stack->top = 0; -} - - -ZEND_API inline void zend_ptr_stack_push(zend_ptr_stack *stack, void *ptr) -{ - if (stack->top >= stack->max) { /* we need to allocate more memory */ - stack->elements = (void **) erealloc(stack->elements, (sizeof(void *) * (stack->max *= 2 ))); - stack->top_element = stack->elements+stack->top; - } - stack->top++; - *(stack->top_element++) = ptr; -} - -ZEND_API inline void zend_ptr_stack_n_push(zend_ptr_stack *stack, int count,...) -{ - va_list ptr; - void *elem; - - if (stack->top+count > stack->max) { /* we need to allocate more memory */ - stack->max *= 2; - stack->max += count; - stack->elements = (void **) erealloc(stack->elements, (sizeof(void *) * (stack->max))); - stack->top_element = stack->elements+stack->top; - } - va_start(ptr, count); - while (count>0) { - elem = va_arg(ptr, void *); - stack->top++; - *(stack->top_element++) = elem; - count--; - } - va_end(ptr); -} - - -ZEND_API inline void zend_ptr_stack_n_pop(zend_ptr_stack *stack, int count,...) -{ - va_list ptr; - void **elem; - - va_start(ptr, count); - while (count>0) { - elem = va_arg(ptr, void **); - *elem = *(--stack->top_element); - stack->top--; - count--; - } - va_end(ptr); -} - -ZEND_API inline void *zend_ptr_stack_pop(zend_ptr_stack *stack) -{ - stack->top--; - return *(--stack->top_element); -} - - -ZEND_API void zend_ptr_stack_destroy(zend_ptr_stack *stack) -{ - if (stack->elements) { - efree(stack->elements); - } -} - - -ZEND_API void zend_ptr_stack_apply(zend_ptr_stack *stack, void (*func)(void *)) -{ - int i = stack->top; - - while (--i >= 0) { - func(stack->elements[i]); - } -} - - -ZEND_API void zend_ptr_stack_clean(zend_ptr_stack *stack, void (*func)(void *)) -{ - zend_ptr_stack_apply(stack, func); - stack->top = 0; - stack->top_element = stack->elements; -} - - diff --git a/Zend/zend_ptr_stack.h b/Zend/zend_ptr_stack.h deleted file mode 100644 index fd0770c647..0000000000 --- a/Zend/zend_ptr_stack.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | Zend Engine | - +----------------------------------------------------------------------+ - | Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski | - +----------------------------------------------------------------------+ - | This source file is subject to version 0.91 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at | - | http://www.zend.com/license/0_91.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Andi Gutmans <andi@zend.com> | - | Zeev Suraski <zeev@zend.com> | - +----------------------------------------------------------------------+ -*/ - - -#ifndef _ZEND_PTR_STACK_H -#define _ZEND_PTR_STACK_H - -typedef struct _zend_ptr_stack { - short top, max; - void **elements; - void **top_element; -} zend_ptr_stack; - - -#define PTR_STACK_BLOCK_SIZE 64 - -ZEND_API void zend_ptr_stack_init(zend_ptr_stack *stack); -ZEND_API void zend_ptr_stack_push(zend_ptr_stack *stack, void *ptr); -ZEND_API void zend_ptr_stack_n_push(zend_ptr_stack *stack, int count,...); -ZEND_API void *zend_ptr_stack_pop(zend_ptr_stack *stack); -ZEND_API void zend_ptr_stack_n_pop(zend_ptr_stack *stack, int count,...); -ZEND_API void zend_ptr_stack_destroy(zend_ptr_stack *stack); -ZEND_API void zend_ptr_stack_apply(zend_ptr_stack *stack, void (*func)(void *)); -ZEND_API void zend_ptr_stack_clean(zend_ptr_stack *stack, void (*func)(void *)); - -#endif /* _ZEND_PTR_STACK_H */ diff --git a/Zend/zend_sprintf.c b/Zend/zend_sprintf.c deleted file mode 100644 index 878ba32d28..0000000000 --- a/Zend/zend_sprintf.c +++ /dev/null @@ -1,40 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | Zend Engine | - +----------------------------------------------------------------------+ - | Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski | - +----------------------------------------------------------------------+ - | This source file is subject to version 0.91 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at | - | http://www.zend.com/license/0_91.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Andi Gutmans <andi@zend.com> | - | Zeev Suraski <zeev@zend.com> | - +----------------------------------------------------------------------+ -*/ - - -#include <stdio.h> - -#include "zend.h" - -#ifdef HAVE_STDARG_H -# include <stdarg.h> -#endif - -#if BROKEN_SPRINTF -int zend_sprintf(char *buffer, const char *format, ...) -{ - va_list args; - - va_start(args, format); - vsprintf(buffer, format, args); - va_end(args); - - return strlen(buffer); -} -#endif diff --git a/Zend/zend_stack.c b/Zend/zend_stack.c deleted file mode 100644 index 011e8519c9..0000000000 --- a/Zend/zend_stack.c +++ /dev/null @@ -1,164 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | Zend Engine | - +----------------------------------------------------------------------+ - | Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski | - +----------------------------------------------------------------------+ - | This source file is subject to version 0.91 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at | - | http://www.zend.com/license/0_91.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Andi Gutmans <andi@zend.com> | - | Zeev Suraski <zeev@zend.com> | - +----------------------------------------------------------------------+ -*/ - - -#include "zend.h" -#include "zend_stack.h" - -ZEND_API int zend_stack_init(zend_stack *stack) -{ - stack->top = 0; - stack->elements = (void **) emalloc(sizeof(void **) * STACK_BLOCK_SIZE); - if (!stack->elements) { - return FAILURE; - } else { - stack->max = STACK_BLOCK_SIZE; - return SUCCESS; - } -} - -ZEND_API int zend_stack_push(zend_stack *stack, void *element, int size) -{ - if (stack->top >= stack->max) { /* we need to allocate more memory */ - stack->elements = (void **) erealloc(stack->elements, - (sizeof(void **) * (stack->max += STACK_BLOCK_SIZE))); - if (!stack->elements) { - return FAILURE; - } - } - stack->elements[stack->top] = (void *) emalloc(size); - memcpy(stack->elements[stack->top], element, size); - return stack->top++; -} - - -ZEND_API int zend_stack_top(zend_stack *stack, void **element) -{ - if (stack->top > 0) { - *element = stack->elements[stack->top - 1]; - return SUCCESS; - } else { - *element = NULL; - return FAILURE; - } -} - - -ZEND_API int zend_stack_del_top(zend_stack *stack) -{ - if (stack->top > 0) { - efree(stack->elements[--stack->top]); - } - return SUCCESS; -} - - -ZEND_API int zend_stack_int_top(zend_stack *stack) -{ - int *e; - - if (zend_stack_top(stack, (void **) &e) == FAILURE) { - return FAILURE; /* this must be a negative number, since negative numbers can't be address numbers */ - } else { - return *e; - } -} - - -ZEND_API int zend_stack_is_empty(zend_stack *stack) -{ - if (stack->top == 0) { - return 1; - } else { - return 0; - } -} - - -ZEND_API int zend_stack_destroy(zend_stack *stack) -{ - register int i; - - for (i = 0; i < stack->top; i++) { - efree(stack->elements[i]); - } - - if (stack->elements) { - efree(stack->elements); - } - return SUCCESS; -} - - -ZEND_API void **zend_stack_base(zend_stack *stack) -{ - return stack->elements; -} - - -ZEND_API int zend_stack_count(zend_stack *stack) -{ - return stack->top; -} - - -ZEND_API void zend_stack_apply(zend_stack *stack, int (*apply_function)(void *element), int type) -{ - int i; - - switch (type) { - case ZEND_STACK_APPLY_TOPDOWN: - for (i=stack->top-1; i>=0; i--) { - if (apply_function(stack->elements[i])) { - break; - } - } - break; - case ZEND_STACK_APPLY_BOTTOMUP: - for (i=0; i<stack->top; i++) { - if (apply_function(stack->elements[i])) { - break; - } - } - break; - } -} - - -ZEND_API void zend_stack_apply_with_argument(zend_stack *stack, int (*apply_function)(void *element, void *arg), int type, void *arg) -{ - int i; - - switch (type) { - case ZEND_STACK_APPLY_TOPDOWN: - for (i=stack->top-1; i>=0; i--) { - if (apply_function(stack->elements[i], arg)) { - break; - } - } - break; - case ZEND_STACK_APPLY_BOTTOMUP: - for (i=0; i<stack->top; i++) { - if (apply_function(stack->elements[i], arg)) { - break; - } - } - break; - } -} diff --git a/Zend/zend_stack.h b/Zend/zend_stack.h deleted file mode 100644 index 053d44632d..0000000000 --- a/Zend/zend_stack.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | Zend Engine | - +----------------------------------------------------------------------+ - | Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski | - +----------------------------------------------------------------------+ - | This source file is subject to version 0.91 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at | - | http://www.zend.com/license/0_91.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Andi Gutmans <andi@zend.com> | - | Zeev Suraski <zeev@zend.com> | - +----------------------------------------------------------------------+ -*/ - - -#ifndef _ZEND_STACK_H -#define _ZEND_STACK_H - -typedef struct _zend_stack { - int top, max; - void **elements; -} zend_stack; - - -#define STACK_BLOCK_SIZE 64 - -ZEND_API int zend_stack_init(zend_stack *stack); -ZEND_API int zend_stack_push(zend_stack *stack, void *element, int size); -ZEND_API int zend_stack_top(zend_stack *stack, void **element); -ZEND_API int zend_stack_del_top(zend_stack *stack); -ZEND_API int zend_stack_int_top(zend_stack *stack); -ZEND_API int zend_stack_is_empty(zend_stack *stack); -ZEND_API int zend_stack_destroy(zend_stack *stack); -ZEND_API void **zend_stack_base(zend_stack *stack); -ZEND_API int zend_stack_count(zend_stack *stack); -ZEND_API void zend_stack_apply(zend_stack *stack, int (*apply_function)(void *element), int type); -ZEND_API void zend_stack_apply_with_argument(zend_stack *stack, int (*apply_function)(void *element, void *arg), int type, void *arg); - -#define ZEND_STACK_APPLY_TOPDOWN 1 -#define ZEND_STACK_APPLY_BOTTOMUP 2 - -#endif /* _ZEND_STACK_H */ diff --git a/Zend/zend_variables.c b/Zend/zend_variables.c deleted file mode 100644 index da3fedb505..0000000000 --- a/Zend/zend_variables.c +++ /dev/null @@ -1,184 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | Zend Engine | - +----------------------------------------------------------------------+ - | Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski | - +----------------------------------------------------------------------+ - | This source file is subject to version 0.91 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at | - | http://www.zend.com/license/0_91.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Andi Gutmans <andi@zend.com> | - | Zeev Suraski <zeev@zend.com> | - +----------------------------------------------------------------------+ -*/ - - -#include <stdio.h> -#include "zend.h" -#include "zend_API.h" -#include "zend_globals.h" -#include "zend_constants.h" -#include "zend_variables.h" -#include "zend_list.h" - -ZEND_API char *empty_string = ""; /* in order to save emalloc() and efree() time for - * empty strings (usually used to denote empty - * return values in failed functions). - * The macro STR_FREE() will not efree() it. - */ - -ZEND_API char *undefined_variable_string = "\0"; - -/* this function MUST set the value for the variable to an empty string */ -/* and empty strings must be evaluated as FALSE */ -ZEND_API inline void var_reset(zval *var) -{ - var->type = IS_STRING; - var->value.str.val = empty_string; - var->value.str.len = 0; -} - -ZEND_API inline void var_uninit(zval *var) -{ - var->type = IS_STRING; - var->value.str.val = undefined_variable_string; - var->value.str.len = 0; -} - - -ZEND_API int _zval_dtor(zval *zvalue ZEND_FILE_LINE_DC) -{ - if (zvalue->type==IS_LONG) { - return 1; - } - switch(zvalue->type) { - case IS_STRING: - case IS_CONSTANT: - STR_FREE_REL(zvalue->value.str.val); - break; - case IS_ARRAY: { - ELS_FETCH(); - - if (zvalue->value.ht && (zvalue->value.ht != &EG(symbol_table))) { - zend_hash_destroy(zvalue->value.ht); - efree_rel(zvalue->value.ht); - } - } - break; - case IS_OBJECT: - zend_hash_destroy(zvalue->value.obj.properties); - efree_rel(zvalue->value.obj.properties); - break; - case IS_RESOURCE: - /* destroy resource */ - zend_list_delete(zvalue->value.lval); - break; - case IS_LONG: - case IS_DOUBLE: - case IS_BOOL: - default: - return 1; - break; - } - return 1; -} - - -void zval_add_ref(zval **p) -{ - (*p)->refcount++; -} - - - - -ZEND_API int _zval_copy_ctor(zval *zvalue ZEND_FILE_LINE_DC) -{ - switch (zvalue->type) { - case IS_RESOURCE: - zend_list_addref(zvalue->value.lval); - break; - case IS_BOOL: - case IS_LONG: - break; - case IS_STRING: - if (zvalue->value.str.val) { - if (zvalue->value.str.len==0) { - if (zvalue->value.str.val==undefined_variable_string) { - zvalue->value.str.val = undefined_variable_string; - } else { - zvalue->value.str.val = empty_string; - } - return SUCCESS; - } - } - zvalue->value.str.val = (char *) estrndup_rel(zvalue->value.str.val, zvalue->value.str.len); - break; - case IS_ARRAY: { - zval *tmp; - HashTable *original_ht = zvalue->value.ht; - ELS_FETCH(); - - if (!zvalue->value.ht) { - var_reset(zvalue); - return FAILURE; - } else if (zvalue->value.ht==&EG(symbol_table)) { - return SUCCESS; /* do nothing */ - } - zvalue->value.ht = (HashTable *) emalloc_rel(sizeof(HashTable)); - zend_hash_init(zvalue->value.ht, 0, NULL, PVAL_PTR_DTOR, 0); - zend_hash_copy(zvalue->value.ht, original_ht, (void (*)(void *)) zval_add_ref, (void *) &tmp, sizeof(zval *)); - } - break; - case IS_OBJECT: { - zval *tmp; - HashTable *original_ht = zvalue->value.obj.properties; - - zvalue->value.obj.properties = (HashTable *) emalloc_rel(sizeof(HashTable)); - zend_hash_init(zvalue->value.obj.properties, 0, NULL, PVAL_PTR_DTOR, 0); - zend_hash_copy(zvalue->value.obj.properties, original_ht, (void (*)(void *)) zval_add_ref, (void *) &tmp, sizeof(zval *)); - } - break; - } - return SUCCESS; -} - - -ZEND_API int zend_print_variable(zval *var) -{ - return zend_print_zval(var, 0); -} - - -#if ZEND_DEBUG -ZEND_API int _zval_copy_ctor_wrapper(zval *zvalue) -{ - return zval_copy_ctor(zvalue); -} - - -ZEND_API int _zval_dtor_wrapper(zval *zvalue) -{ - return zval_dtor(zvalue); -} - - - -ZEND_API int _zval_ptr_dtor_wrapper(zval **zval_ptr) -{ - return zval_ptr_dtor(zval_ptr); -} -#endif - - -/* - * Local variables: - * tab-width: 4 - * c-basic-offset: 4 - * End: - */ diff --git a/Zend/zend_variables.h b/Zend/zend_variables.h deleted file mode 100644 index cdfa1c4eca..0000000000 --- a/Zend/zend_variables.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | Zend Engine | - +----------------------------------------------------------------------+ - | Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski | - +----------------------------------------------------------------------+ - | This source file is subject to version 0.91 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at | - | http://www.zend.com/license/0_91.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Andi Gutmans <andi@zend.com> | - | Zeev Suraski <zeev@zend.com> | - +----------------------------------------------------------------------+ -*/ - - -#ifndef _VARIABLES_H -#define _VARIABLES_H - - -ZEND_API int zend_print_variable(zval *var); - -BEGIN_EXTERN_C() -ZEND_API int _zval_copy_ctor(zval *zvalue ZEND_FILE_LINE_DC); -ZEND_API int _zval_dtor(zval *zvalue ZEND_FILE_LINE_DC); -ZEND_API int _zval_ptr_dtor(zval **zval_ptr ZEND_FILE_LINE_DC); -#define zval_copy_ctor(zvalue) _zval_copy_ctor((zvalue) ZEND_FILE_LINE_CC) -#define zval_dtor(zvalue) _zval_dtor((zvalue) ZEND_FILE_LINE_CC) -#define zval_ptr_dtor(zval_ptr) _zval_ptr_dtor((zval_ptr) ZEND_FILE_LINE_CC) - -#if ZEND_DEBUG -ZEND_API int _zval_copy_ctor_wrapper(zval *zvalue); -ZEND_API int _zval_dtor_wrapper(zval *zvalue); -ZEND_API int _zval_ptr_dtor_wrapper(zval **zval_ptr); -#define zval_copy_ctor_wrapper _zval_copy_ctor_wrapper -#define zval_dtor_wrapper _zval_dtor_wrapper -#define zval_ptr_dtor_wrapper _zval_ptr_dtor_wrapper -#else -#define zval_copy_ctor_wrapper _zval_copy_ctor -#define zval_dtor_wrapper _zval_dtor -#define zval_ptr_dtor_wrapper _zval_ptr_dtor -#endif - -END_EXTERN_C() - - -void zval_add_ref(zval **p); - -#define PVAL_DESTRUCTOR (int (*)(void *)) zval_dtor_wrapper -#define PVAL_PTR_DTOR (int (*)(void *)) zval_ptr_dtor_wrapper -#define PVAL_COPY_CTOR (void (*)(void *)) zval_copy_ctor_wrapper - -ZEND_API void var_reset(zval *var); -ZEND_API void var_uninit(zval *var); - -#endif diff --git a/ext/pcre/config0.m4 b/ext/pcre/config0.m4 deleted file mode 100644 index 7c01193fdc..0000000000 --- a/ext/pcre/config0.m4 +++ /dev/null @@ -1,59 +0,0 @@ -dnl $Id$ -dnl config.m4 for extension pcre - -dnl By default we'll compile and link against the bundled PCRE library -dnl if DIR is supplied, we'll use that for linking - -AC_MSG_CHECKING(whether to include PCRE support) -AC_ARG_WITH(pcre-regex, -[ --without-pcre-regex Do not include Perl Compatible Regular Expressions - support. Use --with-pcre-regex=DIR to specify DIR - where PCRE's include and library files are located, - if not using bundled library.], -[ - case "$withval" in - no) - AC_MSG_RESULT(no) - ;; - yes) - EXTRA_LIBS="-L$abs_builddir/ext/pcre/pcrelib -lpcre $EXTRA_LIBS" - PCRE_SUBDIR="pcrelib" - AC_DEFINE(HAVE_BUNDLED_PCRE, 1) - AC_MSG_RESULT(yes) - PHP_EXTENSION(pcre) - ;; - *) - if test -f $withval/pcre.h ; then - changequote({,}) - pcre_major=`grep PCRE_MAJOR $withval/pcre.h | sed -e 's/[^0-9]//g'` - pcre_minor=`grep PCRE_MINOR $withval/pcre.h | sed -e 's/[^0-9]//g'` - changequote([,]) - pcre_version=$pcre_major$pcre_minor - if test "$pcre_version" -ge 208; then - AC_ADD_INCLUDE($withval) - else - AC_MSG_ERROR(PCRE extension requires PCRE library version >= 2.08) - fi - else - AC_MSG_ERROR(Could not find pcre.h in $withval) - fi - - if test -f $withval/libpcre.a ; then - AC_ADD_LIBRARY_WITH_PATH(pcre, $withval) - else - AC_MSG_ERROR(Could not find libpcre.a in $withval) - fi - - AC_DEFINE(HAVE_PCRE, 1) - AC_MSG_RESULT(yes) - PHP_EXTENSION(pcre) - ;; - esac -],[ - EXTRA_LIBS="-L$abs_builddir/ext/pcre/pcrelib -lpcre $EXTRA_LIBS" - PCRE_SUBDIR="pcrelib" - AC_DEFINE(HAVE_BUNDLED_PCRE, 1) - AC_MSG_RESULT(yes) - PHP_EXTENSION(pcre) -]) -AC_SUBST(PCRE_SUBDIR) |