-/* Copyright (C) 2001, 2009 Free Software Foundation, Inc.
+/* Copyright (C) 2001, 2009, 2010, 2011 Free Software Foundation, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
#include <string.h>
#include "_scm.h"
-#include "vm-bootstrap.h"
+#include "threads.h"
#include "instructions.h"
+
struct scm_instruction {
enum scm_opcode opcode; /* opcode */
const char *name; /* instruction name */
} while (0)
+static scm_i_pthread_mutex_t itable_lock = SCM_I_PTHREAD_MUTEX_INITIALIZER;
+
+
static struct scm_instruction*
fetch_instruction_table ()
{
static struct scm_instruction *table = NULL;
+ scm_i_pthread_mutex_lock (&itable_lock);
if (SCM_UNLIKELY (!table))
{
size_t bytes = SCM_VM_NUM_INSTRUCTIONS * sizeof(struct scm_instruction);
{
table[i].opcode = i;
if (table[i].name)
- table[i].symname =
- scm_permanent_object (scm_from_locale_symbol (table[i].name));
+ table[i].symname = scm_from_locale_symbol (table[i].name);
else
table[i].symname = SCM_BOOL_F;
}
}
+ scm_i_pthread_mutex_unlock (&itable_lock);
+
return table;
}
"")
#define FUNC_NAME s_scm_opcode_to_instruction
{
- int opcode;
+ scm_t_signed_bits opcode;
SCM ret = SCM_BOOL_F;
SCM_MAKE_VALIDATE (1, op, I_INUMP);
void
scm_bootstrap_instructions (void)
{
- scm_c_register_extension ("libguile", "scm_init_instructions",
+ scm_c_register_extension ("libguile-" SCM_EFFECTIVE_VERSION,
+ "scm_init_instructions",
(scm_t_extension_init_func)scm_init_instructions,
NULL);
}
void
scm_init_instructions (void)
{
- scm_bootstrap_vm ();
-
#ifndef SCM_MAGIC_SNARFER
#include "libguile/instructions.x"
#endif