* src/toolbox/Makefile.am (libtoolbox_la_SOURCES): Added above file.
* src/native/vm/nativevm.cpp: Use new sequence builder class.
* src/native/vm/openjdk/hpi.cpp: Likewise.
* src/native/vm/gnuclasspath/gnu_classpath_VMSystemProperties.cpp: Likewise.
# include "native/include/gnu_classpath_VMSystemProperties.h"
#endif
+#include "toolbox/sequence.hpp"
+
#include "vm/exceptions.hpp"
#include "vm/properties.hpp"
#include "vm/vm.hpp"
java_handle_t *p;
#if defined(ENABLE_JRE_LAYOUT)
const char *java_home;
- char *path;
- s4 len;
#endif
p = (java_handle_t *) properties;
Properties::put(p, "gnu.classpath.home", java_home);
- len =
- strlen("file://") +
- strlen(java_home) +
- strlen("/lib") +
- strlen("0");
-
- path = MNEW(char, len);
-
- strcpy(path, "file://");
- strcat(path, java_home);
- strcat(path, "/lib");
+ // Use sequence builder to assemble value.
+ SequenceBuilder sb;
- Properties::put(p, "gnu.classpath.home.url", path);
+ sb.cat("file://");
+ sb.cat(java_home);
+ sb.cat("/lib");
- MFREE(path, char, len);
+ Properties::put(p, "gnu.classpath.home.url", sb.c_str());
#endif
}
# include "native/vm/openjdk/hpi.hpp"
+# include "toolbox/sequence.hpp"
+
# include "vm/globals.hpp"
# include "vm/properties.hpp"
# include "vm/utf8.h"
Properties& properties = vm->get_properties();
const char* boot_library_path = properties.get("sun.boot.library.path");
- size_t len =
- os::strlen(boot_library_path) +
- os::strlen("/libjava.so") +
- os::strlen("0");
-
- char* p = MNEW(char, len);
+ // Use sequence builder to assemble library path.
+ SequenceBuilder sb;
- os::strcpy(p, boot_library_path);
- os::strcat(p, "/libjava.so");
+ sb.cat(boot_library_path);
+ sb.cat("/libjava.so");
- utf* u = utf_new_char(p);
+ // XXX This should actually be sb.export_symbol()
+ utf* u = utf_new_char(sb.c_str());
NativeLibrary nl(u);
void* handle = nl.open();
if (handle == NULL)
- os::abort("nativevm_init: failed to open libjava.so at: %s", p);
-
- MFREE(p, char, len);
+ os::abort("nativevm_init: failed to open libjava.so at: %s", sb.c_str());
NativeLibraries& nls = vm->get_nativelibraries();
nls.add(nl);
#include "native/native.hpp"
+#include "toolbox/sequence.hpp"
+
#include "vm/options.h"
#include "vm/os.hpp"
#include "vm/properties.hpp"
Properties& properties = vm->get_properties();
const char* boot_library_path = properties.get("sun.boot.library.path");
- size_t len =
- os::strlen(boot_library_path) +
- os::strlen("/native_threads/libhpi.so") +
- os::strlen("0");
-
- char* p = MNEW(char, len);
+ // Use sequence builder to assemble library path.
+ SequenceBuilder sb;
- os::strcpy(p, boot_library_path);
- os::strcat(p, "/native_threads/libhpi.so");
+ sb.cat(boot_library_path);
+ sb.cat("/native_threads/libhpi.so");
- utf* u = utf_new_char(p);
+ // XXX This should actually be sb.export_symbol()
+ utf* u = utf_new_char(sb.c_str());
if (opt_TraceHPI)
- log_println("HPI::initialize: Loading HPI %s ", p);
-
- MFREE(p, char, len);
+ log_println("HPI::initialize: Loading HPI %s ", sb.c_str());
NativeLibrary nl(u);
void* handle = nl.open();
list.hpp \
logging.cpp \
logging.hpp \
+ sequence.hpp \
set.h \
set.c \
util.c \
--- /dev/null
+/* src/toolbox/sequence.hpp - sequence builder class header
+
+ Copyright (C) 2009
+ CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
+ Copyright (C) 2009 Theobroma Systems Ltd.
+
+ This file is part of CACAO.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2, or (at
+ your option) any later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301, USA.
+
+*/
+
+
+#ifndef _SEQUENCE_HPP
+#define _SEQUENCE_HPP
+
+#include "config.h"
+
+#include <string>
+
+
+/**
+ * This class is a mutable and dynamically growing character sequence.
+ * Its main purpose is to dynamically construct Strings or Symbols which
+ * both are immutable.
+ *
+ * The buffer backing up this class is automatically (re)allocated as the
+ * sequence grows, no additional length checks are required. Furthermore
+ * the buffer memory is released once the builder is destructed and it's
+ * content is destroyed. To preserve the content, it has to be exported
+ * with one of the exporting functions.
+ */
+class SequenceBuilder {
+private:
+ std::string _str;
+
+public:
+ // Constructor.
+ SequenceBuilder() {}
+
+ // Concatenation operations.
+ void cat(char ch) { _str.push_back(ch); }
+ void cat(char ch, int n) { _str.append(n, ch); }
+ void cat(const char* s) { _str.append(s); }
+
+ // Exporting functions.
+ //Object* export_string();
+ //Symbol* export_symbol();
+
+ // Be careful and see std::string::c_str() for details.
+ const char* c_str() const { return _str.c_str(); }
+};
+
+
+#endif // _SEQUENCE_HPP
+
+
+/*
+ * These are local overrides for various environment variables in Emacs.
+ * Please do not remove this and leave it at the end of the file, where
+ * Emacs will automagically detect them.
+ * ---------------------------------------------------------------------
+ * Local variables:
+ * mode: c++
+ * indent-tabs-mode: t
+ * c-basic-offset: 4
+ * tab-width: 4
+ * End:
+ * vim:noexpandtab:sw=4:ts=4:
+ */