File: STEngine.m

package info (click to toggle)
steptalk 0.10.0%2Bgit20200629-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,732 kB
  • sloc: objc: 12,182; yacc: 400; makefile: 40; sh: 34; csh: 4; awk: 3; lisp: 3
file content (126 lines) | stat: -rw-r--r-- 3,381 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
/**
    STEngine.m
    Scripting engine
 
    Copyright (c) 2002 Free Software Foundation

    Written by: Stefan Urbanek <urbanek@host.sk>
    Date: 2000
   
    This file is part of the StepTalk project.
 
    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
    version 2 of the License, or (at your option) any later version.

    This library 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
    Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public
    License along with this library; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
 */

#import "STEngine.h"

#import "STEnvironment.h"
#import "STExterns.h"
#import "STFunctions.h"
#import "STLanguageManager.h"
#import "STMethod.h"
#import "STUndefinedObject.h"

#import <Foundation/NSDictionary.h>
#import <Foundation/NSException.h>
#import <Foundation/NSString.h>
#import <Foundation/NSZone.h>

NSZone *STMallocZone = (NSZone *)nil;

void _STInitMallocZone(void)
{
    if(!STMallocZone)
    {
        /* FIXME: do some testing whether there should be YES or NO */
        STMallocZone = NSCreateZone(NSPageSize(),NSPageSize(),YES);
    }
}

@implementation STEngine
+ (void)initialize
{
    _STInitMallocZone();

    if(!STNil)
    {
        STNil = (STUndefinedObject *)NSAllocateObject([STUndefinedObject class],
                                                      0, STMallocZone);
    }
}

/**
    Return a scripting engine for language with specified name. The engine
    is get from default language manager.
*/
+ (STEngine *) engineForLanguage:(NSString *)name
{
    STLanguageManager *manager = [STLanguageManager defaultManager];
    
    if(!name)
    {
        [NSException raise:@"STConversationException"
                     format:@"Unspecified language for a new engine."];
        return nil;
    }
    
    return [manager createEngineForLanguage:name];
}

+ (STEngine *) engineForLanguageWithName:(NSString *)name
{
    NSLog(@"%@ %@ is deprecated, use %@ instead",
            [self className], NSStringFromSelector(_cmd), @"engineForLanguage:");

    return [self engineForLanguage:name];
}

/** Interpret source code <var>code</var> in a context <var>context</var>. 
    This is the method, that has to be implemented by those who are writing 
    a language engine. 
    <override-subclass /> 
*/
- (id)interpretScript:(NSString *)script
            inContext:(STContext *)context
{
    [self subclassResponsibility:_cmd];

    return nil;
}

- (BOOL)understandsCode:(NSString *)code 
{
    [self subclassResponsibility:_cmd];

    return NO;
}

- (id <STMethod>)methodFromSource:(NSString *)sourceString
                      forReceiver:(id)receiver
                        inContext:(STContext *)env
{
    [self subclassResponsibility:_cmd];
    return nil;
}
- (id)  executeMethod:(id <STMethod>)aMethod
          forReceiver:(id)anObject
        withArguments:(NSArray *)args
            inContext:(STContext *)env
{
    [self subclassResponsibility:_cmd];
    return nil;
}
@end